脱壳步骤二-修复

常规操作

1、寻找OEP:OD载入,找到OEP,停在OEP处(一般在push ebp代码处)。

2、生成转存文件:打开LordPE,选中程序的进程,右键“修正镜像大小”,然后右键“完整转存”,输入文件名,保存。此步也可用OD自带的插件进行,在代码区右键“用OllyDump脱壳调试进程”,此外如果勾选了“重建输入表”,后面就不需要再用ImportREC修正输入表了,如果不勾选,则需要进入第3步的操作。输入文件名,保存。

3、修正输入表:打开ImportREC,附加到程序的进程,输入寻找到的OEP地址(即OEP处的push ebp这句代码的地址),注意,输入的是偏移地址,如OEP的地址为:00403831,输入时只须输入3831即可。输入地址后,点击“自动查找IAT”按钮,然后点击“获取输入表”,点击“显示无效函数”,如果存在无效函数,则可在无效函数上右键“剪切指针”去除无效函数。最后点击“修复转存文件”按钮,选择在第二步中生成的转存文件,确定,脱壳即可完成。

 

异常处理:

1、提示数据错误

运行脱壳后的程序时,提示数据错误。此错误一般是由附加数据引起的。查壳时,比如NsPack 1.4 -> Liuxingping [Overlay] *,其中的[Overlay]即说明该程序存在附加数据,而对脱壳后的程序进行查壳,就没有了[Overlay],所以需要把附加数据从源文件添加到脱壳后的文件中。此问题的处理方式为:

(1)打开LordPE,“PE编辑器”按钮,选择原始程序(未脱壳的),打开,进入编辑器界面,点击“区段”按钮,进入区段表界面,查看最后一个区段的ROffset和RSize两个值,这两个值相加的结果即为附加数据的起始地址。以下以相加结果为00028400为例。

(2)打开WinHex(注意,如果WinHex打开时有问题,一般是目录没设置好,设置方法为菜单“选项”->“综合选项”(有的叫“常规”),进入设置界面,此界面中的临时文件目录和镜像备份目录必须是存在的,如果不存在,打开时就会提示错误)。用WinHex打开未脱壳的原始程序,找到上一步中得到的地址,在该地址处“选块开始”,然后在最末尾处“选块结束”,将选中的块Ctrl+C复制。

(3)用WinHex打开脱壳后的文件,在文件的末尾处粘贴,保存文件,即可解决脱壳后的程序数据错误的问题。

2、手动查找IAT信息

在修正输入表时,输入OEP地址后,可以“自动查找IAT”,也可以手动查找,查找方法为:

(1)OD载入,到达OEP后,在代码区域随便找一句调用系统函数的代码(call 系统函数),在这句代码上右键“跟随(Enter)”,即可找到有大片jmp的地方,上滚到第一个,该条数据中的地址减去基址再往前走4-8个字节(一般可使用8个字节)即为IAT的开始地址(RVA),如第一个jmp为:

004C8988  - FF25 0C014E00   JMP DWORD PTR DS:[4E010C]                ; ADVAPI32.RegCloseKey

则IAT的开始地址为:4E010C - 400000 - 8= E0104。

下滚到这一片jmp的最后一条(中间有INT3之类的可以忽略),如:

004C93CA  - FF25 E80E4E00   JMP DWORD PTR DS:[4E0EE8]                ; OLEAUT32.VariantInit

则IAT的结束地址为:4E0EE8 - 400000 + 8= E0EF0。

则IAT的大小为:E0EE8 - E010C = DEC。

(2)OD载入,到达OEP后,F8单步走,遇到调用系统函数的地方,F7步入,也可到达大片jmp的地方。计算方法同(1)。

发布了24 篇原创文章 · 获赞 9 · 访问量 19万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章