前言
压缩壳(大部分)和加密壳脱壳后, 在OEP处Dump出来后, 都需要IAT修复. 否则运行报错.
今天练习了脱壳后的IAT修复, 将流程点记录一下.
记录
OEP处dump的工具
OllyDump(修复导入表dump和不修复导入表dump)
LordPE(有些壳dump不出来)
PeTools
OD在OEP处, 用这几种工具, 将PE映像Dump出来.
用这几种工具都Dump一下, 如果Dump出来的这几种PE映像都不能正常运行, 再进行IAT修复.
脱壳工具
ImportREC, 看雪大礼包里的有1.6和1.7C版, 我用的1.7C.
脱壳操作
ImpREC的选项可能要设置一下”Create New fresh IAT”.
打开ImpREC, 在进程列表中选择OD中停在OEP处的待脱壳进程.
根据OD停住的OEP, 填入ImpREC中的OEP输入框中, OEP值不带段值(e.g. OEP = 004271B0, 要填的OEP值为000271B0).
点击自动搜索, ImpREC会搜到一些IAT地址范围.
随便在OEP附近找一个API地址, 去看看IAT项在哪, 是否在ImpREC找到的范围内, 是否有遗漏.
ImpREC不会找错IAT范围, 只会有遗漏.
如果ImpREC找的IAT范围有遗漏, 自己将IAT范围改大(开始地址往低地址改, RVA的值填第一个IAT项前面的地址, size往大改), 套住整个的IAT项范围.
IAT项开始地址在OD的Memory区按照long型地址显示, 能看到地址中内容是API地址.
如果套的太大了, ImpREC取IAT时, 会有很多无效项, 需要自己cut掉.
有时, 由于壳自己填的错数据(程序并不用), 也会出现无效项.
点击按钮”Show Invalid”, 会显示出所有的无效导入函数项. 在无效项上右击,选择cut删掉无效项.
点击ImpREC的按钮GetImports, 去取IAT中的API导入地址.
如果得到的导入函数项都有效(或者将无效项cut掉), 就可以点击按钮”fix Dump”, 弹框后, 选择已经dump出来的PE映像.
然后试试IAT修复后的PE是否能正常运行, 用不同PE工具, dump出来一共有4个待修复PE镜像, 总有几个能用的, 如果都不能用, 那就是IAT修复参数填错了. 如果OEP或IAT的RVA和SIZE填错了, 在”GetImports”时, 得到的IAT项列表应该有很多无效项, 或IAT代表的DLL比实际的DLL数量少, 那时就应该发现不对头了.