64位內核開發第五講,調試與反調試


反調試與反反調試

一丶反調試的幾種方法

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

不管是否正確.都會進行強制跳轉.進而進行干擾.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM