調(diào)試與反調(diào)試系列丨使用異常進(jìn)行反調(diào)試

使用異常進(jìn)行反調(diào)試是利用異常處理的機(jī)制對(duì)調(diào)試器進(jìn)行一些操作。
原理是自己處理了異常就會(huì)走正常流程,如果沒(méi)有接收到自己的異常,就說(shuō)明異常被調(diào)試器接收了,無(wú)法正常處理。那么就可以判斷是在調(diào)試器中運(yùn)行的。
我們先來(lái)創(chuàng)建一個(gè)DLL項(xiàng)目。步驟如下:
?選擇新建項(xiàng)目

2.創(chuàng)建win32控制臺(tái)應(yīng)用程序->點(diǎn)擊確定

3.勾選空項(xiàng)目,完成

4.新建源文件entry.cpp

5.配置
5.1?選擇屬性

5.2修改運(yùn)行庫(kù),應(yīng)用

6.?添加#include、#include、主函數(shù)和默認(rèn)循環(huán)

7.?要?jiǎng)?chuàng)建一個(gè)線程,先寫(xiě)一個(gè)線程回調(diào)

8.在主函數(shù)里創(chuàng)建線程

9.填入檢測(cè)調(diào)試器用的代碼

9.1在try觸發(fā)異常,通過(guò)EXCEPTION_EXECUTE_HANDLER(異常處理常量)判斷要自行處理異常,進(jìn)入到異常處理的代碼執(zhí)行

9.2手動(dòng)寫(xiě)一個(gè)異常語(yǔ)句_asm int 3 (軟件斷點(diǎn))

9.3如果被調(diào)試器接收沒(méi)有處理,就會(huì)崩(int 3觸發(fā)異常,調(diào)試器識(shí)別為自行下的斷點(diǎn))

9.4自行處理加continue(跳出去,進(jìn)行下一個(gè)循環(huán))

9.5聲明是一個(gè)已知的異常,已知異常的處理代碼就是continue,沒(méi)有調(diào)試器附加,這個(gè)代碼就會(huì)一直運(yùn)行(內(nèi)部其實(shí)觸發(fā)了異常,不過(guò)異常已經(jīng)被自行處理掉了)

10.?在調(diào)試器里打開(kāi),
沒(méi)有處理的情況下,調(diào)試器一直在暫停

處理的情況下

在od打開(kāi),出現(xiàn)彈窗(在x32dbg沒(méi)有彈窗,是因?yàn)楸挥涗浵聛?lái)了)

利用異常進(jìn)行反調(diào)試的正常情況下,在這一步識(shí)別到調(diào)試器之后

會(huì)做一些誤導(dǎo)分析者這里是正常執(zhí)行位置的假象,從而達(dá)到利用異常進(jìn)行反調(diào)試的目的。