upx3.94手动脱壳

时间:2024-04-07 14:00:07

工具:
吾爱**论坛Ollydbg
ImportREConstructor

upx3.94下载地址:https://github.com/upx/upx/releases/download/v3.94/upx394w.zip

环境:XP(还是XP下方便,win7有ASRL干扰,ImportREConstructor识别的基地址不对)

自己写了一个很简单的程序,用upx加壳,使用ESP定律脱壳。

  1. OD加载crackme.exe,找到入口点,发现pushad指令
    upx3.94手动脱壳
  2. F8单步,在ESP上 右键 -> HW break [ESP] 下硬件断点
    upx3.94手动脱壳
  3. F9执行,断住的地方离OEP就不远了。下图中下面那个jmp就是跳转到OEP的指令
    upx3.94手动脱壳
  4. 去掉第2步中的硬件断点,走到OEP
    upx3.94手动脱壳
    F8再走一步,这里就是入口函数了
    upx3.94手动脱壳
  5. 点右键,用OllyDump脱壳调试进程
    upx3.94手动脱壳
    起始需要填写正确的地址,点击E按钮可以看到,这里为12B0000,入口点为12C17F0-12B0000=117F0
    下面的重建输入表不要勾选,我们后面使用ImportREConstructor来重建输入表
    点“脱壳”保存为dump.exe
  6. 使用ImportREConstructor来重建输入表
    前面的OD不要退出,打开ImportREConstructor附加到crackme.exe进程,填写上正确的OEP 117F0,点击“IAT自动搜索”,可以搜到。但我这里使用手动来找导入表,在第4步中,找到call指令,回车跟进去
    upx3.94手动脱壳
    再回车跟进去,可以看到调用kernel32.GetSystemTimeAsFileTime
    upx3.94手动脱壳
    0x12C81C0附近应该就是导入表的地址,内存中查看0x12C81C0
    upx3.94手动脱壳
    [0x12C81C0]=0x760334E9就是kernel32.GetSystemTimeAsFileTime,对应0x12C8190~0x12C8210就是kernel32.dll中函数地址
    下面0x12C8240~0x12C82C0是msvcr100d.dll中函数地址
    回到ImportREConstructor,填写RVA为0x012C8190-0x012B0000=0x00018190,大小中填入0x130,点击获取输入表,两个dll的都找到了
    upx3.94手动脱壳
    点击“修正转储”,选择第5步保存的dump.exe文件,确定,生成的dump_.exe就可以直接运行了。

参考
逆向基础——软件手动脱壳技术入门
简单脱壳教程笔记(2)—手脱UPX壳(1)
使用Ollydbg从零开始学**第31-37课分享