10 KiB
Malware'da Kullanılan Yaygın API
{{#include ../banners/hacktricks-training.md}}
Genel
Ağ
| Ham Soketler | WinAPI Soketleri |
|---|---|
| socket() | WSAStratup() |
| bind() | bind() |
| listen() | listen() |
| accept() | accept() |
| connect() | connect() |
| read()/recv() | recv() |
| write() | send() |
| shutdown() | WSACleanup() |
Süreklilik
| Kayıt | Dosya | Hizmet |
|---|---|---|
| RegCreateKeyEx() | GetTempPath() | OpenSCManager |
| RegOpenKeyEx() | CopyFile() | CreateService() |
| RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
| RegDeleteKeyEx() | WriteFile() | |
| RegGetValue() | ReadFile() |
Şifreleme
| İsim |
|---|
| WinCrypt |
| CryptAcquireContext() |
| CryptGenKey() |
| CryptDeriveKey() |
| CryptDecrypt() |
| CryptReleaseContext() |
Analiz/VM Karşıtı
| Fonksiyon Adı | Assembly Talimatları |
|---|---|
| IsDebuggerPresent() | CPUID() |
| GetSystemInfo() | IN() |
| GlobalMemoryStatusEx() | |
| GetVersion() | |
| CreateToolhelp32Snapshot [Bir sürecin çalışıp çalışmadığını kontrol et] | |
| CreateFileW/A [Bir dosyanın var olup olmadığını kontrol et] |
Gizlilik
| İsim | |
|---|---|
| VirtualAlloc | Bellek ayırma (paketleyiciler) |
| VirtualProtect | Bellek iznini değiştirme (paketleyici bir bölüme yürütme izni verme) |
| ReadProcessMemory | Dış süreçlere enjekte etme |
| WriteProcessMemoryA/W | Dış süreçlere enjekte etme |
| NtWriteVirtualMemory | |
| CreateRemoteThread | DLL/Süreç enjekte etme... |
| NtUnmapViewOfSection | |
| QueueUserAPC | |
| CreateProcessInternalA/W |
Yürütme
| Fonksiyon Adı |
|---|
| CreateProcessA/W |
| ShellExecute |
| WinExec |
| ResumeThread |
| NtResumeThread |
Çeşitli
- GetAsyncKeyState() -- Tuş kaydı
- SetWindowsHookEx -- Tuş kaydı
- GetForeGroundWindow -- Çalışan pencere adını al (veya bir tarayıcıdan web sitesini)
- LoadLibrary() -- Kütüphane içe aktarma
- GetProcAddress() -- Kütüphane içe aktarma
- CreateToolhelp32Snapshot() -- Çalışan süreçleri listele
- GetDC() -- Ekran görüntüsü
- BitBlt() -- Ekran görüntüsü
- InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- İnternete erişim
- FindResource(), LoadResource(), LockResource() -- Yürütülebilir dosyanın kaynaklarına erişim
Kötü Amaçlı Yazılım Teknikleri
DLL Enjeksiyonu
Başka bir süreç içinde rastgele bir DLL yürütme
- Kötü amaçlı DLL'yi enjekte etmek için süreci bul: CreateToolhelp32Snapshot, Process32First, Process32Next
- Süreci aç: GetModuleHandle, GetProcAddress, OpenProcess
- Süreç içinde DLL'nin yolunu yaz: VirtualAllocEx, WriteProcessMemory
- Kötü amaçlı DLL'yi yükleyecek bir iş parçacığı oluştur: CreateRemoteThread, LoadLibrary
Kullanılacak diğer fonksiyonlar: NTCreateThreadEx, RtlCreateUserThread
Yansıtıcı DLL Enjeksiyonu
Normal Windows API çağrılarını yapmadan kötü amaçlı bir DLL yükleme.
DLL, bir süreç içinde haritalanır, ithalat adreslerini çözer, yeniden konumlandırmaları düzeltir ve DllMain fonksiyonunu çağırır.
İş Parçacığı Ele Geçirme
Bir süreçten bir iş parçacığı bul ve onu kötü amaçlı bir DLL yüklemesi yapacak şekilde ayarla
- Hedef iş parçacığını bul: CreateToolhelp32Snapshot, Thread32First, Thread32Next
- İş parçacığını aç: OpenThread
- İş parçacığını askıya al: SuspendThread
- Kurban sürecinin içine kötü amaçlı DLL'nin yolunu yaz: VirtualAllocEx, WriteProcessMemory
- Kütüphaneyi yükleyen iş parçacığını devam ettir: ResumeThread
PE Enjeksiyonu
Taşınabilir Yürütme Enjeksiyonu: Yürütülebilir dosya, kurban sürecinin belleğine yazılacak ve oradan yürütülecektir.
Süreç Boşaltma (diğer adıyla RunPE)
Process Hollowing, Windows kötü amaçlı yazılımları tarafından kullanılan en sevilen savunma-atlatma / yürütme numaralarından biridir. Fikir, askıya alınmış durumda meşru bir süreci başlatmak, bellekten (boşaltmak) orijinal görüntüsünü kaldırmak ve yerine rastgele bir PE kopyalamaktır. Ana iş parçacığı nihayetinde yeniden başlatıldığında, kötü amaçlı giriş noktası güvenilir bir ikili (genellikle Microsoft tarafından imzalanmış) kılığında yürütülür.
Tipik iş akışı:
- Hiçbir talimatın henüz çalışmadığı askıya alınmış bir benign ana bilgisayar (örneğin
RegAsm.exe,rundll32.exe,msbuild.exe) oluştur.
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);
- Kötü amaçlı yükü belleğe oku ve PE başlıklarını ayrıştırarak
SizeOfImage, bölümleri ve yeniEntryPoint'i elde et. - NtUnmapViewOfSection / ZwUnmapViewOfSection – askıya alınmış sürecin orijinal görüntü tabanını haritalamadan kaldır.
- VirtualAllocEx – uzaktaki süreç içinde
SizeOfImage'in RWX belleğini ayır. - WriteProcessMemory – önce
Headers'ı kopyala, ardından bölümler üzerinde dolaşarak ham verilerini kopyala. - SetThreadContext –
EIP'nin yükünEntryPoint'ine işaret etmesi içinEAX/RAX(RCXx64'te) veyaRipdeğerini bağlam yapısında yaman. - ResumeThread – iş parçacığı devam eder, saldırgan tarafından sağlanan kodu yürütür.
Minimal kanıt konsepti (x86) iskeleti:
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);
}
Pratik notlar DarkCloud Stealer kampanyasında gözlemlendi:
- Yükleyici, dikkat çekmesi olası olmayan imzalı bir ikili olan
RegAsm.exe'yi ana bilgisayar olarak seçti. - Şifrelenmiş VB6 çalıcı (
holographies.exe) diske düşmüyor; yalnızca içi boşaltılmış süreç içinde var oluyor, bu da statik tespiti zorlaştırıyor. - Hassas dizeler (regexler, yollar, Telegram kimlik bilgileri) her bir dize için RC4-şifreli ve yalnızca çalışma zamanında çözülüyor, bu da bellek taramasını daha da karmaşık hale getiriyor.
Tespit fikirleri:
- Bellek bölgesi RWX olarak tahsis edilmeden önce asla GUI/console pencereleri oluşturmayan
CREATE_SUSPENDEDsüreçleri için uyarı verin (iyi niyetli kod için nadir). - Farklı süreçler arasında
NtUnmapViewOfSection ➜ VirtualAllocEx ➜ WriteProcessMemoryçağrı dizisini arayın.
Hooking
- SSDT (Sistem Servis Tanım Tablosu), kullanıcı süreçlerinin bu işlevleri çağırabilmesi için çekirdek işlevlerine (ntoskrnl.exe) veya GUI sürücüsüne (win32k.sys) işaret eder.
- Bir rootkit, kontrol ettiği adreslere işaret eden bu işaretçileri değiştirebilir.
- IRP (G/Ç İstek Paketleri), bir bileşenden diğerine veri parçaları iletir. Çekirdek içindeki hemen hemen her şey IRP'leri kullanır ve her cihaz nesnesinin kendi işlev tablosu vardır; bu tabloya hook yapılabilir: DKOM (Doğrudan Çekirdek Nesne Manipülasyonu).
- IAT (İthalat Adres Tablosu), bağımlılıkları çözmek için yararlıdır. Bu tabloyu hooklamak, çağrılacak kodu ele geçirmek için mümkündür.
- EAT (İhracat Adres Tablosu) Hook'ları. Bu hook'lar kullanıcı alanından yapılabilir. Amaç, DLL'ler tarafından dışa aktarılan işlevleri hooklamaktır.
- Inline Hooks: Bu türler elde edilmesi zor. Bu, işlevlerin kendisinin kodunu değiştirmeyi içerir. Belki de bunun başında bir atlama koyarak.
Referanslar
{{#include ../banners/hacktricks-training.md}}