程序中包含很多的信息來幫助程序運行的正確区拳,這也提供了反調(diào)試的一個基礎(chǔ)晨仑,比如進程環(huán)境塊(PEB)線程環(huán)境塊(TEB)等。在實際的反調(diào)試的中存在幾種情況:
一痴颊、使用系統(tǒng)API函數(shù)
最常見的就是IsDebuggerPresent涮总,通過查詢進程環(huán)境塊(PEB)中的IsDebugged標志,判斷程序是否被調(diào)試
二祷舀、干擾調(diào)試器的功能
1瀑梗、TLS回調(diào)函數(shù)
TLS運行在main函數(shù)執(zhí)行之前,會先執(zhí)行TLS_CALLBACK函數(shù)裳扯,在函數(shù)開啟或結(jié)束抛丽,線程或進程創(chuàng)建,結(jié)束之前都會調(diào)用TLS回調(diào)函數(shù)饰豺。簡單的方式可以在main函數(shù)執(zhí)行前調(diào)用IsDebuggerPresent函數(shù)檢查它是否正在被調(diào)試亿鲜。TLS在PE文件中image-TLS-Directory中表現(xiàn),一個程序可以注冊多個TLS回調(diào)函數(shù)冤吨。
調(diào)試TLS回調(diào)函數(shù)的時候蒿柳,可以在OllyDbg中選擇Options->Debugging Options->Events,然后設(shè)置System break-point作為第一個暫停的位置漩蟆,這樣就可以讓OllyDbg在TLS回調(diào)執(zhí)行前暫停垒探。
解決方法:定位PE文件中,把TLS回調(diào)函數(shù)的指針全部改為0即可怠李。(去除重定向表也差不多)
2.利用中斷
因為調(diào)試器使用INT 3來設(shè)置軟件斷點圾叼,所以一種反調(diào)試技術(shù)就是在合法代碼段中插入0xCC(INT 3)欺騙調(diào)試器蛤克,使其認為這些0xCC機器碼是自己設(shè)置的斷點。
參考:看雪論壇