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

反調試與反反調試

一丶反調試的幾種方法

1.DebugPort端口清零

debugport是在EPROCESS結構中的.調試時間會經過DebugPort端口將調試事件發送給ring3進行調試的.若是設置爲0.則ring3就沒法進行調試了
也就是說你不能單步了.等相關調試操做了.函數

若是作反調試.開啓一個線程.不斷的對這個DebugPort進行清零.
進而進行反調試.
思路:
1.找到當前進程的EPROCESS結構
2.經過硬編碼找到這個位置.(硬編碼)
若是是硬編碼.就須要本身根據系統去判斷.工具

2.KdDisableDebugger

在內核中調用這個函數後,它會檢測是否檢測是否掛載了windbg.
也是開啓線程.不斷調用.編碼

3.ring3下的 isDebuggerpresent和CheckRemoteDebuggerPresent

應用層能夠調用這兩個函數判斷spa

4.使用Hook手段.

如在內核中進行HOOK線程

下面列出函數名debug

函數名字 做用 HOOK後
NtOpenThread 建立內核線程 防止調試器在內部建立線程
NtOpenProcess 打開進程 防止OD等調試工具在調試列表中看到
kiAttachProcess 附加調試進程 防止被附加
NtReadVirtualMemory 讀取虛擬內存 防止本身進程被讀內存(ReadProcessMemory)
NtWriteVirtualMemory 寫內存 防止內存被寫
KdReceivePacket KDCOM.dll中Com串口接收數據的函數 你本身作過濾
KdSendPacket KDCOM.dll中的Com串口發送數據函數 HOOK上面跟這個函數.能夠防止雙機調試

二丶反反調試

上面說的是防,那麼咱們能夠進行攻擊調試

1.針對DebugPort

1.能夠對DebugPort下內存斷點.一旦有程序進行修改.就會被斷下.
從而找到對應的反調試代碼.對這個代碼進行patch.code

2.能夠自建調試體系.不走它的.進而繞過這個保護.htm

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

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

堅持兩字,簡單,輕便,可是真正的執行起來確實須要很長很長時間.當你把堅持兩字當作你要走的路,那麼你總會成功.
相關文章
相關標籤/搜索