逆向破解——程序去除自校驗


逆向破解——程序去自校驗方法

自校驗

意思是這些程序會檢查自己有沒有被修改,如果發現被修改的話,便會離開或進行其它動作。基本的校檢方法包括 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

  • 保存,顯示正常運行


免責聲明!

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



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