Финальный ответ модели
I now have code-confirmed evidence for every major module. I have enough to write the complete report.
---
Файл — 64-битный Windows PE (AMD64), собранный на Rust (MinGW-w64 CRT). Это полнофункциональный инфостилер / RAT с HTTP-C2, beacon-циклом, TLV-протоколом команд и набором модулей: кража cookie браузеров, токенов Discord/Telegram, криптовалютных кошельков, кейлоггер, буфер обмена, скриншоты, веб-камера, микрофон, реестр, сервисы, сеть, перечисление/инъекция процессов, BOF/PE-инъекция, рантайм-рансом (удаление теневых копий), персистентность в реестре, TTS-«развлечение», SOCKS5.
| Параметр | Значение |
|---|---|
| Image base | 0x140000000 |
| Точка входа (OEP) | start @ 0x140045A50 |
| Функций / строк / сегментов | 1278 / 806 / 8 |
.text | 0x140001000–0x14006C000 |
.idata | 0x14008E628–0x14008EDF8 |
TLS-колбэки (loader boilerplate, порядок: TlsCallback_0 → TlsCallback_1 → TlsCallback_2 → OEP):
TlsCallback_0 @ 0x140024610 — Rust std::sys::thread_local guard (_RNvNtNtNtNtCs1NhsA7xdTVp_3std3sys12thread_local5guard7windows12tls_callback);TlsCallback_1 @ 0x140045AE0 (118 B), TlsCallback_2 @ 0x140045B70 (22 B).Цепочка подтверждена по коду:
start @ 0x140045A50 → __mingw_CRTStartup @ 0x140045830 (вызов user main @ 0x1400459F8) → sub_1400136B0 (Rust main wrapper) → sub_140002040(sub_140002644) → sub_140001000 @ 0x140001000 (2223 B) — основной beacon-цикл.
C2-конфигурация зашита в коде (подтверждено по .rdata и коду sub_1400122FE):
| Элемент | Значение | Адрес |
|---|---|---|
| Хост | 127.0.0.1 (len 9) | 0x14007DAF0 |
| Порт | 8443 (0x20FB) | рядом с хостом |
| Базовый путь | /api/rat/ | 0x140080EE0 |
| Команды | /commands | 0x140080EE0 |
| Регистрация | /api/rat/register?id= | фрагмент 0x140080F8C |
| User-Agent | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 | 0x14007F000 |
| Таймауты | WinHttpSetTimeouts(10000,10000,30000,30000) | sub_1400122FE |
| Отладка | RAT starting. C2= | в строках |
Транспорт — WinHTTP (WinHttpOpen/WinHttpConnect/WinHttpOpenRequest/WinHttpSendRequest/WinHttpReceiveResponse/WinHttpReadData). Инициализация — sub_1400122FE @ 0x1400122FE; POST-хелпер — sub_140012584 @ 0x140012584; UTF-8→UTF-16 — sub_14000223A.
> ⚠️ Хост 127.0.0.1 — loopback. Это либо dev/test-сборка, либо хост переопределяется во время работы (в sub_1400122FE загрузка конфига из файла не найдена). Реальный C2 в боевой сборке будет другим.
sub_140001000:
sub_1400122FE).Sleep(5000<<n), кап 60000 мс).GET /commands (ответ ≤ 0x10000 = 64 КБ), разбор TLV-потока: 4B длина + 4B тип + payload, обработка через sub_140003CA0.0x46) обновляет интервал (dword_140096004); бит 0 флага → ExitProcess(0); сон 1000*dword_140096000 с джиттером ±10% (GetTickCount64).Диспетчер команд — sub_140003CA0 @ 0x140003CA0 (35 822 B, конец 0x14000C88E), монолитный (Rust встраивает все обработчики). В прологе подтверждена проверка диапазона ID:
inc esi ; esi = a1 = command_id
cmp esi, 0x6F
ja default ; command_id >= 0x6F → "Unknown command"
т.е. валидные ID команд — 0x00..0x6E (0..110), далее — Unknown command (строка @ 0x14007EEE0, код @ 0x14000729B). Дальше — диспетчеризация по таблице указателей.
sub_1400128AB @ 0x1400128AB:
GetComputerNameA, GetUserNameA, проверка ОС).sub_1400028A9): FNV-1a (seed 0x811C9DC5, prime 0x01000193) от имени компьютера XOR GetTickCount64(); при нуле — 0x1234567890ABCDEF. Хранится в xmmword_14009EA08/14009EA18.POST /api/rat/register?id=<id> с телом 322 байта (0x142) через sub_140012584.u32 интервал (≤3600 → dword_140096004) + u32 джиттер (≤100 → dword_140096000).Структура проекта (из строк-путей в .rdata): src/main.rs, src/transport/beacon.rs, src/engine/{commands,exec,fs,ps}.rs, src/modules/{stealer,ransomware,screenshot,clipboard,registry,services,network,clipper,persist,keylog,postex,socks5,webcam,fun}.rs, src/util/{sysinfo,string,crypto,sqlite}.rs.
| Модуль | Доказательства (адреса) | |
|---|---|---|
| Stealer / cookie | sub_14000F9D1 (вызов из диспетчера @ 0x140003D4C): chrome.exe @ 0x140080116, msedge.exe @ 0x1400801F8, firefox.exe; [Chrome] Not running.\n[Chrome] Decrypting cookies...\n @ 0x140080120, Cannot decrypt master key.\n @ 0x1400801DD, [Firefox] Reading cookies (plaintext)... @ 0x14008029A. Chrome/Edge: Local State → DPAPI → AES; Firefox: FindFirstFileA/FindNextFileA по cookies.sqlite (plaintext). | |
| Крипто cookie | sub_140010CBA @ 0x140010CBA: BCryptOpenAlgorithmProvider(L"AES"), BCryptSetProperty(L"ChainingMode","C") (CBC), BCryptGenerateSymmetricKey (16B IV), BCryptDecrypt; версии v10/v20 (константы 0x303176/0x303276); No cookies could be decrypted.\n @ 0x140080480. DPAPI-хелпер sub_140002E2A: CryptUnprotectData (без энтропии). | |
| Discord / Telegram | discord.exe @ 0x14007FFE3, .ldb.log @ 0x140080080, Discord LevelDB not found.\n @ 0x14008004B, === Discord === @ 0x14007FFEE, telegram.exe @ 0x1400054D9, Telegram tdata not found.\n=== Telegram === @ 0x140080376, No tokens found.\n @ 0x1400800BD. | |
| Кошельки | bitcoin_wallet @ 0x14008060C, No wallets found.\n @ 0x140080677. | |
| Кейлоггер | Поток StartAddress @ 0x14000D893: SetWindowsHookExA(13 /WH_KEYBOARD_LL/, fn, GetModuleHandleA(NULL), 0) + цикл GetMessageA/TranslateMessage/DispatchMessageA. Колбэк fn @ 0x14000D941: ToUnicodeEx, GetForegroundWindow+GetWindowTextA (заголовок окна), буфер byte_14006DAF0 (64 КБ, инд. qword_14009EAD0), спец-клавиши: 0x08 (Backspace) @ 0x14007F100, 0x09 (Tab) @ 0x14007F101, [ESC] @ 0x14007F102, Enter/Space; GetAsyncKeyState(16) (Shift). | |
| Буфер обмена | GetClipboardData @ 0x140006269 (текст) и 0x140006805 (изображение); Error: no text in clipboard @ 0x140080C60, Error: no image in clipboard @ 0x14007F908, Error: cannot open clipboard @ 0x14007F870. | |
| Скриншот | GDI+ (GdipCreateBitmapFromHBITMAP, GdipSaveImageToStream → PNG); Error: invalid bitmap @ 0x14007F8C0. | |
| Веб-камера | capCreateCaptureWindowA @ 0x14000679B; Webcam @ 0x14007F7F3, Error: no webcam found @ 0x14007F828, Error: cannot create capture window @ 0x14007F958. | |
| Микрофон | WINMM waveInOpen @ 0x14000ABAC (+ waveIn*). | |
| Реестр | RegSetValueExA @ 0x140009F66/0x14000BFE2, RegOpenKeyExA ×9, RegDeleteValueA ×4, RegDeleteKeyA ×2; дамп: [Subkeys]\n @ 0x140080788, \n[Values]\n @ 0x1400807B7, (Default) @ 0x1400807E0, BINARY/DWORD/EXPAND_SZ/MULTI_SZ @ 0x1400807F4..; registry @ 0x14007E8E8; Error: need path\valuename @ 0x1400808B8. | |
| Сервисы | EnumServicesStatusExA @ 0x140006D08/0x140006D88; RunningStoppedOther @ 0x140080B50. | |
| Сеть | GetExtendedTcpTable @ 0x140005ABE/0x140005B05; заголовок PROTO LOCAL ADDRESS... @ 0x140005B4A. | |
| Процессы / инъекция | CreateProcessA @ 0x14000A19A, 0x14000C82E; OpenProcess ×2; NAME STATE PID DISPLAY @ 0x140006DC8, Error: invalid PID @ 0x140006E2F, system_stop @ 0x14007E780. Инъекция-хелпер sub_14000DD36 @ 0x14000DD36: OpenProcess(0x1F0FFF, 0, pid) (полные права), `VirtualAllocEx(..., MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE), WriteProcessMemory, CreateRemoteThread`. |
| BOF-инъекция | Error: only x64 BOF supported @ 0x14007F690, Error: no 'go' entry point in BOF @ 0x14007F548, Error: invalid COFF sections @ 0x14007F5E8, Error: COFF too small @ 0x14007F6E0. | |
| PE-инъекция | Error: only x64 PE supported @ 0x14007F358, Error: invalid PE signature @ 0x14007F3A8, Error: invalid PE header @ 0x14007F3F8, Error: not a PE file @ 0x14007F448, Error: PE too small @ 0x14007F490, Error: VirtualAlloc failed @ 0x14007F308. | |
| Рансом | vssadmin delete shadows /all /quiet @ 0x14007F7D0 (удаление теневых копий); src/modules/ransomware.rs. | |
| Персистентность | sub_14000F550 @ 0x14000F550: RegCreateKeyExA(HKCU /0x80000001/, "Software\\RATConfig", ..., KEY_WRITE) + RegSetValueExA(hKey, "persist_name", 0, REG_SZ, name, len) (имя ≤ 63 симв.). Плюс Software\Microsoft\Windows\CurrentVersion\Run @ 0x14007FD88 (автозагрузка). | |
| TTS «fun» | PowerShell @ 0x14007F016: powershell -Command "Add-Type -AssemblyName System.Speech; $s = New-Object System.Speech.Synthesis.SpeechSynthesizer; $s.Speak(' + msg + ')"; CreateProcessA @ 0x14000C82E. | |
| SOCKS5 | WS2_32 (socket/bind/listen/accept/connect/send/recv); src/modules/socks5.rs. | |
| Файлы / exec / sysinfo | Error: need src and dst @ 0x14007E4E0, Error: need path and data @ 0x14007E648; === System Info ===\n @ 0x1400050B0, x64x86ARMARM64Unknown @ 0x1400052B3. |
HKCU\Software\Microsoft\Windows\CurrentVersion\Run (строка @ 0x14007FD88).HKCU\Software\RATConfig, значение persist_name (REG_SZ, ≤ 63 симв.) — sub_14000F550 (RegCreateKeyExA @ 0x14000F609, RegSetValueExA @ 0x14000F663).CryptUnprotectData (без энтропии, sub_140002E2A) для master-key Chrome/Edge.BCryptOpenAlgorithmProvider(L"AES"), ChainingMode=C, 16B IV, BCryptDecrypt), версии cookie v10/v20.0x811C9DC5, prime 0x01000193) — генерация agent ID.127.0.0.1, порт 8443; пути /api/rat/, /commands, /api/rat/register?id=; UA Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36.HKCU\Software\Microsoft\Windows\CurrentVersion\Run, HKCU\Software\RATConfig (значение persist_name).chrome.exe, msedge.exe, firefox.exe, discord.exe, telegram.exe; .ldb.log, cookies.sqlite, Local State, tdata, bitcoin_wallet.vssadmin delete shadows /all /quiet; powershell -Command "Add-Type -AssemblyName System.Speech; ...SpeechSynthesizer; ...Speak(...)".RAT starting. C2=, === Discord ===, === Telegram ===, === System Info ===, No cookies could be decrypted., Cannot decrypt master key., Unknown command.src/modules/.rs, src/transport/beacon.rs, src/util/.rs, src/main.rs.127.0.0.1 — loopback; вероятно dev/test-сборка или рантайм-переопределение (загрузка конфига не найдена). Боевой адрес в этой сборке отсутствует.sub_140003CA0 (35 КБ) — монолитный; полная декомпиляция недоступна (oversized lift). Подтверждены: диапазон ID 0x00..0x6E, Unknown command, и все обработчики по строкам/вызовам API. Точное числовое соответствие каждого ID конкретному модулю не восстановлено полностью.(ptr,len) в .rdata (прямых code-xref нет), поэтому связь «строка → код» выстроена через from_addr и api_callsites.Если нужно, могу: (а) восстановить точную таблицу «ID команды → модуль» по таблице указателей в прологе диспетчера; (б) детализировать конкретный модуль (например, рансом или SOCKS5); (в) выгрузить список всех импортов по DLL.