脱壳小练习(一)
使用工具
- OllyDbg 1.10原版,简称
OD
; OD
汉化
和插件
均来自互联网;- UnPackMe来自互联网,仅供学习使用;
- Dump 工具为 PETools,来自互联网;
- IAT 重建工具为 ImportREC,来自互联网;
- 文中特殊数字均是
HEX
,为了书写方便采用DEC
;
操作流程
将 CM 导入 OD,使用内存访问法定位 OEP(这种方式设置的断点是一次性的):
原理是:加壳程序运行时,会依次解压各区段,所以,访问后会中断;
运行程序后,程序中断两次:
中断后查看提示信息,程序访问了代码段,所以触发了断点,再次运行程序:
程序再次中断,程序访问了第 2 个设置断点的区段,此时说明代码段已经解压完成了;
再次来到内存窗口,给代码段设置 F2 断点,然后运行程序:
原理是:既然代码段已经解压完毕了,如果再次访问,就是原程序运行的时候;
从模块中删除分析后,就可以看到程序的本来面目了;
然后打开 PETools,选择当前 CM 进程,右键菜单选择完整转存并保存到可执行文件:
回到 OD,定位到 IAT,查看 IAT 起始位置(RVA)及结束位置(RVA),计算 Size:
通过 GetVersion 函数的地址,定位到 IAT;
通过计算得知:
- OEP 的 RVA 为:271B0;
- IAT 的 起始地址 RVA 为:60818;
- IAT 的 Size 为:60F28 - 60818 = 710(Hex);
打开 ImportREC 填写相关选项并获取:
获取完成后,检查获取的数据:
手动或通过显示无效选项检查获取数据是否有效;
确认无误后点击修复转存按钮,选择转存的程序,就完成修复了;
将修复后的程序导入 OD,查看 log 窗口:
没有异常,说明程序正常运行;
然后定位到 IAT,随便选择一个函数,右键菜单查看可执行文件,到达函数 IMAGE_THUNK_DATA 结构体;
这里存放的是函数名字符串的 RVA,
Ctrl + G
跳转到 VA 查看函数名字符串;确认函数名和 IAT 显示的函数名一致,脱壳完成;