逆向破解——程序去自校驗方法
自校驗
意思是這些程序會檢查自己有沒有被修改,如果發現被修改的話,便會離開或進行其它動作。基本的校檢方法包括 checksum, 檢查大小, 檢查跳轉代碼,等等。
什么情況下考慮自校驗
當一個程序脫殼前可以正常運行,脫殼以后不能運行,修復以后也不行,程序不能運行或者閃退、彈窗提示錯誤等,我們就要考慮是不是因為程序有自校驗了。
自校驗破解思路
將脫殼前和脫殼后的程序分別單步運行,對比找出關鍵跳轉,使得自校驗保護程序的跳轉不能實現。
實驗步驟
-
嘗試運行練習程序
-
查殼
-
ESP定律法脫殼,單步,數據窗口跟隨當前ESP值,設置硬件訪問斷點,運行到斷點處,單步運行到程序OPE
-
脫殼后提示程序被非法修改,不能運行。
-
嘗試修復,自動修復-->失敗
-
手動修復
-
IAT起始地址
-
IAT結束地址
-
size=25c-190=cc
-
手動修復IAT后
-
修復后仍不能運行,考慮自校驗,把脫殼后的程序發送到OD,原始程序脫殼完停留在OPE的界面不要關,我們來對比原始程序和脫殼完成的程序。
-
在命令輸入 bp CreateFileA,定位到kernel32的CreateFileA函數
-
CreateFileA是一個多功能的函數,可打開或創建以下對象,並返回可訪問的句柄:控制台,通信資源,目錄(只讀打開),磁盤驅動器,文件,郵槽,管道。
-
兩邊都對這個函數下斷點,然后運行到斷點處,再執行到用戶代碼。
-
先下API斷點,執行到斷點處,我們就來到函數內部;然后執行到用戶代碼,回到主程序中調用這個API的位置。
-
至於為什么是CreateFileA,我覺得自校驗之前可能要打開文件,讀取一些校驗信息。
-
接下來單步運行,對比脫殼前后兩個程序的跳轉。
-
這個跳轉在脫殼后的程序20145315_.exe里實現了;
-
但是在還未脫殼的程序 練習.exe 里沒有實現。
-
這是一個條件跳轉
cmp eax ,dword ptr ss:[ebp-0x8]
Jnz shoet 00401215
如果當前eax的值與ss:[ebp-0x8]相等,跳轉實現;
JE/JZ 等於轉移;
JNE/JNZ 不等於時轉移.
-
修改方法有很多種
-
比如,用Nop替換
-
保存到可執行文件
-
修改后正常運行
-
還可以做其他修改
-
比如直接修改匯編語言
cmp eax ,dword ptr ss:[ebp-0x8]
Jnz shoet 00401215
如果當前eax的值與ss:[ebp-0x8]相等,跳轉實現
JE/JZ 等於轉移
JNE/JNZ 不等於時轉移
把匯編語句修改為jz short 00401215
-
保存,顯示正常運行