反調試:IsDebuggerPresent


前言:一個反調試IsDebuggerPresent的CreackMe

IsDebuggerPresent函數的了解:

IsDebuggerPresent
作用
    確定調用進程是否由用戶模式的調試器調試。
語法
    BOOL WINAPI IsDebuggerPresent(void);
參數
    該函數沒有參數
返回值
    如果當前進程運行在調試器的上下文,返回值為非零值。
    如果當前進程沒有運行在調試器的上下文,返回值是零。

IsDebuggerPresent函數檢測調試過程:

1、直接加載入OD,觀察是否具有IsDebuggerPresent的windows api函數,來驗證反調試是不是使用的是IsDebuggerPresent,發現確實存在

2、利用IsDebuggerPresent進行下斷點,然后運行程序F9,然后單步走

關鍵的第一個api函數,PostQuitMessage,其作用是發送結束消息

然后我們繼續單步走,最后來到第二個關鍵的api 結束進程的函數ExitProcess


IsDebuggerPresent函數防調試的繞過

1、載入OD,進行IsDebuggerPresent api函數的斷點,然后用戶返回到執行代碼,同時也可以發現返回值為00000001,不為0,所以IsDebuggerPresent判斷為調試中,就會結束進程

2、分析匯編代碼可知如下,那么讓下面的je跳轉進行跳轉就可以了,那么直接修改jmp 進行無條件跳轉,再F9

3、成功繞過


IsDebuggerPresent反調試的原理:

1、重新載入OD進行分析,運行程序,斷下點來到如下

7C81F424 >  64:A1 18000000  MOV EAX,DWORD PTR FS:[18]                ; 將7FFDD018地址中的值7FFDD00賦值給eax
7C81F42A    8B40 30         MOV EAX,DWORD PTR DS:[EAX+30]            ; 將7FFDD30的地址的機器碼7FFDE000賦值給eax
7C81F42D    0FB640 02       MOVZX EAX,BYTE PTR DS:[EAX+2]            ; 將7FFDE02的第一字節機器碼賦值給eax,這里的第一字節的機器碼也就是01
7C81F431    C3              RETN                                     ; 那么返回值中的eax值也就是01,判斷為被調試,結束程序

2、那么也就是將eax中的值改為00000000,所以就可以繞過了


免責聲明!

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



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