1. Anti-Debug (Hata Ayıklama Karşıtı) Teknikleri
Zararlı yazılım, bir güvenlik araştırmacısının eline geçtiğinde genellikle IDA Pro, x64dbg veya WinDbg gibi debugger'lara takılır. Bu iki dosya, debugger'ı tespit edip kendini imha ederek analiz edilmesini engeller.aDBG.rs
rustCheckRemoteDebuggerPresent(GetCurrentProcess(), &mut is_debugger_present);
if is_debugger_present == 1 { ExitProcess(u32::MAX); }
- Ne Yapar: Windows'un kendi API'sini çağırır. Eğer process'in üzerinde bir debugger varsa, bu fonksiyon 1 döner.
- Strateji: Debugger tespit edilirse, hiç beklemeden ExitProcess ile kendini öldürür.
- Sinyal Yakalama (EDR): Basittir, çoğu EDR bu API çağrısını izler. Ama ilk savunma hattı olarak güzel.
pdp.rs
Bu dosya, işi bir üst seviyeye taşır. Direkt olarak ntdll.dll'deki NtQueryInformationProcess fonksiyonunu kullanır.rust
let status = nt_query_info_process(GetCurrentProcess(), PROCESS_DEBUG_PORT, ...);
if debug_port == -1 { ExitProcess(u32::MAX); }
- Mantık: Windows, bir process debug ediliyorsa, o process'e atanmış özel bir "Debug Port" numarası tutar. Normalde bu port 0'dır, debugger varsa -1 olur.
- Neden Güzel? CheckRemoteDebuggerPresent hooklanabilir (EDR'ler müdahale edebilir) ama NtQueryInformationProcess native API (syscall) olduğu için, doğrudan kernel'e gider. EDR'lerin bunu engellemesi çok daha zordur.
2.AMSI (Antimalware Scan Interface), PowerShell, VBScript ve .NET zararlılarını tarayan Windows mekanizmasıdır. Eğer bir malware PowerShell ile çalışacaksa, önce AMSI'yi patlatmak şarttır.
rust
let patch = [0x40, 0x40, 0x40, 0x40u8, 0x40, 0x40];
let addr = GetProcAddress(dll, "AmsiScanBuffer");
VirtualProtect(addr, PAGE_READWRITE);
WriteProcessMemory(GetCurrentProcess(), addr, patch.as_ptr());
VirtualProtect(addr, old_permissions);
- Ne Yapıyor? amsi.dll içindeki AmsiScanBuffer fonksiyonunun başına 0x40 (Assembly'de INC EAX komutu) yazıyor.
- Sonuç: AMSI, zararlı olduğunu düşündüğü kodu taramaya çalıştığında, bu patlak fonksiyon ya çöker ya da hiçbir şey yapmadan geri döner. AMSI tamamen kör olur. (Not: Genelde buraya B8 57 00 07 80 C3 gibi direkt return 0 yazan patch'ler konur, ama sen 0x40 ile fonksiyonu bozmuşsun, bu da iş görür çünkü fonksiyon çalışamaz hale gelir.)
3.ETW, Windows'un olay günlüğü mekanizmasıdır. EDR'ler ve AV'ler, ETW loglarını okuyarak şüpheli aktiviteleri (örneğin CreateRemoteThread) yakalar. Bu dosya, ETW'leri tamamen susturmayı hedefler.
Aşama 1:
rustlet pid = get_winlogon_pid(); // winlogon.exe'nin PID'ini bul
OpenProcess(PROCESS_ALL_ACCESS, pid);
DuplicateTokenEx(..., TokenPrimary, &mut duplicate_token);
ImpersonateLoggedOnUser(duplicate_token);
- winlogon.exe, Windows'un en yetkili (SYSTEM) process'lerinden biridir.
- Kod, winlogon'un token'ını çalarak kendini NT AUTHORITY\SYSTEM yapar.
- Eğer bu başarısız olursa, "Try to re-launch the tool as Admin" diyerek pes eder.
Aşama 2: Tüm ETW Oturumlarını Bul ve Durdur
rustQueryAllTracesW(...); // Sistemdeki tüm ETW oturumlarını listele
for name in session_names {
ControlTraceW(..., name, EVENT_TRACE_CONTROL_STOP); // Tek tek durdur
}
- Strateji: Sistemde çalışan tüm loglayıcıları (Microsoft'un kendi logları dahil) zorla kapatır.
- Risk: Sistem kararlılığını bozabilir (log tutmayınca bazı servisler şaşırabilir) ama malware için mükemmeldir çünkı hiçbir log kaydı tutulmaz.
4.Bu dosya, işin "abi ben buradayım" dediği kısım. Basitçe söylemek gerekirse, Windows Defender'ın (ve güncellemelerinin) çalışmasını imkansız hale getiriyor.
Nasıl mı? Defender, virüs tanımlarını (signature) belirli dosyalardan okur: mpavbase.vdm ve mpavbase.lkg. Bu dosyalar, Defender'ın beynidir. Eğer bu dosyaları kilitlersen (başka hiçbir process okuyamaz/yazamaz hale getirirsen), Defender felç olur.
Adım Adım Plan:
1. Defender'ın Yolunu Bul (
- Registry'den (HKLM\SOFTWARE\Microsoft\Windows Defender\ProductAppDataPath) Defender'ın kurulu olduğu yeri okur.
2. Yedek Dosyaları Kilitle (
- mpavbase.lkg ve mpavbase.vdm dosyalarını Native API (nt_create_file) kullanarak açar ve LockFile ile kilitler.
- Neden Native API? Çünkü kernel32.dll üzerindeki CreateFile EDR'ler tarafından hooklanır. ntdll.dll üzerinden doğrudan syscall yaparak (buradaki nt_create_file) hook'lardan kaçar.
3. MRT (Microsoft Removal Tool) Klasörünü İzle (
- C:\Windows\System32\MRT dizinini ReadDirectoryChangesW ile izler.
- Eğer buraya yeni bir dosya eklenirse veya değişirse, o dosyayı anında açar ve kilitler.
- Yani: Defender yeni bir imza dosyası indirmeye çalıştığında, sen "dokunma lan buna" deyip dosyayı kaparsın.
4. Windows Defender Servisini Gözetle (
- OpenServiceW ile WinDefend servisini açar.
- NotifyServiceStatusChangeW ile Defender durduğunda (mesela biri onu kapatmaya çalıştığında veya çöktüğünde) devreye girecek bir callback tanımlar.
- Eğer Defender durursa, hemen lock_signature_file çağrılır ve imza dosyaları tekrar kilitlenir.
Bu POC'nin EDR/XDR Karşısındaki Süper Gücü:
- Davranışsal Analiz: EDR, sürekli olarak dosya kilitleme girişimlerini görür. Ancak bu dosyalar SYSTEM yetkisinde çalışan meşru Defender dosyalarıdır.
- İmza Yok: Bu kod, bilinen bir malware imzası taşımaz. Tamamen Windows API/NT API kullanarak yapılmıştır.
- Kalıcılık: Eğer Defender uyanıp dosyayı tekrar açmaya çalışırsa, ReadDirectoryChangesW ve wd_killer_thread anında müdahale eder. Bu bir "Ölümcül Döngü" (Deadlock) yaratır.