64位内核开发第五讲,调试与反调试
目錄
- 反調試與反反調試
- 一丶反調試的幾種方法
- 1.DebugPort端口清零
- 2.KdDisableDebugger
- 3.ring3下的 isDebuggerpresent和CheckRemoteDebuggerPresent
- 4.使用Hook手段.
- 二丶反反調試
- 1.針對DebugPort
- 2.針對 KdDisableDebugger
- 3.花指令
- 一丶反調試的幾種方法
反調試與反反調試
一丶反調試的幾種方法
1.DebugPort端口清零
debugport是在EPROCESS結構中的.調試時間會通過DebugPort端口將調試事件發送給ring3進行調試的.如果設置為0.則ring3就無法進行調試了
也就是說你不能單步了.等相關調試操作了.
如果做反調試.開啟一個線程.不斷的對這個DebugPort進行清零.
進而進行反調試.
思路:
1.找到當前進程的EPROCESS結構
2.通過硬編碼找到這個位置.(硬編碼)
如果是硬編碼.就需要自己根據系統去判斷.
2.KdDisableDebugger
在內核中調用這個函數后,它會檢測是否檢測是否掛載了windbg.
也是開啟線程.不斷調用.
3.ring3下的 isDebuggerpresent和CheckRemoteDebuggerPresent
應用層可以調用這兩個函數判斷
4.使用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不管是否正確.都會進行強制跳轉.進而進行干擾.
轉載于:https://www.cnblogs.com/iBinary/p/10990674.html
總結
以上是生活随笔為你收集整理的64位内核开发第五讲,调试与反调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Day16 os模块、time模块、ra
- 下一篇: 上海房價