题目:
链接: https://pan.baidu.com/s/1wQIwaCu99mYHX8gyqMfMMQ 提取码: qwcm

脱壳最好在windows XP环境中

使用工具:

  1. OD
  2. lordPE
  3. ImportREC

第一题:IT修复

1.查壳


UPX的壳,无难度

2.寻找OEP

用OD载入

先F8单步运行一步

发现ESP寄存器被改变,可以使用ESP定律

右键数据窗口跟随,|| 或者直接点HW break[ESP],此插件会自动帮忙下好硬件断点
数据窗口设置

从最开始的数据开始选,(别选太少就行)然后右键→断点→硬件访问→这里的三个随便选一个都可以,我一般选word
此时菜单栏→调试→硬件断点 已经有了我们下的断点

然后F9运行程序,来到这里,此时可以删除硬件断点了

然后F8单步往下
如果遇到向上图这样的,向上的代码,则在下一行代码(上图中的为地址0x004052E8)右键→断点→运行到选定位置(快捷键F4

删除图中的灰色代码(db 00)可以选择右键→分析→从模块中删除分析

分析完的模样

然后继续F8,此时出现了一个jmp大跳转(说明离OEP很近了)我们继续F8向下。
此时我们来到了OEP

脱壳的话,可以右键→用OllyDump脱壳调试进程,点脱壳就好

而此时我们练习手动修复IAT

3.使用lordPE进行dump

不要关闭OD,打开lordPE
然后将进程的浮块滑到最底部(lordPE的进程,最新的进程在最底部)
然后点击要附加的程序
右键→修正镜像大小

然后继续右键→完整转存

4.使用Import REC进行IAT修复

OD还是不能关
先打开ImportREC附加没有脱壳的已经到达OEP的进程(新的进程在最上面)

我们要记住OD脱壳插件中显示的OEP地址

或者记住OEP前面的地址也行

importREC有几个参数

  1. OEP栏:这里填写OEP的相对偏移地址就行,上面401000-400000=1000(也就是OD脱壳插件显示的那个OEP)
  2. RVA:虚拟内存地址,这里填IAT的起始位置
  3. 大小:填写导入表大小,需要用IAT的末地址减去首地址。(大小可以写大,但绝不能写小)
    相对地址则为实际地址减去基址(基址在OD中e窗口中查看)

如果自动搜索IAT的话,用如下步骤

获取导入表之后,<stron>
无效函数删除之后,再点【修正转储】
点击后会弹出一个窗口选择一个PE文件,我们选择之前lordPEdump出来的文件
然后脱壳完成。</stron>

5.手动查找IAT并修复

  1. 在OD中 右键→查找→所有模块间的调用


    然后双击一个程序本身的函数不要选系统函数
    来到函数调用处

    右键→跟随,进入函数(快捷键:回车)

    来到这里

    然后再右键→数据窗口中跟随→内存地址

    为了便于查看, 可以更改一下数据窗口的显示方式
    右键→长型→地址

    或者在下面的窗口里输入d xxx,其中xxx为jmp后的地址

    IAT段是连续的,向上找到开头,向下找到结尾

可以知道
起始:0x00402000
结束:0x0040200C
RVA:0x00402000 - 0x00400000 = 0x00002000(相对偏移地址)
大小:0x0040200C - 0x00402000 = 0xC

填入

然后获取导入表,删除无效函数(此程序没有无效函数),【修正转储】,选择之前用lordPE软件dump出的文件,确定。

可以正常打开,成功。

另一种寻找函数的方法:

用ImportREC进行IAT自动搜索,获取导入表,在导入表中找到一个函数,记录此函数的相对偏移
然后0x00002004 + 0x0040000 = 0x00402004得到此函数的地址,然后在od底部的命令框中输入d xxx,其中xxx为jmp后的地址,来达到找到IAT段的目的

第二题:脱壳练习2

步骤同第一题