Поширені API, що використовуються в Malware
Reading time: 8 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Загальні
Networking
Raw Sockets | WinAPI Sockets |
---|---|
socket() | WSAStratup() |
bind() | bind() |
listen() | listen() |
accept() | accept() |
connect() | connect() |
read()/recv() | recv() |
write() | send() |
shutdown() | WSACleanup() |
TLS pinning and chunked transport
Багато loaders обгортають свій TCP-потік у SslStream
і pin the server’s leaf certificate against an embedded copy (certificate pinning). Bot info/tasks стискаються (наприклад, GZip). Якщо відповіді перевищують поріг (~1 MB), дані фрагментуються на невеликі шматки (наприклад, сегменти по 16 KB), щоб уникнути heuristics, що базуються на розмірі, і зменшити стрибки використання пам'яті під час десеріалізації.
Persistence
Registry | File | Service |
---|---|---|
RegCreateKeyEx() | GetTempPath() | OpenSCManager |
RegOpenKeyEx() | CopyFile() | CreateService() |
RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
RegDeleteKeyEx() | WriteFile() | |
RegGetValue() | ReadFile() |
Encryption
Name |
---|
WinCrypt |
CryptAcquireContext() |
CryptGenKey() |
CryptDeriveKey() |
CryptDecrypt() |
CryptReleaseContext() |
Anti-Analysis/VM
Function Name | Assembly Instructions |
---|---|
IsDebuggerPresent() | CPUID() |
GetSystemInfo() | IN() |
GlobalMemoryStatusEx() | |
GetVersion() | |
CreateToolhelp32Snapshot [Check if a process is running] | |
CreateFileW/A [Check if a file exist] |
Locale/keyboard-based execution guard
Багато stealers/loaders припиняють роботу при певних локалях, щоб уникнути дослідників і відповідати обмеженням threat-actor'ів. Типові перевірки:
GetKeyboardLayout
для перерахунку встановлених розкладок (на потік/користувача)GetLocaleInfoA/W
для визначення кодів країни/регіонуGetSystemDefaultLangID
/GetUserDefaultLangID
Якщо будь-який результат співпадає з чорним списком (зазвичай країни СНД), loader негайно виходить до мережевих IOC або інжекцій.
Захист/пошук загроз
- Позначати процеси, які на ранніх етапах виконання послідовно викликають кілька API для локалі/клавіатури і потім виходять без помітної активності.
- Корелювати з anti-VM перевірками (рядки BIOS, PnP-пристрої, модель диска, служби), запозиченими з open-source проєктів (наприклад, VMDetector), щоб виявляти gated execution.
Emulator API fingerprinting & sleep evasion
Malware часто робить fingerprinting sandbox емулаторів, шукаючи віртуалізовані експорти Defender’а (спостерігалось у Malware Protection Emulator). Якщо будь-який із цих символів присутній (сканування процесу нечутливе до регістру), виконання затримується на 10–30 хвилин і перевіряється повторно, щоб витратити час на аналіз.
Приклади імен API, що використовуються як canaries:
MpVmp32Entry
,MpVmp32FastEnter
,MpCallPreEntryPointCode
,MpCallPostEntryPointCode
,MpFinalize
,MpReportEvent*
,MpSwitchToNextThread*
VFS_*
family:VFS_Open
,VFS_Read
,VFS_MapViewOfFile
,VFS_UnmapViewOfFile
,VFS_FindFirstFile/FindNextFile
,VFS_CopyFile
,VFS_DeleteFile
,VFS_MoveFile
ThrdMgr_*
:ThrdMgr_GetCurrentThreadHandle
,ThrdMgr_SaveTEB
,ThrdMgr_SwitchThreads
Типовий примітив затримки (user-land):
cmd /c timeout /t %RANDOM_IN_[600,1800]% > nul
Аргументна перевірка
- Operators іноді вимагають наявності нешкідливого на вигляд CLI switch перед запуском payload (наприклад,
/i:--type=renderer
, щоб імітувати Chromium child processes). Якщо switch відсутній, loader негайно виходить, ускладнюючи naїve виконання в sandbox.
Прихованість
Назва | |
---|---|
VirtualAlloc | Виділення пам'яті (packers) |
VirtualProtect | Зміна прав доступу пам'яті (packer дає виконувальні дозволи секції) |
ReadProcessMemory | Ін'єкція в зовнішні процеси |
WriteProcessMemoryA/W | Ін'єкція в зовнішні процеси |
NtWriteVirtualMemory | |
CreateRemoteThread | DLL/Process injection... |
NtUnmapViewOfSection | |
QueueUserAPC | |
CreateProcessInternalA/W |
Виконання
Ім'я функції |
---|
CreateProcessA/W |
ShellExecute |
WinExec |
ResumeThread |
NtResumeThread |
Різне
- GetAsyncKeyState() -- логування натискань клавіш
- SetWindowsHookEx -- логування натискань клавіш
- GetForeGroundWindow -- Отримати назву активного вікна (або вебсайт з браузера)
- LoadLibrary() -- Імпорт бібліотеки
- GetProcAddress() -- Імпорт бібліотеки
- CreateToolhelp32Snapshot() -- Перелік запущених процесів
- GetDC() -- Знімок екрана
- BitBlt() -- Знімок екрана
- InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- Доступ до Інтернету
- FindResource(), LoadResource(), LockResource() -- Доступ до ресурсів виконуваного файлу
Техніки шкідливого ПЗ
DLL Injection
Execute an arbitrary DLL inside another process
- Знайти процес для ін'єкції шкідливої DLL: CreateToolhelp32Snapshot, Process32First, Process32Next
- Відкрити процес: GetModuleHandle, GetProcAddress, OpenProcess
- Записати шлях до DLL у процес: VirtualAllocEx, WriteProcessMemory
- Створити потік у процесі, який завантажить шкідливу DLL: CreateRemoteThread, LoadLibrary
Інші функції для використання: NTCreateThreadEx, RtlCreateUserThread
Reflective DLL Injection
Load a malicious DLL without calling normal Windows API calls.
The DLL is mapped inside a process, it will resolve the import addresses, fix the relocations and call the DllMain function.
Thread Hijacking
Find a thread from a process and make it load a malicious DLL
- Знайти цільовий потік: CreateToolhelp32Snapshot, Thread32First, Thread32Next
- Відкрити потік: OpenThread
- Призупинити потік: SuspendThread
- Записати шлях до шкідливої DLL у процес-жертву: VirtualAllocEx, WriteProcessMemory
- Відновити потік, щоб він завантажив бібліотеку: ResumeThread
PE Injection
Portable Execution Injection: Виконуваний файл буде записаний у пам'ять процесу-жертви і виконуватиметься звідти.
Process Hollowing (a.k.a RunPE)
Process Hollowing
is one of the favourite defence-evasion / execution tricks used by Windows malware. The idea is to launch a legitimate process in the suspended state, remove (hollow) its original image from memory and copy an arbitrary PE in its place. When the primary thread is finally resumed the malicious entry-point executes under the guise of a trusted binary (often signed by Microsoft).
Типовий робочий процес:
- Запустити легітимний хост (наприклад
RegAsm.exe
,rundll32.exe
,msbuild.exe
) suspended, щоб жодні інструкції ще не виконувалися.
STARTUPINFOA si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcessA("C:\\Windows\\Microsoft.NET\\Framework32\\v4.0.30319\\RegAsm.exe",
NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
- Зчитати шкідливий payload у пам'ять і розпарсити його PE headers, щоб отримати
SizeOfImage
, секції та новийEntryPoint
. - NtUnmapViewOfSection / ZwUnmapViewOfSection – відмапити оригінальну базу образу призупиненого процесу.
- VirtualAllocEx – зарезервувати RWX пам'ять розміру
SizeOfImage
у віддаленому процесі. - WriteProcessMemory – спочатку скопіювати
Headers
, потім пройти по секціям і скопіювати їхні raw дані. - SetThreadContext – запатчити значення
EAX/RAX
(RCX
on x64) абоRip
у структурі контексту так, щобEIP
вказував наEntryPoint
payload-а. - ResumeThread – потік продовжує виконання, виконуючи код, наданий атакуючим.
Мінімальний proof-of-concept (x86) скелет:
void RunPE(LPCSTR host, LPVOID payload, DWORD payloadSize){
// 1. create suspended process
STARTUPINFOA si = {sizeof(si)}; PROCESS_INFORMATION pi;
CreateProcessA(host, NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
// 2. read remote PEB to get ImageBaseAddress
CONTEXT ctx; ctx.ContextFlags = CONTEXT_FULL;
GetThreadContext(pi.hThread,&ctx);
PVOID baseAddr;
ReadProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);
// 3. unmap original image & allocate new region at same base
NtUnmapViewOfSection(pi.hProcess,baseAddr);
PVOID newBase = VirtualAllocEx(pi.hProcess,baseAddr,pHdr->OptionalHeader.SizeOfImage,
MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
// 4-5. copy headers & sections …
// 6. write new image base into PEB and set Eip
WriteProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);
ctx.Eax = (DWORD)(newBase) + pHdr->OptionalHeader.AddressOfEntryPoint;
SetThreadContext(pi.hThread,&ctx);
// 7. run!
ResumeThread(pi.hThread);
}
Практичні нотатки, виявлені в кампанії DarkCloud Stealer:
- The loader обрав
RegAsm.exe
(частина .NET Framework) як хост — підписаний бінарний файл, який навряд чи приверне увагу. - Розшифрований VB6 stealer (
holographies.exe
) не зкидається на диск; він існує лише всередині hollowed process, що ускладнює статичне виявлення. - Чутливі рядки (regexes, шляхи, Telegram credentials) RC4-encrypted по одному і розшифровуються лише під час виконання, що ускладнює memory scanning.
Ідеї для виявлення:
- Сигналізувати про процеси з
CREATE_SUSPENDED
, які ніколи не створюють GUI/console windows перед тим, як пам'ятна область буде виділена як RWX (рідко для легітимного коду). - Шукати послідовність викликів
NtUnmapViewOfSection ➜ VirtualAllocEx ➜ WriteProcessMemory
між різними процесами. - Незвичне використання довірених утиліт розробника як hollowing hosts, особливо
MSBuild.exe
,RegAsm.exe
,rundll32.exe
, коли вони є дочірніми процесами short-lived loaders. - Шукати
msbuild.exe
, запущений з user-writable шляхів або без відповідного.sln/.proj
контексту, який потім встановлює outbound connections (ATT&CK T1127.001 + T1055.012).
Common host processes and path resolution
MSBuild.exe
часто обирають як hollowing host, щоб зливатися з developer tooling. Loaders часто шукають архітектурно-адекватні місця:C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
C:\Windows\System32\MSBuild.exe
C:\Windows\SysWOW64\MSBuild.exe
- Вибирайте хост, що відповідає архітектурі поточного payload/OS перед викликом
CreateProcess(..., CREATE_SUSPENDED, ...)
.
Hooking
- The SSDT (System Service Descriptor Table) вказує на kernel functions (ntoskrnl.exe) або GUI driver (win32k.sys), щоб user processes могли викликати ці функції.
- Rootkit може змінити ці вказівники на адреси, які він контролює.
- IRP (I/O Request Packets) передають шматки даних від одного компонента до іншого. Майже все в ядрі використовує IRP, і кожен device object має власну таблицю функцій, яку можна hook-нути: DKOM (Direct Kernel Object Manipulation)
- The IAT (Import Address Table) корисна для розв'язання залежностей. Можливо hook-нути цю таблицю, щоб перехопити код, який буде викликаний.
- EAT (Export Address Table) Hooks. Ці hooks можна виконати з userland. Мета — hook-нути експортовані функції DLL.
- Inline Hooks: Цей тип складно реалізувати. Це включає модифікацію коду самої функції, наприклад вставлення jump на початку.
Посилання
- Unit42 – New Infection Chain and ConfuserEx-Based Obfuscation for DarkCloud Stealer
- Check Point Research – Under the Pure Curtain: From RAT to Builder to Coder
- Unit 42 – PhantomVAI Loader Delivers a Range of Infostealers
- MITRE ATT&CK – Trusted Developer Utilities Proxy Execution: MSBuild (T1127.001)
- VMDetector – virtualization checks (open-source)
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.