工具:
吾爱**论坛Ollydbg
ImportREConstructor
upx3.94下载地址:https://github.com/upx/upx/releases/download/v3.94/upx394w.zip
环境:XP(还是XP下方便,win7有ASRL干扰,ImportREConstructor识别的基地址不对)
自己写了一个很简单的程序,用upx加壳,使用ESP定律脱壳。
- OD加载crackme.exe,找到入口点,发现pushad指令
- F8单步,在ESP上 右键 -> HW break [ESP] 下硬件断点
- F9执行,断住的地方离OEP就不远了。下图中下面那个jmp就是跳转到OEP的指令
- 去掉第2步中的硬件断点,走到OEP
F8再走一步,这里就是入口函数了
- 点右键,用OllyDump脱壳调试进程
起始需要填写正确的地址,点击E按钮可以看到,这里为12B0000,入口点为12C17F0-12B0000=117F0
下面的重建输入表不要勾选,我们后面使用ImportREConstructor来重建输入表
点“脱壳”保存为dump.exe - 使用ImportREConstructor来重建输入表
前面的OD不要退出,打开ImportREConstructor附加到crackme.exe进程,填写上正确的OEP 117F0,点击“IAT自动搜索”,可以搜到。但我这里使用手动来找导入表,在第4步中,找到call指令,回车跟进去
再回车跟进去,可以看到调用kernel32.GetSystemTimeAsFileTime
0x12C81C0附近应该就是导入表的地址,内存中查看0x12C81C0
[0x12C81C0]=0x760334E9就是kernel32.GetSystemTimeAsFileTime,对应0x12C8190~0x12C8210就是kernel32.dll中函数地址
下面0x12C8240~0x12C82C0是msvcr100d.dll中函数地址
回到ImportREConstructor,填写RVA为0x012C8190-0x012B0000=0x00018190,大小中填入0x130,点击获取输入表,两个dll的都找到了
点击“修正转储”,选择第5步保存的dump.exe文件,确定,生成的dump_.exe就可以直接运行了。
参考
逆向基础——软件手动脱壳技术入门
简单脱壳教程笔记(2)—手脱UPX壳(1)
使用Ollydbg从零开始学**第31-37课分享