脱壳小练习(二)
使用工具
- OllyDbg修改版,简称
OD
; OD
汉化
和插件
均来自互联网;- UnPackMe来自互联网,仅供学习使用;
- Dump 工具为 PETools,来自互联网;
- IAT 重建工具为 ImportREC,来自互联网;
- 文中特殊数字均是
HEX
,为了书写方便采用DEC
;
操作流程
将 CM 导入 OD,在尝试了
内存访问法
和栈平衡法
都不能到达 OEP 后,使用 SPOD(Special OD,个人称呼)配合常用函数法
最终到达 OEP;将 CM 导入 SPOD,goto 到 GetProcAddress 函数的行首,设置条件记录断点,记录调用 GetProcAddress 函数的地址及参数:
清空 log,然后运行程序;
打开 log 窗口,对比各区段偏移后,发现外壳最后一次调用 GetProcAddress 函数的地址为 00478095:
重载程序,修改条件记录断点为条件断点:
然后运行程序;
程序中断后,给代码段设置内存执行断点,取消其它断点,运行程序;
删除模块分析后,确认程序到达 OEP;
跟随任意 CALL,确认有调用输入函数后,继续跟随即可定位 IAT,此处为间接调用;
查看 IAT 的起始地址和结束地址,计算 Size;
OEP 的 RVA 为:40300;
IAT 的起始地址 RVA 为:430F0;
IAT 的结束地址 RVA 为:43674;
IAT 的 Size = 43674 - 430F0 = 584;使用 PETools 将内存数据 Dump 并保存为可执行文件;
打开 ImportREC,填写相关选项,然后获取输入表:
检查没有无效信息,修复程序;
程序可以运行,将程序导入 OD,检查 IAT:
检查任意函数的名称字符串:
都没有问题,脱壳完成!