反調試與反反調試
一丶反調試的幾種方法
1.DebugPort端口清零
debugport是在EPROCESS結構中的.調試時間會通過DebugPort端口將調試事件發送給ring3進行調試的.如果設置為0.則ring3就無法進行調試了
也就是說你不能單步了.等相關調試操作了.
如果做反調試.開啟一個線程.不斷的對這個DebugPort進行清零.
進而進行反調試.
思路:
1.找到當前進程的EPROCESS結構
2.通過硬編碼找到這個位置.(硬編碼)
如果是硬編碼.就需要自己根據系統去判斷.
2.KdDisableDebugger
在內核中調用這個函數后,它會檢測是否檢測是否掛載了windbg.
也是開啟線程.不斷調用.
3.ring3下的 isDebuggerpresent和CheckRemoteDebuggerPresent
應用層可以調用這兩個函數判斷
4.使用Hook手段.
如在內核中進行HOOK
下面列出函數名
函數名字 | 作用 | HOOK后 |
---|---|---|
NtOpenThread | 創建內核線程 | 防止調試器在內部創建線程 |
NtOpenProcess | 打開進程 | 防止OD等調試工具在調試列表中看到 |
kiAttachProcess | 附加調試進程 | 防止被附加 |
NtReadVirtualMemory | 讀取虛擬內存 | 防止自己進程被讀內存(ReadProcessMemory) |
NtWriteVirtualMemory | 寫內存 | 防止內存被寫 |
KdReceivePacket | KDCOM.dll中Com串口接收數據的函數 | 你自己做過濾 |
KdSendPacket | KDCOM.dll中的Com串口發送數據函數 | HOOK上面跟這個函數.可以防止雙機調試 |
二丶反反調試
上面說的是防,那么我們可以進行攻擊
1.針對DebugPort
1.可以對DebugPort下內存斷點.一旦有程序進行修改.就會被斷下.
從而找到對應的反調試代碼.對這個代碼進行patch.
2.可以自建調試體系.不走它的.進而繞過這個保護.
2.針對 KdDisableDebugger
這個函數會檢測調試器.從而禁止被調試.
可以在對應的這些函數地址下段點.然后對相關代碼進行patch.比如進行返回.
3.針對HOOK
如果是HOOK.我們可以借助一些工具進行恢復.當然如果可以你自己也可以寫恢復代碼.這看你當時的需求了.
常見的就比如: pchunter PowerTools anti(安天)
3.花指令
進行反調試可以進行加花.故意進行干燒.
如:
push edx
pop edx
inc ecx
dec ecx
add esp,1
sub esp,1
直接對一個寄存器進行加.然后進行減.操作完根本不會影響寄存器的原值.
jmp LABEL
db opcode
LABEL
還有這種.中間加個db.但是他會影響你.
db Opcode跟后面指令結合就會錯亂.但是不會影響程序正常執行.
jz label
jnz label
db opcode
Label
不管是否正確.都會進行強制跳轉.進而進行干擾.