程序:

Keyfile.dat 里的內容

該文件中要至少有 9 個
ReverseMe.A:
運行程序

用 OD 打開該程序,運行

彈出的是錯誤的對話框
該程序發現 OD 對它的調試,所以該程序對 OD 進行反調試
重新載入程序,按 F8 往下走

這個循環是對 Keyfile.dat 的內容進行判斷的
循環過來,來到一個 call 語句

執行該 call 語句就會彈出那個彈窗

這個 call 指令調用的函數就在下面

這個地方調用了一個 IsDebuggerPresent 函數
該函數判斷程序進程是否由用戶模式的調試器調試,如果當前進程在調試器中,返回值為非零值,如果當前進程不在調試器中,返回值為零
按 F8 往下走

返回值 eax 的值為 1,是非零

然后執行跳轉,跳到彈出是錯誤的對話框
Reverse.B:
運行程序

用 OD 載入程序,運行

程序運行到該處會暫停,再運行

程序就終止了
重新載入程序,按 F8 一步一步往下走

這里還是執行了 call 指令

調用 IsDebuggerPresent 函數
接着往下走

把 esp 給 401121
繼續運行程序,程序就終止了
Reverse.C:
運行程序

用 OD 載入程序,運行

程序直接終止了
重新載入程序,按 F8 往下走

執行 call 指令之后會先用 IsDebuggerPresent 函數進行判斷是否被反調試

eax 的值為 1,執行跳轉,然后執行 ExitProcess 函數退出程序
Reverse.D:
運行程序

用 OD 載入程序,運行

重新載入程序,按 F8 往下走

這里 eax 為 1 的話,跳轉到 jmp eax 這
此時 eax 的值為 1,jmp eax 跳轉到此處的話肯定會出錯
