主題:實踐是檢驗真理的唯一標準
實驗一:UnPackMe_CrypKeySDK5.7.exe
PEiD查殼:
脫完殼之後會發現殼依舊殘留在程序中,所以需要把它去掉:
在這裏需要用PE Editor來載入文件,然後點擊sections,在相應的地方點擊右鍵找到刪除就可以了,之後點擊OK並且rebuildPE
自己的操作:
使用OD載入,切換到內存映像裏面:
然後F8單步執行
執行到RETN部分的時候,程序跳到了4271B0這個地方,這個地方屬於代碼區,所以進入的應該是OEP
那麼這個時候把內存中的映像DUMP下來:
這裏已經自己把其實地址和入口地址修改好了。然後點擊脫殼,選擇保存的位置和名稱。這裏需要注意的是不要重建導入表。否則會出錯。
dump出來的程序大小444kb
這裏還殘留着殼的程序,所以要把殼的部分刪除。使用LoadPE載入程序:
在區段中把3個屬於殼的區段給移除掉,結果是這樣的:
最後點擊保存後再重建就可以了。最後的大小是404kb。
================================================================
練習二:根據堆棧平衡原理尋找OEP
文件:UnPackMe_EZIP1.0.EXE
關注ESP的值,只要有變化就可以下一步行動。數據窗口中跟隨,並下硬件斷點
自己的操作:
這個文件是用壓縮殼進行加殼的。依舊用OD打開:
看到這個入口點都是一堆jmp指令。先用F8進行單步調試,看到跳到了push和mov,但是這裏仔細分析還不是正真的區塊:
這裏的虛擬地址是4682DC,而從od的區塊可以看到整整的代碼段應該是再401000-44B000之間
當程序繼續往下執行一步之後會發現ESP變了,再ESP處點擊右鍵找到數據跟隨
隨便選中一塊地方,然後右鍵添加硬件斷點,這裏word和dword都可以
之後F9執行程序,發現程序在這裏停下了
寄存器可以看到此時的EAX是4271B0,是屬於代碼段的範圍:
再F8後看到跳到了以下界面
這時候算是程序的原始內容了。然後dump出內容:
這裏依舊不要重建導入表,之後dump保存
接着用LoadPE,查看區塊:
這裏可以看到代碼基址和數據基址都還是6開頭,不是原始的,所以需要進行修復。同時還要去除多餘的區塊。移除完成之後剩下的區塊如下:
同時修復那兩個基址:
最後就是保存和重建。完工