Malware

[TR] Anti Debugging Koruması Teknikleri

[TR] Anti Debugging Koruması Teknikleri

 

Anti Debugging Nedir?

Anti Debugging popüler anti analiz tekniklerinden biridir. Kodun genel olarak debug edilerek analizde kullanılmasına karşı bir tekniktir. Anti Debug’u atlatmanın yolları vardır. Biz bugün bu yollardan bazılarını ve Anti Debug’un nasıl işlediğini ele alacağız.

 

Anti Debugging’in Bypass Edilmesi Üzerinde Kullanılan Yöntemler

1) IsDebuggerPresent fonksiyonu çağırıldıktan sonrasında EAX değerini sıfırlamak.

2) BeingDebugged Flag’ını IsDebuggerPresent için her zaman 0 olarak PEB içerisine belirli kod enjeksiyonları ederek atlatmak.

3) BeingDebugged kontrolünü atlatmak için IsDebbugerPresent üzerinde kontrolden hemen sonra bir atlatma yöntemi kullanmak. NOP.

Genel olarak Bypass yöntemlerimiz bu şekilde tabi kullanılabilir farklı yöntemlerde var.

 

IsDebuggerPresent Nedir?

Temelinde aşağıda görebileceğiniz üzere bir Windows API fonksiyonu’dur. Bu fonksiyon program üzerinde debugger kullanılıp, kullanılmadığını tespit etmek için Process Environment Block (PEB) kullanır.

IsDebuggerPresent yazılım üzerinde Anti Debug işleyişini kontrol eden noktalardan biridir. Bu fonksiyon genel olarak yazılımın debug olduğunu tespit edip, işleyişini bozarak anti analizi zorlaştırır.

PEB üzerinde bulunan BeingDebugged kontrolü sayesinde yazılıma 1-0 değerlerin return edilmesini sağlar.

 

IsDebuggerPresent

 

IsDebuggerPresent’in farklı kod gösterimlerini incelersek;

32x Yapımlar İçin:

0:000< u kernelbase!IsDebuggerPresent L3
KERNELBASE!IsDebuggerPresent:
751ca8d0 64a130000000 mov eax,dword ptr fs:[00000030h]
751ca8d6 0fb64002 movzx eax,byte ptr [eax+2]
751ca8da c3

 

(Ayrıca PEB içerisindeki BeingDebugged’e bakacak olursak)

0:000< dt _PEB
ntdll!_PEB
+0x000 InheritedAddressSpace : UChar
+0x001 ReadImageFileExecOptions : UChar
+0x002 BeingDebugged

 

BeingDebbugged için fonksiyon değerlerini okuyarak işleyişi kontrol etmek üzerine 0-1 değerler return eden kod bütünümüz temel olarak bu şekilde.

 

PEB (Process Environment Block) Nedir?

PEB, Windows Sistemlerde bulunan kapalı bir yapı olarak tanımlanabilir. Anti Debugging için PEB yapısını farklı yollar ile elde etmemiz gereklidir.

PEB

32x PEB Kodu:

WORDGetVersionWord()
{
OSVERSIONINFO verInfo = { sizeof(OSVERSIONINFO) };
GetVersionEx(&verInfo);
returnMAKEWORD(verInfo.dwMinorVersion, verInfo.dwMajorVersion);
}
BOOLIsWin8OrHigher() { returnGetVersionWord() >= _WIN32_WINNT_WIN8; }
BOOL IsVistaOrHigher() { return GetVersionWord() >= _WIN32_WINNT_VISTA; }      

Tabi 64x sistemler için kodlar bir tık daha uzun olduğundan ekleyemiyoruz. Fakat siz küçük araştırmalar sayesinde istediğiniz haline ulaşabilirsiniz.

 

NtGlobalFlag Nedir?

Windows içerisinde global flag’ları görebileceğimiz bir NtGlobalFlag değeri vardır. Bu değer kayıt defterindeki değerlerle başlatılır.

Bu değerimiz sistemin kontrolü, debug edilmesi ve izlenmesi için kullanılır. PEB Kontrolü ayrıca bu yapımızda da bulunmaktadır.

Debugger üzerinde işleyiş başladıktan sonra yakalanan bir PEB, NtGlobalFlag değeri;

0:000> dt _PEB NtGlobalFlag @$peb
ntdll!_PEB
+0x068 NtGlobalFlag : 0x70

NtGlobalFlag Değeri Nasıl Bypass Edilir / Atlatılır?

Genel olarak Anti Debugging yönteminde yaptığımız gibi PBE içerisinde bulunan NtGlobalFlag değerinin Debugged kontrolünden önce Anti Debug Korumasını koruyan değeri 0 yaparak işleyişi bozmak, bypass etmemizdeki temel mantıktır.

 

Thread Local Storage (TLS) Nedir?

TLS çağrıları giriş noktalarından (entry points) önce yürütülmekte olan bir MainFunction’dur. PE Headers içerisinde TLS çağrısını açıklamamıza yardımcı olabilecek bir kısım bulunmaktadır. Malware’ler, kötü amaçlı yazılımlar Debugging Mesajlarından kaçınmak için TLS Çağrılarını kullanabilirler.

 

Trap Flag Kontrolü Nedir?

EFLAGS Register’i içerisinde bulunur. Örnek bir TF kod işleyişi;

BOOL isDebugged = TRUE;
__try
{
    __asm
    {
        pushfd
        or dword ptr[esp], 0x100 // set the Trap Flag
        popfd                    // Load the value into EFLAGS register
        nop
    }
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
    // If an exception has been raised – debugger is not present
    isDebugged = FALSE;
}
if (isDebugged)
{
    std::cout << "Stop debugging program!" << std::endl;
    exit(-1);

} 

Anti Debug Temelli TF Setting Call Check

 

Trap Flag Kontrolü Nasıl Bypass Edilir / Atlatılır?

Kontrolü atlatmak için pushfd komutunu breakpoint noktasını direkt ekleyerek değil arkasına koyarak atlatılabilir.

 

SEH (Structured Exception Handling) Nedir?

Donanımda oluşan hatalar gibi belli kod durumlarını işlemek amacıyla oluşturulan uzantıdır. Türkçe karşılığı Yapılandırılmış Özel Durum İşlemesi’dir. Bir yazılımın hata yakalaması için hata yakalama blokları bulunur. SEH Chain bu kapsamda olan bir ifadedir. SEH Chain’in son kısımında Structured Exception Handling bulunur.

Next SEH ve Seh’den oluşur ve 8 bayt’dır. Genel olarak Try, Catch, Except, gibi programlama dillerinde belli başlıca betikler vardır. İşte SEH’de bu kodlara benzer bir hata ayıklama bloğudur diyebiliriz.

 

SEH Tabanlı Anti Debugging Kodu;

0:000> dt ntdll!_EXCEPTION_REGISTRATION_RECORD

 

+0x000 Next              : Ptr32 _EXCEPTION_REGISTRATION_RECORD

   +0x004 Handler          : Ptr32 _EXCEPTION_DISPOSITION

 

SEH Bypass / Atlatılması

Kodu incelediğimizde ExecuteHandler2 olarak bir field (boşluk), kod satırı görebiliyoruz. İşte bizim SEH Handler’ı çağıran fonksiyonumuz. Biz eğer breakpoint’i call instruction üzerine atarsak, bypass işlemimizi başarıyla tamamlamış, atlatmış oluruz.

0:000> u ntdll!ExecuteHandler2+24 L3
ntdll!ExecuteHandler2+0x24:
775100af ffd1            call    ecx
775100b1 648b2500000000  mov     esp,dword ptr fs:[0]
775100b8 648f0500000000  pop     dword ptr fs:[0]
0:000> bp 775100af

 

VEH (Vectored Exception Handler) Nedir?

VEH uygulamadaki Excepitonlar’ı yürütmek için bir Windows mekanizmasıdır. Bildiğiniz üzere Cheat Engine’de de VEH Debugger vardır.

Aynı zamanda VEH, SEH konusunda önemlidir. Eğer betikte (yazılımda) hiçbir VEH Handler’ı yok ise ancak SEH olabilir. VEH List’ini bulmak için RtlpAddVectoredHandler, LdrpVectorHandlerList noktalarını bulmak işe yarayabilir.

 

NtCreateThreadEx Nedir?

Bize CreateFlag parametresi ile flag oluşturmaya odaklıdır.

NTSTATUS NTAPI NtCreateThreadEx (
    _Out_    PHANDLE              ThreadHandle,
    _In_     ACCESS_MASK          DesiredAccess,
    _In_opt_ POBJECT_ATTRIBUTES   ObjectAttributes,
    _In_     HANDLE               ProcessHandle,
    _In_     PVOID     StartRoutine,

Handle Tracing Nedir?

Windows Sistemler kernel tabanlı handle tracing mekanizmalarına sahiptirler. CloseHandle tabanlı Anti Debugging kodu aşağıdaki şekildedir:

 

CheckRemoteDebuggerPresent ve NtQueryInformationProcessIt Nedir?

Paralel bir process üzerinden aynı BeingDebugged işleyişi gibi kontrol yapar.

 

Anlatacaklarım bu kadardı. Okuduğunuz için teşekkürler.

İlgili Makaleler

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu