Поширені 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

Загальні

Networking

Raw SocketsWinAPI 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

RegistryFileService
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 NameAssembly 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
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
CreateRemoteThreadDLL/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

  1. Знайти процес для ін'єкції шкідливої DLL: CreateToolhelp32Snapshot, Process32First, Process32Next
  2. Відкрити процес: GetModuleHandle, GetProcAddress, OpenProcess
  3. Записати шлях до DLL у процес: VirtualAllocEx, WriteProcessMemory
  4. Створити потік у процесі, який завантажить шкідливу 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

  1. Знайти цільовий потік: CreateToolhelp32Snapshot, Thread32First, Thread32Next
  2. Відкрити потік: OpenThread
  3. Призупинити потік: SuspendThread
  4. Записати шлях до шкідливої DLL у процес-жертву: VirtualAllocEx, WriteProcessMemory
  5. Відновити потік, щоб він завантажив бібліотеку: 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).

Типовий робочий процес:

  1. Запустити легітимний хост (наприклад RegAsm.exe, rundll32.exe, msbuild.exe) suspended, щоб жодні інструкції ще не виконувалися.
c
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);
  1. Зчитати шкідливий payload у пам'ять і розпарсити його PE headers, щоб отримати SizeOfImage, секції та новий EntryPoint.
  2. NtUnmapViewOfSection / ZwUnmapViewOfSection – відмапити оригінальну базу образу призупиненого процесу.
  3. VirtualAllocEx – зарезервувати RWX пам'ять розміру SizeOfImage у віддаленому процесі.
  4. WriteProcessMemory – спочатку скопіювати Headers, потім пройти по секціям і скопіювати їхні raw дані.
  5. SetThreadContext – запатчити значення EAX/RAX (RCX on x64) або Rip у структурі контексту так, щоб EIP вказував на EntryPoint payload-а.
  6. ResumeThread – потік продовжує виконання, виконуючи код, наданий атакуючим.

Мінімальний proof-of-concept (x86) скелет:

c
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 на початку.

Посилання

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