UnPackMe_ASPack2.12的IAT修复 19.05.13

UnPackMe_ASPack2.12的IAT修复

在ESP寄存器值上面单击鼠标右键选择-数据窗口中跟随,就可以在数据窗口中定位到刚刚通过PUSHAD指令保存的寄存器环境了,选中前4个字节,单击鼠标右键选择-硬件断点-硬件访问-Dword,这样就可以给这4个字节设置硬件访问断点了。
UnPackMe_ASPack2.12的IAT修复 19.05.13
UnPackMe_ASPack2.12的IAT修复 19.05.13
按F9键运行起来。
UnPackMe_ASPack2.12的IAT修复 19.05.13
断在了POPAD指令的下一行,我们直接按F7键单步跟踪到OEP处。
UnPackMe_ASPack2.12的IAT修复 19.05.13
现在可以对该进程进行dump了,在菜单栏中找到OllyDump插件。
UnPackMe_ASPack2.12的IAT修复 19.05.13
UnPackMe_ASPack2.12的IAT修复 19.05.13
将导出的EXXE文件运行,打开IMP REC,定位到UnPackMe_ASPack2.12所在的进程。
UnPackMe_ASPack2.12的IAT修复 19.05.13
因为是成功复现后才写的流程,所以RVA和SIZE都是对的。
UnPackMe_ASPack2.12的IAT修复 19.05.13
接下来需要定位IAT的起始地址以及大小,我们随便找一个API函数的调用处,好,OEP的下面正好有一处CALL GetModuleHandleA。选中CALL GetModuleHandleA这一行,单击鼠标右键选择-Follow。
UnPackMe_ASPack2.12的IAT修复 19.05.13
跳转后看见该内存单元中保存了GetModuleHandleA的入口地址。直接搜索二进制串FF 25,看看能不能定位到跳转表。定位到跳转表,接着我们在数据窗口中定位到IAT。
UnPackMe_ASPack2.12的IAT修复 19.05.13
将最后一个DLL中的IAT项标注出来了,地址是77AXXXXX的形式,单击工具栏中的M按钮,在区段列表窗口中看看这类地址是属于哪个DLL。这里我们可以看到这些地址是属于kernel32.dll的代码段。这里IAT中的最后一个起始地址为401214,所以401218是IAT的结束位置。我们往上搜寻起始位置,发现是40119C
UnPackMe_ASPack2.12的IAT修复 19.05.13
信息都到位了。
OEP = 4000 (RVA)
IAT的起始地址 = 119C (RVA)
IAT的大小 = 401218 - 40119C = 7C。
点击Get Imports。
UnPackMe_ASPack2.12的IAT修复 19.05.13
看到数据,其中中间有一项是垃圾数据。是问题的根源。
UnPackMe_ASPack2.12的IAT修复 19.05.13
删除这些垃圾数据。
UnPackMe_ASPack2.12的IAT修复 19.05.13
最后在Fix Dump导出数据,在运行导出的EXE文件。
UnPackMe_ASPack2.12的IAT修复 19.05.13
IAT就修复成功了。