Common API used in Malware

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Generico

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

Molti loader avvolgono il loro stream TCP in SslStream e pinzano il certificato leaf del server contro una copia embedded (certificate pinning). Le info/attività dei bot sono compresse (es. GZip). Quando le risposte superano una soglia (~1 MB), i dati vengono frammentati in piccoli chunk (es. segmenti da 16 KB) per evitare heuristics basate sulla dimensione e ridurre i picchi di memoria durante la deserializzazione.

Persistence

RegistroFileServizio
RegCreateKeyEx()GetTempPath()OpenSCManager
RegOpenKeyEx()CopyFile()CreateService()
RegSetValueEx()CreateFile()StartServiceCtrlDispatcher()
RegDeleteKeyEx()WriteFile()
RegGetValue()ReadFile()

Encryption

Nome
WinCrypt
CryptAcquireContext()
CryptGenKey()
CryptDeriveKey()
CryptDecrypt()
CryptReleaseContext()

Anti-Analysis/VM

Nome funzioneIstruzioni Assembly
IsDebuggerPresent()CPUID()
GetSystemInfo()IN()
GlobalMemoryStatusEx()
GetVersion()
CreateToolhelp32Snapshot [Check if a process is running]
CreateFileW/A [Check if a file exist]

Controlli basati su locale/tastiera per l’esecuzione

Molti stealers/loader abortiscono su certe localizzazioni per eludere i ricercatori e rispettare vincoli dell’actor di minaccia. Controlli tipici:

  • GetKeyboardLayout per enumerare i layout installati (per thread/utente)
  • GetLocaleInfoA/W per risolvere codici paese/regione
  • GetSystemDefaultLangID / GetUserDefaultLangID

Se una corrispondenza appare in una lista bloccata (comunemente paesi CIS), il loader esce immediatamente prima che si vedano IOCs di rete o injection.

Difesa/hunting

  • Segnalare i processi che interrogano multiple API di locale/tastiera nelle prime fasi di esecuzione e poi escono senza attività osservabile.
  • Correlare con controlli anti-VM (stringhe BIOS, dispositivi PnP, modello disco, servizi) riutilizzati da progetti open-source (es. VMDetector) per intercettare esecuzioni gated.

Emulator API fingerprinting & sleep evasion

Il malware spesso fingerprinta gli emulatori sandbox cercando le esportazioni virtualizzate di Defender (osservate nel Malware Protection Emulator). Se uno di questi simboli è presente (scansione case-insensitive del processo), l’esecuzione viene ritardata di 10–30 minuti e ricontrollata per consumare tempo di analisi.

Esempi di nomi di API usati come canari:

  • MpVmp32Entry, MpVmp32FastEnter, MpCallPreEntryPointCode, MpCallPostEntryPointCode, MpFinalize, MpReportEvent*, MpSwitchToNextThread*
  • famiglia VFS_*: VFS_Open, VFS_Read, VFS_MapViewOfFile, VFS_UnmapViewOfFile, VFS_FindFirstFile/FindNextFile, VFS_CopyFile, VFS_DeleteFile, VFS_MoveFile
  • ThrdMgr_*: ThrdMgr_GetCurrentThreadHandle, ThrdMgr_SaveTEB, ThrdMgr_SwitchThreads

Primitiva tipica di delay (user-land):

cmd /c timeout /t %RANDOM_IN_[600,1800]% > nul

Controllo degli argomenti

  • Gli operatori a volte richiedono che sia presente uno switch CLI dall’aspetto innocuo prima di eseguire il payload (es., /i:--type=renderer per imitare i processi figli di Chromium). Se lo switch è assente, il loader termina immediatamente, ostacolando l’esecuzione ingenua in sandbox.

Stealth

Name
VirtualAllocAlloca memoria (packers)
VirtualProtectCambia i permessi di memoria (packer che concede permesso di esecuzione a una sezione)
ReadProcessMemoryIniezione in processi esterni
WriteProcessMemoryA/WIniezione in processi esterni
NtWriteVirtualMemory
CreateRemoteThreadDLL/Process injection…
NtUnmapViewOfSection
QueueUserAPC
CreateProcessInternalA/W

Execution

Function Name
CreateProcessA/W
ShellExecute
WinExec
ResumeThread
NtResumeThread

Miscellaneous

  • GetAsyncKeyState() – Registrazione tasti
  • SetWindowsHookEx – Registrazione tasti
  • GetForeGroundWindow – Ottiene il nome della finestra attiva (o il sito web da un browser)
  • LoadLibrary() – Carica una libreria
  • GetProcAddress() – Recupera l’indirizzo di una funzione
  • CreateToolhelp32Snapshot() – Elenca i processi in esecuzione
  • GetDC() – Cattura schermata
  • BitBlt() – Cattura schermata
  • InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() – Accesso a Internet
  • FindResource(), LoadResource(), LockResource() – Accesso alle risorse dell’eseguibile

Malware Techniques

DLL Injection

Execute an arbitrary DLL inside another process

  1. Individuare il processo in cui iniettare la DLL dannosa: CreateToolhelp32Snapshot, Process32First, Process32Next
  2. Aprire il processo: GetModuleHandle, GetProcAddress, OpenProcess
  3. Scrivere il percorso della DLL all’interno del processo: VirtualAllocEx, WriteProcessMemory
  4. Creare un thread nel processo che caricherà la DLL dannosa: 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: The executable will be written in the memory of the victim process and it will be executed from there.

Process Hollowing (a.k.a RunPE)

Process Hollowing è uno dei trucchi preferiti per evasione delle difese / esecuzione usati dal malware su Windows. L’idea è avviare un processo legittimo nello stato sospeso, rimuovere (hollow) la sua immagine originale dalla memoria e copiare al suo posto un arbitrary PE. Quando il thread principale viene infine ripreso, l’entry point maligno viene eseguito sotto le spoglie di un binario attendibile (spesso firmato da Microsoft).

Flusso tipico:

  1. Spawn a benign host (e.g. RegAsm.exe, rundll32.exe, msbuild.exe) suspended so that no instructions run yet.
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. Read the malicious payload into memory and parse its PE headers to obtain SizeOfImage, sections and the new EntryPoint.
  2. NtUnmapViewOfSection / ZwUnmapViewOfSection – rimuovere la mappatura dell’immagine originale della base del processo sospeso.
  3. VirtualAllocEx – riservare memoria RWX di SizeOfImage all’interno del processo remoto.
  4. WriteProcessMemory – copiare prima gli Headers, poi iterare sulle sezioni copiando i loro dati grezzi.
  5. SetThreadContext – patchare il valore di EAX/RAX (RCX on x64) o Rip nella struttura di contesto in modo che EIP punti all’EntryPoint del payload.
  6. ResumeThread – il thread continua, eseguendo il codice fornito dall’attaccante.

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

Note pratiche osservate nella campagna DarkCloud Stealer:

  • Il loader ha scelto RegAsm.exe (parte del .NET Framework) come host – un binario firmato poco probabile che attiri attenzione.
  • Lo stealer VB6 decriptato (holographies.exe) non viene scritto su disco; esiste solo all’interno del processo hollowed, rendendo più difficile la rilevazione statica.
  • Le stringhe sensibili (regexes, paths, credenziali Telegram) sono RC4-encrypted per stringa e vengono decriptate solo a runtime, complicando ulteriormente la scansione della memoria.

Idee per il rilevamento:

  • Segnalare i processi creati con CREATE_SUSPENDED che non creano mai finestre GUI/console prima che una regione di memoria venga allocata come RWX (raro per codice benigno).
  • Cercare la sequenza di chiamate NtUnmapViewOfSection ➜ VirtualAllocEx ➜ WriteProcessMemory tra processi diversi.
  • Usi insoliti di utility di sviluppo fidate come host per hollowing, in particolare MSBuild.exe, RegAsm.exe, rundll32.exe, con genitore rappresentato da loader di breve durata.
  • Cercare msbuild.exe lanciato da percorsi scrivibili dall’utente o senza il corrispondente contesto .sln/.proj che poi effettua connessioni outbound (ATT&CK T1127.001 + T1055.012).

Common host processes and path resolution

  • MSBuild.exe viene frequentemente scelto come host per hollowing per mimetizzarsi con gli strumenti di sviluppo. I loader spesso cercano nelle posizioni appropriate per l’architettura:
  • 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
  • Selezionare l’host corrispondente all’architettura corrente del payload/OS prima di chiamare CreateProcess(..., CREATE_SUSPENDED, ...).

Hooking

  • The SSDT (System Service Descriptor Table) points to kernel functions (ntoskrnl.exe) or GUI driver (win32k.sys) so user processes can call these functions.
  • Un rootkit può modificare questi puntatori verso indirizzi che controlla
  • IRP (I/O Request Packets) trasmettono pezzi di dati da un componente all’altro. Quasi tutto nel kernel usa IRP e ogni device object ha la propria tabella di funzioni che può essere manipolata: DKOM (Direct Kernel Object Manipulation)
  • The IAT (Import Address Table) is useful to resolve dependencies. It’s possible to hook this table in order to hijack the code that will be called.
  • EAT (Export Address Table) Hooks. This hooks can be done from userland. The goal is to hook exported functions by DLLs.
  • Inline Hooks: This type are difficult to achieve. This involve modifying the code of the functions itself. Maybe by putting a jump at the beginning of this.

References

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks