前言:一個反調試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,所以就可以繞過了