# Common API used in Malware {{#include ../banners/hacktricks-training.md}} ## 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 dowolną DLL w innym procesie 1. Zlokalizuj proces, do którego wstrzykniesz złośliwą DLL: CreateToolhelp32Snapshot, Process32First, Process32Next 2. Otwórz proces: GetModuleHandle, GetProcAddress, OpenProcess 3. Zapisz ścieżkę do DLL wewnątrz procesu: VirtualAllocEx, WriteProcessMemory 4. Utwórz wątek w procesie, który załaduje złośliwą DLL: CreateRemoteThread, LoadLibrary Inne funkcje do użycia: NTCreateThreadEx, RtlCreateUserThread ### Reflective DLL Injection Załaduj złośliwą DLL bez wywoływania normalnych wywołań API systemu Windows.\ DLL jest mapowana 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śliwą DLL 1. Znajdź docelowy wątek: CreateToolhelp32Snapshot, Thread32First, Thread32Next 2. Otwórz wątek: OpenThread 3. Wstrzymaj wątek: SuspendThread 4. Zapisz ścieżkę do złośliwej DLL wewnątrz procesu ofiary: VirtualAllocEx, WriteProcessMemory 5. Wznów wątek ładujący bibliotekę: ResumeThread ### PE Injection Wstrzykiwanie Portable Execution: Wykonywalny plik 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 plik binarny 1. Utwórz nowy proces: CreateProcess 2. Usuń mapę pamięci: ZwUnmapViewOfSection, NtUnmapViewOfSection 3. Zapisz złośliwy plik binarny w pamięci procesu: VirtualAllocEc, WriteProcessMemory 4. 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 eksportowanych funkcji 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. {{#include ../banners/hacktricks-training.md}}