Re-脱壳技术 脱壳实战(3): 脱壳及修复IAT
题目:
链接: https://pan.baidu.com/s/1wQIwaCu99mYHX8gyqMfMMQ 提取码: qwcm
脱壳最好在windows XP环境中
使用工具:
- OD
- lordPE
- ImportREC
第一题:IT修复
1.查壳
UPX的壳,无难度
2.寻找OEP
用OD载入
先F8单步运行一步
发现ESP寄存器被改变,可以使用ESP定律
右键数据窗口跟随,|| 或者直接点HW break[ESP],此插件会自动帮忙下好硬件断点
数据窗口设置
从最开始的数据开始选,(别选太少就行)然后右键→断点→硬件访问→这里的三个随便选一个都可以,我一般选word
此时菜单栏→调试→硬件断点 已经有了我们下的断点
然后F9运行程序,来到这里,此时可以删除硬件断点了
然后F8单步往下
如果遇到向上图这样的,向上的代码,则在下一行代码(上图中的为地址0x004052E8)右键→断点→运行到选定位置(快捷键F4)
删除图中的灰色代码(db 00)可以选择右键→分析→从模块中删除分析
分析完的模样
然后继续F8,此时出现了一个jmp大跳转(说明离OEP很近了)我们继续F8向下。
此时我们来到了OEP
脱壳的话,可以右键→用OllyDump脱壳调试进程,点脱壳就好
而此时我们练习手动修复IAT
3.使用lordPE进行dump
不要关闭OD,打开lordPE
然后将进程的浮块滑到最底部(lordPE的进程,最新的进程在最底部)
然后点击要附加的程序
右键→修正镜像大小
然后继续右键→完整转存
4.使用Import REC进行IAT修复
OD还是不能关
先打开ImportREC附加没有脱壳的已经到达OEP的进程(新的进程在最上面)
我们要记住OD脱壳插件中显示的OEP地址
或者记住OEP前面的地址也行
importREC有几个参数
- OEP栏:这里填写OEP的相对偏移地址就行,上面401000-400000=1000(也就是OD脱壳插件显示的那个OEP)
- RVA:虚拟内存地址,这里填IAT的起始位置
- 大小:填写导入表大小,需要用IAT的末地址减去首地址。(大小可以写大,但绝不能写小)
相对地址则为实际地址减去基址(基址在OD中e窗口中查看)
如果自动搜索IAT的话,用如下步骤
获取导入表之后,点按钮【显示无效的】,如果有导入表函数,右键删除即可
无效函数删除之后,再点【修正转储】
点击后会弹出一个窗口选择一个PE文件,我们选择之前lordPEdump出来的文件
然后脱壳完成。
5.手动查找IAT并修复
- 在OD中 右键→查找→所有模块间的调用
然后双击一个程序本身的函数不要选系统函数
来到函数调用处
右键→跟随,进入函数(快捷键:回车)
来到这里
然后再右键→数据窗口中跟随→内存地址
为了便于查看, 可以更改一下数据窗口的显示方式
右键→长型→地址
或者在下面的窗口里输入d xxx
,其中xxx为jmp后的地址
IAT段是连续的,向上找到开头,向下找到结尾
可以知道
起始:0x00402000
结束:0x0040200C
RVA:0x00402000 - 0x00400000 = 0x00002000(相对偏移地址)
大小:0x0040200C - 0x00402000 = 0xC
填入
然后获取导入表,删除无效函数(此程序没有无效函数),【修正转储】,选择之前用lordPE软件dump出的文件,确定。
可以正常打开,成功。
另一种寻找函数的方法:
用ImportREC进行IAT自动搜索,获取导入表,在导入表中找到一个函数,记录此函数的相对偏移
然后0x00002004 + 0x0040000 = 0x00402004得到此函数的地址,然后在od底部的命令框中输入d xxx
,其中xxx为jmp后的地址,来达到找到IAT段的目的
第二题:脱壳练习2
步骤同第一题