前面講了如何尋找OEP和脫殼,有的時候,Dump出來的時候不能正常運行,是因為還有一個輸入表沒有進行處理,一些加密殼會在IAT加密上面大做文章,用HOOK - API的外殼地址來代替真是的IAT的地址,讓脫殼者無法正確的還原程序的原始IAT,使得程序不能被破解,所以我們處理這些被加密IAT的地址的辦法是找到加密這些IAT的地址的跳轉(就是Magic Jump),將它修改為強制跳轉(JMP),使之無法加密IAT,從而達到脫殼修復的目的!
因為程序的IAT是連續的排列的,所以我們只需要找到IAT的起始位置和末位置,就可以確定IAT的地址和大小!有的IAT是JMP 類型的,有的是CALL類型的,所以,要想確定IAT的地址,就要先知道這個程序是怎樣調用IAT的,例如:
其對應的匯編是CALL DWORD PTR DS:[465198],即直接調用[465198]里的函數,地址465198在IAT中,指向GetVersion函數,我們點擊004464F7這句指令,右鍵,跟隨到數據窗口,內存地址!
此時的465198就是IAT的一部分,可以在數據窗口查看到它的內容:
我們右鍵,長型,地址查看:
這樣就可以看到其他的函數的函數名字了:
我們向上面翻,找到數據為0的dword的間隔,IAT最后是以0結尾的:
這個加殼程序的IAT的地址是:00464FFC,那么它的大小為:00465698 - 00464FFC = 69C.
此時就可以利用ImportREC來進行修復了!
輸入程序的OEP和剛剛得到RVA和大小,點擊獲取輸入信息,修復轉存,抓取DUMP的程序,進行修復,修復完畢后,運行修復后的程序,程序可以正常的運行:
注意點:
1.在ollydbg里面入口處地方,用olldump先將需要dmp的dll或者exe dmp到指定目錄
2.用ImportREC附加需要重定位的exe或者內部的dll,fixdmp時候選擇剛剛保存的dll。
附下載版文章:
http://www.2cto.com/uploadfile/2012/1205/20121205071819691.zip