Malware'da Kullanılan Yaygın API

Reading time: 6 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Genel

Ham SoketlerWinAPI Soketleri
socket()WSAStratup()
bind()bind()
listen()listen()
accept()accept()
connect()connect()
read()/recv()recv()
write()send()
shutdown()WSACleanup()

Süreklilik

KayıtDosyaHizmet
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
VirtualAllocBellek ayırma (paketleyiciler)
VirtualProtectBellek iznini değiştirme (paketleyici bir bölüme yürütme izni verme)
ReadProcessMemoryDış süreçlere enjekte etme
WriteProcessMemoryA/WDış süreçlere enjekte etme
NtWriteVirtualMemory
CreateRemoteThreadDLL/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);
  1. 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.
  2. NtUnmapViewOfSection / ZwUnmapViewOfSection – askıya alınmış sürecin orijinal görüntü tabanını haritalamadan kaldır.
  3. VirtualAllocEx – uzaktaki süreç içinde SizeOfImage'in RWX belleğini ayır.
  4. WriteProcessMemory – önce Headers'ı kopyala, ardından bölümler üzerinde dolaşarak ham verilerini kopyala.
  5. SetThreadContextEIP'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.
  6. 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

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin