0x1 查殼
將程序拖入!Exeinfo PE顯示如下。
程序拖入OD
看到第一行有pushad
指令,利用ESP定律,執行一步F8。ESP定律是典型的堆棧平衡,因爲只要保存了所有寄存器的值都是要開始解密操作,等到解密完成後一般都會將所有初始化的寄存器值進行還原,即popad
。所以我們只要在esp堆棧壓入的最後一個數據那裏設置硬件斷點(因爲堆棧式先進後出原則,esp現在指向的是壓棧的最後的數據,還原時肯定會先從這塊數據還原),當執行popad還原寄存器時的位置,一般這個指令位置都是解密後的數據。
所以我們右鍵選擇數據窗口跟隨
在esp指向的內存處設置硬件訪問斷點
讓程序繼續執行,發現斷到popad
下一條指令位置,可以清楚的看到mov edx,0x004271b0
這條指令。這很明顯是進入了用戶進程的代碼段了,按常理說就應該是個教大距離跳轉,這往往就是程序從加密殼區段跳轉到解密後的代碼段的過程,跳轉到用戶進程的OEP。
繼續向下執行,執行jmp edx
指令,基本斷定該處爲OEP。
確定了OEP爲0x4271b0後,接下來該進行內存Dump
接下來檢查要Dump的內存OEP是否和目前OEP值相等,相等就點擊脫殼按鈕
Dump完成後接下來修復導入表
選擇當前正在運行的程序
修改解密後的OEP
點擊自動查詢IAT表,也就是導入地址表。
接下來獲取導入函數
轉儲導入函數表
轉儲之後會新生成一個脫殼文件,運行轉儲後的脫殼文件。脫殼成功。