~/sibercrew
Malware Analizi

Anti-Debugging ve Anti-Analysis Teknikleri

Zararlı yazılımların analiz edildiğini nasıl anladığı ve buna karşı analistlerin kullandığı karşı önlemler.

Gelişmiş zararlı yazılımlar, bir analiz ortamında (debugger altında veya sanal makinede) çalıştığını tespit etmeye çalışabilir ve bu durumda gerçek zararlı davranışını göstermeyip "zararsız" gibi davranarak analistleri yanıltmaya çalışabilir. Bu makale, en yaygın anti-debugging tekniklerine ve bunların analiz sürecinde nasıl aşılabileceğine odaklanır.

Windows API Tabanlı Debugger Tespiti

En basit ve en yaygın teknik, Windows'un doğrudan sunduğu API'leri çağırmaktır:

c
if (IsDebuggerPresent()) {
    ExitProcess(0);  // Debugger tespit edilirse hemen çık
}

IsDebuggerPresent, çağıran process'in bir debugger altında çalışıp çalışmadığını doğrudan sorgular. Daha gizli bir varyant, Process Environment Block (PEB) yapısındaki BeingDebugged bayrağını doğrudan, API çağırmadan (bu da bazı basit hook tabanlı tespit atlatma araçlarını atlatır) okumaktır — bu teknik, sonucu API katmanına hiç uğramadan doğrudan bellekten okuduğu için daha az iz bırakır.

Zamanlama Tabanlı Tespit (Timing Checks)

Bir debugger, kodun her adımını (özellikle breakpoint'lerle durdurarak) incelediği için, kodun normal çalışmasına göre önemli ölçüde YAVAŞLAMASINA neden olur. Zararlı yazılım, bu prensibi kullanarak iki zaman ölçümü (RDTSC CPU komutu gibi) arasındaki farkı kontrol edebilir:

asm
rdtsc            ; İlk zaman damgasını al
; ... birkaç basit işlem ...
rdtsc            ; İkinci zaman damgasını al
; farkı karşılaştır - beklenenden çok büyükse debugger var demektir

Bu teknik özellikle etkilidir çünkü debugger'ın kendisini "gizlemesi" (anti-anti-debugging araçlarının yaptığı gibi) bile bu zamanlama farkını her zaman tam olarak ortadan kaldıramaz.

Exception-Based Anti-Debugging

Bazı teknikler, işletim sisteminin istisna (exception) işleme mekanizmasının debugger varlığında farklı davrandığı gerçeğinden faydalanır. Örneğin OutputDebugString API'sinin belirli çağrı biçimleri, bir debugger bağlıyken farklı bir hata kodu döndürür — bu ince davranış farkı, dolaylı bir tespit yöntemi olarak kullanılabilir.

Sandbox/VM Tespiti

Dinamik analiz makalemizde değinildiği gibi, zararlı yazılım VM'e özgü donanım imzalarını (belirli sanallaştırma yazılımlarına ait sürücü isimleri, MAC adresi önekleri, CPUID sonuçlarındaki hypervisor bit'i) kontrol ederek kendisinin sanal bir ortamda çalışıp çalışmadığını anlamaya çalışabilir.

Analistlerin Karşı Önlemleri

  • Debugger gizleme eklentileri: x64dbg için ScyllaHide gibi eklentiler, yukarıda anlatılan API tabanlı ve PEB tabanlı kontrolleri "yalan söyleyerek" (debugger yokmuş gibi yanıt vererek) atlatmaya çalışır.
  • Patching: Anti-debugging kontrolünün bulunduğu koşullu atlama komutunu (je/jne gibi) manuel olarak değiştirerek (patch ederek), kontrolün sonucunu etkisiz hâle getirmek.
  • Gerçekçi sandbox ortamları: Sanal makineye gerçek kullanıcı aktivitesi izlenimi veren sahte veriler (belge geçmişi, fare hareketi simülasyonu) eklemek.
  • Donanım tabanlı analiz (bare-metal analysis): En dirençli tehditler için, sanallaştırma katmanını tamamen ortadan kaldırıp fiziksel, atılabilir bir test makinesinde analiz yapmak — bu, VM tespiti yapan hiçbir tekniğin işe yaramadığı bir ortam sağlar ama snapshot/rollback kolaylığından feragat etmeyi gerektirir.

Pratik Senaryo

Bir analist, bir örneği x64dbg'de incelerken programın debugger'ı hemen fark edip sessizce sonlandığını gözlemliyor. IsDebuggerPresent ve PEB BeingDebugged bayrağı kontrollerinin ikisi de ScyllaHide ile gizlendiği hâlde program yine kendini sonlandırıyor — bu, ek bir zamanlama tabanlı (RDTSC) kontrol olduğunu düşündürüyor. Analist, kod içinde iki RDTSC çağrısı arasındaki karşılaştırma komutunu tespit edip bu koşullu atlamayı manuel olarak patch ediyor (karşılaştırma sonucunu her zaman "debugger yok" dönecek şekilde değiştiriyor). Bu değişiklikten sonra program normal şekilde çalışmaya devam ediyor ve analist gerçek davranışını gözlemleyebiliyor — bu, tek bir savunma katmanının yetmediği, çok katmanlı anti-analysis tekniklerinin her birinin ayrı ayrı aşılması gerektiğinin tipik bir örneğidir.

Bu makale, anti-debugging ve anti-analysis tekniklerinin orta-ileri seviye teknik bir özetidir; SiberCrew ekibi tarafından hazırlanmış özgün içeriktir.