Anti Debugging Koruması Teknikleri

PwnLab.Me

Admin
Katılım
21 Ocak 2024
Mesajlar
203
Tepkime puanı
10
Puanları
18
Kaan Kozan tarafından yazılmıştır.

[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.gif

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.

Anti-reverse-anti-debug-peb-ntglobalflag.png

PEB

32x PEB Kodu:


WORDGetVersionWord()
{
OSVERSIONINFO verInfo = { sizeof(OSVERSIONINFO) };
GetVersionEx(&verInfo);
returnMAKEWORD(verInfo.dwMinorVersion, verInfo.dwMajorVersion);
}
BOOLIsWin8OrHigher() { returnGetVersionWord() >= _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);

}



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;



[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.




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

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:
Geri
Üst