Kaan Kozan tarafından yazılmıştır.
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.
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.
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:
(Ayrıca PEB içerisindeki BeingDebugged’e bakacak olursak)
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, 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:
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.
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;
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.
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.
EFLAGS Register’i içerisinde bulunur. Örnek bir TF kod işleyişi;
Kontrolü atlatmak için pushfd komutunu breakpoint noktasını direkt ekleyerek değil arkasına koyarak atlatılabilir.
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.
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.
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.
Bize CreateFlag parametresi ile flag oluşturmaya odaklıdır.
Windows Sistemler kernel tabanlı handle tracing mekanizmalarına sahiptirler. CloseHandle tabanlı Anti Debugging kodu aşağıdaki şekildedir:
Paralel bir process üzerinden aynı BeingDebugged işleyişi gibi kontrol yapar.
Anlatacaklarım bu kadardı. Okuduğunuz için teşekkürler.
[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:
WORD GetVersionWord() { OSVERSIONINFO verInfo = { sizeof (OSVERSIONINFO) }; GetVersionEx(&verInfo); return MAKEWORD(verInfo.dwMinorVersion, verInfo.dwMajorVersion); } BOOL IsWin8OrHigher() { return GetVersionWord() >= _WIN32_WINNT_WIN8; } |
BOOL IsVistaOrHigher() { return [B]GetVersionWord() >= _WIN32_WINNT_VISTA; }[/B] |
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); }
|
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;
[B]0:000> dt ntdll!_EXCEPTION_REGISTRATION_RECORD[/B] |
+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.
|
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.
Moderatör tarafında düzenlendi: