1. 程式人生 > >反除錯與反反除錯

反除錯與反反除錯

1-DebugPort
2-KdDisableDebugger
3-IsDebuggerPresent和CheckRemoteDebuggerPresent
4-hook

http://www.moguizuofang.com/bbs/thread-3235-1-1.html

http://bbs.pediy.com/showthread.php?t=126802

http://bbs.pediy.com/showthread.php?t=129810

DebugPort是程序EPROCESS結構裡的一個成員,指向了一個用於程序除錯的物件,如果一個程序不在被除錯的時候那麼就是NULL,否則他是一個指標。該物件負責在偵錯程式與被調程序之間進行除錯事件傳遞,因此被稱為除錯埠。被除錯程式的事件由這個埠傳送到偵錯程式程序的。

HOOK系統中一些與除錯相關的函式,也可以防止被各種偵錯程式除錯。比如某款程式在核心中就HOOK了下面這些函式:
NtOpenThread():防止偵錯程式在程式內部建立執行緒
NtOpenProcess():防止OD(OllyDbg)等除錯工具在程序列表中看到
KiAttachProcess():防止被附加上
NtReadVirtualMemory():防止被讀記憶體
NtWriteVirtualMemory():防止記憶體被寫
KdReceivePacket():KDCOME.dll 中Com串列埠接收資料函式
KdSendPacket():KDCOME.dll 中Com串列埠傳送資料函式,可以HOOK這2個函式用來防止雙機除錯。

反反除錯的思路也就出來了。針對清零DebugPort來防止除錯的方法,可以通過對DebugPort記憶體地址下記憶體斷點:
ba w4 debugport_addr
這樣一旦有程式程式碼在修改DebugPort,就會被斷下,從而找到對應的清零DebugPort的反除錯程式碼,然後對這部分程式碼進行patch(用機器碼0×90(nop)或者0xC3(ret)取代),從而讓它失去作用,當然有的程式會對程式碼進行校驗,一旦發現程式碼被篡改,就會採取保護措施,比如丟擲異常或者退出程式。
針對呼叫系統函式如KdDisableDebugger()來檢測偵錯程式存在從而禁止被除錯的方法,可以在對應的這些函式的地址下斷點,然後對相關的程式碼進行patch,然後使該函式判斷失效。比如:
bp KdDisableDebugger、eb xxx
針對通過HOOK系統函式來防止程序被除錯的方法,可以直接將這些系統函式的鉤子直接恢復,可以通過核心驅動程式或者藉助一些ARK工具(比如Pchunter)就可以直接檢測和恢復這些函式鉤子。