30 Nisan 2014 Çarşamba

Malwarelerin Debugger Tespit Etme Teknikleri

Malware örnekleri genellikle Virtual Machine gibi izole bir ortamda analistler tarafından analiz edilir. Analiz adımlarından statik ve dinamik kod analizlerinde debugger uygulamaları kullanılmaktadır. Bir zararlı yazılım debuggerlara karşı kendini korumak için içerisinde anti-debugger modüllerini barındırmaktadır. Anti-debugger özelliğine sahip bir zararlı kodu debugger uygulamaları ile analiz etmeye başladığınızda normal zararlı kod döngüsü halinde işlenmesini engeller ve sanki zararlı bir kod değilmiş gibi davranmasını sağlar.

Malware geliştiricileri debugger'lar gibi otomatik analiz sistemleri varlığını tespit etmek için bazı teknikler kullanmaktadırlar.

Bazı debugger uygulamaları;
  • Immunity Debugger
  • Olly Debugger

Bir Debugger çalıştırılabilir dosyaları analizi için kullanılan bir yazılım parçasıdır. Makine kodunun işletim sistemi tarafından yaygın sağlanan sistem call ve API ları analiz edebilmek ve gerektiği noktalarda durdurma amacıyla kullanılmaktadır. Debuggerlar belli bir bellek adresinde durdurmak için birçok kesme noktaları türlerini kullanabilmektedir. Aşağıdaki kesme noktalarını debuggerlar kullanabilme yeteneğine sahiptirler.
  • Software Breakpoints
  • Hardware Breakpoints
  • Memory Breakpoints
  • Conditional Breakpoints

Software Breakpoints

Yazılım kesme noktaları bir debugger rutin kesmesini bir yazılım kesme noktası yükseltir ve bunu işlemek için geri döndürülen bir INT 0xCC talimatı ile orijinal talimat yerine kırılma noktaları oluşturur. Immunity Debugger uygulamasında  ALT + b tuşlarına basarak yazılım kesme noktalarını görebilirsiniz.


Hardware Breakpoints

Donanım kesme noktası process tarafından sağlanan 4 debug kayıdını kullanmaktadır. Bu kayıtlar DR0, DR1, DR2, DR3 içermektedir.

Daha sonra kesmeyi etkinleştirmek , türünü ve uzunluğunu ayarlamak için DR7 kaydına uygun bitlere çevirmek gerekmektedir.

Donanım kesme noktası kurulmuş ve bu kesme noktasına ulaşıldıktan sonra OS bir INT 1 tek adım olay kesmesini yükseltir.

Debuggerlar sonra bu istisnaları yakalamak için uygun işleyicileri kullanırlar.

Memory Breakpoints

Bellekte kesme noktası bir işleyici kurmak için koruma sayfaları kullanır ve bu sayfaya eriştiyseniz bir istisna işleyicisi olarak tanımlanır.

Debuggerlar birçok memory breakpoint türlerini destekler; 
  •  memory breakpoint on BYTE access
  •  memory breakpoint on WORD access
  •  memory breakpoint on DWORD Access

Conditional Breakpoints

Koşullu kesme noktaları debugger tarafından yönetilen ve belli şartlar yerine getirildiği takdirde kullanıcılara sunulan bileşenlerdir.

Örneğin aşağıdaki syntaxa sahip bir immunity debugger koşullu kesme noktası ayarlayabilirsiniz:

CONDITION = [ESP] = 0x0077ff89

Eğer sadece belirli parametreler ile özel API çağrılarını izlemek istediğinizde memory breakpoints yararlı olacaktır.

Anti-Debugging Teknikleri

Kötü amaçlı yazılım analisti boşa çıkarmak amacıyla, malware debuggerların varlığını tespit edilebilir. Bir debugger varlığını tespit amacıyla, zararlı kod bazı değerleri okuyabilir ya da bu zararlı yazılım debugger olup olmadığını tespit etmek için mevcut bazı API lar kullanılabilmektedir.

Basit debugger algılama hileler biri KERNEL32.IsDebuggerPresent olarak bilinen WINAPI işlevini kullanımını tespit etmektir.

Debugger Tespit Etme Kodu;



PEB Kullanarak Debugger Tespit Etme;

CreateProcess API kullanarak süreç oluşturulduğunda oluşturma bayrağı DEBUG_ONLY_THIS_PROCESS olarak ayarlanırsa , bellekte PEB veri yapısı özel bir alana ayarlanmaktadır.



HEAP Bayrağı Kullanarak Debugger Tespit Etme;

Bir program debugger altında çalıştırıldığında debug işlemlerinin bayraklarını oluşturmaktadır. Heap bayrakları değiştirilir. Bu bayraklar işletim sisteminin sürümüne bağlı olarak farklı bir konumda oluşturulabilir.
Windows NT tabanlı sistemlerde bu bayraklar yığın tabanından 0x0C itibariyle mevcuttur.


Aşağıdaki C programı Heap bayraklarını kullanarak bir debugger varlığını tespit etmek için kullanılabilmektedir.


Debugger Tespit Etme Komutları;

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv)
{
if (IsDebuggerPresent())
{
MessageBox(HWND_BROADCAST, "Debugger Detected", ""Debugger Detected"", MB_OK);
exit();
}
MessageBox(HWND_BROADCAST, "Debugger Not Detected", ""Debugger Not Detected"", MB_OK);
return 0;
}

PEB Kullanarak Debugger Tespit Etme Komutları;

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>

int __naked detectDebugger()
{
__asm
{
ASSUME FS:NOTHING

MOV EAX,DWORD PTR FS:[18]
MOV EAX,DWORD PTR DS:[EAX+30]
MOVZX EAX,BYTE PTR DS:[EAX+2]
RET

}
}

int main(int argc, char **argv)
{
if (detectDebugger())
{
MessageBox(HWND_BROADCAST, "Debugger Detected", ""Debugger Detected"", MB_OK);
exit();
}
MessageBox(HWND_BROADCAST, "Debugger Not Detected", ""Debugger Not Detected"", MB_OK);
return 0;
}

HEAP Bayrağı Kullanarak Debugger Tespit Etme Komutları;

int main(int argc, char* argv[])
{
    unsigned int var;
    __asm
    {
        MOV EAX, FS:[0x30];
        MOV EAX, [EAX + 0x18];
        MOV EAX, [EAX + 0x0c];
        MOV var,EAX
    }

    if(var != 2)
    {
        printf("Debugger Detected");
    }
    return 0;
}

Hiç yorum yok:

Yorum Gönder