Common API used in Malware
Generic
Networking
Raw Sockets | WinAPI Sockets |
---|---|
socket() | WSAStratup() |
bind() | bind() |
listen() | listen() |
accept() | accept() |
connect() | connect() |
read()/recv() | recv() |
write() | send() |
shutdown() | WSACleanup() |
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] |
Stealth
Name | |
---|---|
VirtualAlloc | Alokacja pamięci (pakery) |
VirtualProtect | Zmiana uprawnień pamięci (pakery nadające uprawnienia do wykonania sekcji) |
ReadProcessMemory | Wstrzykiwanie do zewnętrznych procesów |
WriteProcessMemoryA/W | Wstrzykiwanie do zewnętrznych procesów |
NtWriteVirtualMemory | |
CreateRemoteThread | Wstrzykiwanie DLL/procesu... |
NtUnmapViewOfSection | |
QueueUserAPC | |
CreateProcessInternalA/W |
Execution
Function Name |
---|
CreateProcessA/W |
ShellExecute |
WinExec |
ResumeThread |
NtResumeThread |
Miscellaneous
GetAsyncKeyState() -- Rejestrowanie klawiszy
SetWindowsHookEx -- Rejestrowanie klawiszy
GetForeGroundWindow -- Uzyskanie nazwy działającego okna (lub strony internetowej z przeglądarki)
LoadLibrary() -- Importowanie biblioteki
GetProcAddress() -- Importowanie biblioteki
CreateToolhelp32Snapshot() -- Lista działających procesów
GetDC() -- Zrzut ekranu
BitBlt() -- Zrzut ekranu
InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- Dostęp do Internetu
FindResource(), LoadResource(), LockResource() -- Dostęp do zasobów wykonywalnych
Malware Techniques
DLL Injection
Wykonaj dowolny DLL w innym procesie
Zlokalizuj proces, do którego wstrzykniesz złośliwy DLL: CreateToolhelp32Snapshot, Process32First, Process32Next
Otwórz proces: GetModuleHandle, GetProcAddress, OpenProcess
Zapisz ścieżkę do DLL wewnątrz procesu: VirtualAllocEx, WriteProcessMemory
Utwórz wątek w procesie, który załaduje złośliwy DLL: CreateRemoteThread, LoadLibrary
Inne funkcje do użycia: NTCreateThreadEx, RtlCreateUserThread
Reflective DLL Injection
Załaduj złośliwy DLL bez wywoływania normalnych wywołań API Windows. DLL jest mapowany wewnątrz procesu, rozwiązuje adresy importu, naprawia relokacje i wywołuje funkcję DllMain.
Thread Hijacking
Znajdź wątek z procesu i spraw, aby załadował złośliwy DLL
Znajdź docelowy wątek: CreateToolhelp32Snapshot, Thread32First, Thread32Next
Otwórz wątek: OpenThread
Wstrzymaj wątek: SuspendThread
Zapisz ścieżkę do złośliwego DLL wewnątrz procesu ofiary: VirtualAllocEx, WriteProcessMemory
Wznów wątek ładujący bibliotekę: ResumeThread
PE Injection
Wstrzykiwanie Portable Execution: Wykonywalny kod zostanie zapisany w pamięci procesu ofiary i będzie wykonywany stamtąd.
Process Hollowing
Złośliwe oprogramowanie usunie legalny kod z pamięci procesu i załaduje złośliwy binarny
Utwórz nowy proces: CreateProcess
Usuń mapę pamięci: ZwUnmapViewOfSection, NtUnmapViewOfSection
Zapisz złośliwy binarny w pamięci procesu: VirtualAllocEc, WriteProcessMemory
Ustaw punkt wejścia i wykonaj: SetThreadContext, ResumeThread
Hooking
SSDT (System Service Descriptor Table) wskazuje na funkcje jądra (ntoskrnl.exe) lub sterownik GUI (win32k.sys), aby procesy użytkownika mogły wywoływać te funkcje.
Rootkit może modyfikować te wskaźniki do adresów, które kontroluje
IRP (I/O Request Packets) przesyłają fragmenty danych z jednego komponentu do drugiego. Prawie wszystko w jądrze używa IRP, a każdy obiekt urządzenia ma swoją własną tabelę funkcji, która może być podłączona: DKOM (Direct Kernel Object Manipulation)
IAT (Import Address Table) jest przydatna do rozwiązywania zależności. Możliwe jest podłączenie tej tabeli, aby przejąć kod, który będzie wywoływany.
EAT (Export Address Table) Hooki. Te hooki mogą być realizowane z userland. Celem jest podłączenie funkcji eksportowanych przez DLL.
Inline Hooks: Ten typ jest trudny do osiągnięcia. To wiąże się z modyfikowaniem kodu samych funkcji. Może poprzez umieszczenie skoku na początku tego.
Last updated