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

Generički

Umrežavanje

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

RegistarFajlServis
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 NameAssembly 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:

  • GetKeyboardLayout za nabrajanje instaliranih rasporeda (po thread-u/korisniku)
  • GetLocaleInfoA/W za dobijanje kodova zemlje/regiona
  • GetSystemDefaultLangID / 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_MoveFile
  • ThrdMgr_*: ThrdMgr_GetCurrentThreadHandle, ThrdMgr_SaveTEB, ThrdMgr_SwitchThreads

Tipični mehanizam odlaganja (user-land):

cmd
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=renderer da bi se imitirali Chromium child procesi). Ako switch nedostaje, loader izlazi odmah, otežavajući naivno pokretanje u sandbox-u.

Prikrivanje

Naziv
VirtualAllocAlloc memory (packers)
VirtualProtectChange memory permission (packer giving execution permission to a section)
ReadProcessMemoryInjection into external processes
WriteProcessMemoryA/WInjection into external processes
NtWriteVirtualMemory
CreateRemoteThreadDLL/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

  1. Locate the process to inject the malicious DLL: CreateToolhelp32Snapshot, Process32First, Process32Next
  2. Open the process: GetModuleHandle, GetProcAddress, OpenProcess
  3. Write the path to the DLL inside the process: VirtualAllocEx, WriteProcessMemory
  4. 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

  1. Find a target thread: CreateToolhelp32Snapshot, Thread32First, Thread32Next
  2. Open the thread: OpenThread
  3. Suspend the thread: SuspendThread
  4. Write the path to the malicious DLL inside the victim process: VirtualAllocEx, WriteProcessMemory
  5. 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:

  1. Spawn-uj benigni host (npr. RegAsm.exe, rundll32.exe, msbuild.exe) suspended tako da nijedna instrukcija još ne radi.
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. Učitaj maliciozni payload u memoriju i parsiraj njegove PE headere da dobiješ SizeOfImage, sekcije i novi EntryPoint.
  2. NtUnmapViewOfSection / ZwUnmapViewOfSection – unmap-uj originalni image base suspenedovanog procesa.
  3. VirtualAllocEx – rezerviši RWX memoriju veličine SizeOfImage unutar udaljenog procesa.
  4. WriteProcessMemory – prvo kopiraj Headers, zatim iteriraj kroz sekcije kopirajući njihov raw data.
  5. SetThreadContext – zakrpi vrednost EAX/RAX (RCX na x64) ili Rip u context strukturi tako da EIP pokazuje na payload-ov EntryPoint.
  6. ResumeThread – nit nastavlja, izvršavajući kod koji je obezbedio napadač.

Minimalan proof-of-concept (x86) skeleton:

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);
}

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_SUSPENDED koji 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 ➜ WriteProcessMemory izmeđ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.exe koji je spawn-ovan iz user-writable putanja ili bez odgovarajućeg .sln/.proj konteksta, a zatim ostvaruje outbound konekcije (ATT&CK T1127.001 + T1055.012).

Common host processes and path resolution

  • MSBuild.exe se č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.exe
  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
  • C:\Windows\System32\MSBuild.exe
  • C:\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

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