1. Process ghosting
Process Ghosting, silinmek üzere olan (delete-pending) bir dosyadan Section oluşturup, bu section'ı kullanarak yeni bir process başlatmayı hedefler. Dosya diskten silinir ama bellekten çalışmaya devam eder. EDR'ler diskte dosya olmadığı için şaşırır kalır.
Bu Kod Gerçekte Ne Yapıyor? (Felaket)
Bu dosya, adında "Ghost" geçmesine rağmen, kesinlikle Process Ghosting yapmıyor.
- create_image_section_from_file ile section oluşturuyor ama bu section'ı hiçbir yerde kullanmıyor.
- run_ghosted_process fonksiyonu, section'ı çöpe atıp doğrudan klasik VirtualAllocEx + WriteProcessMemory + CreateRemoteThread yapıyor.
- Yani bu dosya, sıradan bir "Basic Injector" dan ibaret. Ghosting'in en önemli adımı olan NtCreateProcessEx ile section'dan process oluşturma kısmı tamamen eksik.
Bu dosyayı çöpe at. Eğer gerçek Ghosting istiyorsan, NtCreateProcessEx kullanman ve SECTION_IMAGE parametreleriyle oynaman gerekir. Buradaki kod seni yanıltır. Kullanma.
2. hypnosis
Meşru bir process'i (örneğin svchost.exe) SUSPENDED olarak başlatır, hafızasındaki orijinal PE'yi söker (NtUnmapViewOfSection), yerine kendi shellcode'unu yazar, thread'in başlangıç adresini (Rip) kendi koduna çevirir ve devam ettirir. Artık meşru process'in kılığında senin kodun çalışır.
Kod Analizi (Gerçekten İyi Yazılmış):
- Gizli Başlatma: CREATE_SUSPENDED | CREATE_NO_WINDOW ile hedef process'i sessizce başlatır. Kimse görmez.
- PEB Okuyup Base Adresini Bulur:
rust
NtQueryInformationProcess(..., ProcessBasicInformation, ...);
ReadProcessMemory(..., &(*peb_addr).ImageBaseAddress, ...);
Burada uzaktaki process'in PEB'ine girip ImageBaseAddress'i (yüklendiği adres) çalıyor. - Orijinal PE'yi Söker:
rust
NtUnmapViewOfSection(hProcess, image_base);
Bu komut, hedef process'in kendi EXE'sini bellekten tamamen atar. Process artık bomboş bir kabuktur. - Yerine Shellcode Yazar:
VirtualAllocEx ile PAGE_EXECUTE_READWRITE izninde aynı adrese (image_base) yeni shellcode'u yazar. - Context'i Değiştirip Çalıştırır:
rust
ctx.Rip = remote_base as u64; // Giriş noktası senin kodun
SetThreadContext(...);
ResumeThread(...);
Artık meşru process'in içinde senin kodun çalışıyor.
3. Process Hollowing
Hedef process'i DEBUG_ONLY_THIS_PROCESS modunda başlatır. Debugger modunda olmak, EDR'lerin bazı hook'larını atlatmanı sağlar (çünkü debugger, process'in içine girer). Kod, hedef process bir EXCEPTION_BREAKPOINT (kesme noktası) fırlattığında devreye girip shellcode'u enjekte eder.
Kod Analizi (Zarif Ama Riskli):
- Debug Modunda Başlatma:
rust
CreateProcessW(..., DEBUG_ONLY_THIS_PROCESS, ...); - Olay Yakalama:
WaitForDebugEvent ile bekler. Eğer EXCEPTION_BREAKPOINT (kod 1) gelirse, bu genellikle Windows'un debugger başlangıcında gönderdiği ilk sinyaldir. - Enjeksiyon:
Breakpoint yakalandığında, standart VirtualAllocEx ve WriteProcessMemory ile shellcode'u yazar ve CreateRemoteThread ile çalıştırır. - Detach:
Enjeksiyon bittikten sonra DebugActiveProcessStop ile debugger'dan ayrılır.
- Zaman Aşımı Çok Kısa: loop_counter > 20 demişsin. 20 * 100ms = 2 saniye. Eğer hedef process 2 saniye içinde breakpoint fırlatmazsa (ki bazen Windows update'leri veya antivirüs bunu geciktirir), enjeksiyon başarısız olur. Bunu 500 veya 1000 döngüye çıkarmanı öneririm.
- SymInitialize ve NtCreateThreadEx Kullanılmamış: Gereksiz import'lar var. Temizlik yapabilirsin.
- Kullanım Amacı: Bu yöntem, basit AV'leri atlatmak için iyidir ama gelişmiş EDR'ler debugger aktivitesini de izler. Yine de iş görür.
4.process.rs
Bu dosya, çalışan bir process'in PID'sini alır, hafızasına shellcode enjekte eder ve çalıştırır.Adım Adım İşleyiş
1. Hedef Process'i Açrust
OpenProcess(PROCESS_ALL_ACCESS, FALSE, target_pid)
- target_pid ile belirtilen process'e tüm yetkilerle erişim açılır.
- Başarısızsa hata döner.
rust
VirtualAllocEx(h_process, null_mut(), shellcode.len(), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE)
- Hedef process'in hafızasında shellcode boyutunda bir alan ayrılır.
- Başlangıçta sadece okunabilir/yazılabilir (çalıştırılamaz) olarak ayarlanır.
- Eğer başarısızsa, process handle'ı kapatılır ve hata döner.
rust
WriteProcessMemory(h_process, remote_addr, shellcode.as_ptr(), shellcode.len(), &mut bytes_written)
- Ayrılan bölgeye shellcode baytları kopyalanır.
- Yazılan bayt sayısı kontrol edilir; eksik yazıldıysa bellek serbest bırakılıp hata döner.
rust
VirtualProtectEx(h_process, remote_addr, shellcode.len(), PAGE_EXECUTE_READWRITE, &mut old_protect)
- Bellek bölgesinin koruması çalıştırılabilir, okunabilir ve yazılabilir olarak güncellenir.
- Böylece CPU buradaki kodları çalıştırabilir hale gelir.
- Başarısız olursa temizlik yapılır.
rust
NtCreateThreadEx(&mut h_thread, THREAD_ALL_ACCESS, null_mut(), h_process,
Some(transmute(remote_addr)), null_mut(), 0, 0, 0, 0, null_mut())
- CreateRemoteThread yerine NtCreateThreadEx kullanılır. Bu native API, EDR/AV hook'larından kaçmak için daha iyidir.
- Thread'in başlangıç adresi, shellcode'un bulunduğu remote_addr olarak ayarlanır.
- Thread hemen çalışmaya başlar (CREATE_SUSPENDED kullanılmaz).
- Başarısız olursa bellek serbest bırakılır.
Ekli Dosyalar
Son düzenleme: