基础脱壳教程4:手脱FSG壳

基础脱壳教程4:手脱FSG壳

方法很多, 单步法或者 ESP 定律法都可以

这里我们用单步跟踪

单步发现一个连续的跳转, 然后发现一个无条件跳转 jmp

一般作者防止自己软件被脱壳, 会把 OEP 地址存放在寄存器中, 本例中是在 [ebx+C]

FSG 2.0 -> bart/xt

重点为修复

修复步骤是 : LordPE 修正镜像大小, 完整转存

然后 ImportREC 输入 OEP A86D, 然后获取 IAT, 获取输入表, 只有一个函数, 无无效函数, 修复转存文件 fix dump

查壳发现壳已经脱掉了, 是 VC++ 程序, 然后发现无法运行

我们来手动查找 IAT

视频中随便找了一个 call dword ptr ds:[425210], 这里也可以找其他函数, 不过要注意找的是程序的函数而不是系统的函数

减去基址 00400000 就是 25210, 我们在 ImportREC 显示出的函数中找一下这个

找到这个之后发现是个 getVersion, 与 OD 中显示的是一致的

然后我们在 OD 命令行中输入 d 425210

然后 OD 在数据窗口 (左下角) 列出了一大堆指针

CTF wiki 中给了一种操作更加简单的方法 :

在 OEP 处右键查找>所有模块间的调用, 显示出调用的函数列表,

我们双击其中的某个函数 (注意这里要双击的应该是程序的函数而不是系统函数) ,

然后右键跟随, 进入函数, 然后右键 数据窗口中跟随->内存地址,

这里因为显示是十六进制值, 不方便查看, 我们可以在数据窗口点击右键选择长型->地址, 就可以显示函数名.

现在我们用鼠标向上拉

拉到第一个 00000000 为止, 也就是 IAT 表的起始位置

然后记下 000000 下面那个不为零的地址 00425000 77DA6BF0 ADVAPI32.RegCloseKey

然后向下拉, 找到最后一个函数, 记下地址 00425280 7C838DE8 kernel32.LCMapStringA

ImportREC 重新载入一下, RVA 也即是起始地址这里我们写 00425000 减去基址, 也就是 25000

IAT 大小就是 00425280 - 00425000 = 280,

当然, 我们可以直接在大小这里输入 1000(不过会带来很多垃圾指针),

从第一个函数拖到最后一个函数, OD 下方会显示块大小0x280

然后获取输入表, 直接把无效函数删掉就好, 然后就是 转存到文件 了 (视频里是修复转存文件, 也就是Fix dump)

程序运行成功 ~

(手动、查找IAT)


特殊的 ESP 定律法, 或者说是 FSG2.0 这种壳专用的 ESP 定律法

单步跳到0040015B 94 xchg eax,esp ; qqspirit.0047A208

看右下角的堆栈窗口, 从上看到下第四个就是 0040A486D, 就是刚才我们找到的 OEP

然后我们右键, 选择在反汇编窗口中跟随, 记得删除分析, 出现这种空代码0040A86D 0000 add byte ptr ds:[eax],al

不用怕, 在这里下断点, 右键断点>设置硬件执行断点, 然后 shift+F9 运行直接跳到 OEP