• 标 题:对 Authorware 4 中 U32 类型文件的脱壳测试 ----- 告别前的最后一篇脱文 (5千字)
  • 作 者:ljttt
  • 时 间:2000-8-17 8:52:54
  • 链 接:http://bbs.pediy.com

对 Authorware 4 中 U32 类型文件的脱壳测试    ----- 告别前的最后一篇脱文

【声明】
我写文章以交流为主,希望大家在转载时能保持文章的完整性。

【前言】
由于Authorware 4中的 U32 类型文件其实是动态链接库文件,因此对这些 U32 文件的脱壳其实和对 DLL 脱壳的方法相似。
对 Authorware 我实在不熟悉,花了半天时间,才弄清楚怎样在 Authorware 中加载 U32 类型文件。
由于上次我已经用PECompact加壳一个DLL脱壳测试过。这次就换另一种加壳程序试试。我选中了Aspack v2.1。

样例文件:    ODBC.U32    (Authorware v4.0所带文件)
加壳方式:    Aspack v2.1加壳
调试工具:    SoftICE v4.05,PEditor v1.5,Hex WorkShop 2.10
目标:        脱壳
作者:        ljttt
写作日期:    2000-08-16

(简称说明:EP: Entry Point,DLL: 动态链接库文件)

1、首先当然要分析基本信息了。用PEditor打开动态链接库文件,得到如下信息
Entry Point:    0000C001
Image Base:    10000000
Size of Image:    0000F000

Section        Virtual Size    Virtual Offset
.idata        00001000    00009000

2、现在我们要在动态链接库的入口点处中断,这次我用《对PECompact加壳的DLL脱壳的一点分析》一文中的第二种方法。

一、首先,用PEditor打开ODBC.U32文件,然后单击 FLC 按钮(这个功能是帮你计算Virtual Address转换为 Offset的)
输入 1000C001 ,单击 DO! 按钮,得到 Offset[hex] 为 4001。
二、然后,用Hex WorkShop打开ODBC.U32文件,定位到 4001,记下此处字节的值 60。
三、然后,用Hex WorkShop把 4001 处的字节 60 改为 CC。
四、Ctrl-D中断进入SoftICE,设断点 bpint 3。
五、F5回到Windows,运行Authorware 4.exe。(主程序文件)

这时,程序还没有加载ODBC.U32文件,单击菜单 Insert / Load Model,选择主程序目录下的 TEMPLATE/CONSUMER子目录下的QSADCONS.A4D文件,然后单击菜单 Insert / Paste Model,选择 QS:Administration - Cons.。程序开始加载ODBC.U32,此时将中断进入SoftICE。

3、下指令,修改程序入口的指令 CC 为 60。
eb eip 60
修改后代码窗口显示如下:
015F:03C6C001  60                  PUSHAD                <--我们中断在此
015F:03C6C002  E872050000          CALL      03C6C579
015F:03C6C007  EB33                JMP      03C6C03C
015F:03C6C009  87DB                XCHG      EBX,EBX
015F:03C6C00B  90                  NOP
015F:03C6C00C  0000                ADD      [EAX],AL
015F:03C6C00E  0000                ADD      [EAX],AL

注意我们中断时的 IP 为 03C6C001,而不是 10000000+C001=1000C001,这说明Windows加载ODBC.U32的基地址不是 10000000,我们来计算一下实际加载的基地址: 3C6C001-C001=3C60000。(我跟踪发现每次加载的基地址都不一样)

4、继续跟踪,到如下(也可用 bpm 3C60000+9000 来跟踪 .idata 的变化情况来快速跟踪)
015F:03C6C2C9  F3A4                REPZ MOVSB
015F:03C6C2CB  5E                  POP      ESI
015F:03C6C2CC  6800800000          PUSH      00008000
015F:03C6C2D1  6A00                PUSH      00
015F:03C6C2D3  FFB5E1394400        PUSH      DWORD PTR [EBP+004439E1]
015F:03C6C2D9  FF95ED394400        CALL      [EBP+004439ED]
015F:03C6C2DF  83C608              ADD      ESI,08
015F:03C6C2E2  833E00              CMP      DWORD PTR [ESI],00
015F:03C6C2E5  0F8526FFFFFF        JNZ      03C6C211
015F:03C6C2EB  6800800000          PUSH      00008000
015F:03C6C2F0  6A00                PUSH      00
015F:03C6C2F2  FFB5E5394400        PUSH      DWORD PTR [EBP+004439E5]
015F:03C6C2F8  FF95ED394400        CALL      [EBP+004439ED]        <---在此处停下来
015F:03C6C2FE  8B9D60394400        MOV      EBX,[EBP+00443960]
015F:03C6C304  0BDB                OR        EBX,EBX
015F:03C6C306  7408                JZ        03C6C310

此时 3C69000 (.idata所在的内存地址) 处的内容如下
015F:03C69000 00009064  00000000  00000000  000092A2      d...............
015F:03C69010 00009150  00009148  00000000  00000000      P...H...........
015F:03C69020 000092C0  00009234  00009108  00000000      ....4...........

5、在此处我们要得到还原好的import table。下指令
/dump 3C69000 1000 c:\temp\dump.bin

6、继续跟踪,到如下
015F:03C6C4EA  59                  POP      ECX
015F:03C6C4EB  0BC9                OR        ECX,ECX
015F:03C6C4ED  89852F3E4400        MOV      [EBP+00443E2F],EAX
015F:03C6C4F3  61                  POPAD                                       
015F:03C6C4F4  7508                JNZ      03C6C4FE                (JUMP ) 
015F:03C6C4F6  B801000000          MOV      EAX,00000001
015F:03C6C4FB  C20C00              RET      000C
==> 03C6C4FE  68001CC603          PUSH      03C61C00            <---3C61C00 就是我们要找的OEP了
015F:03C6C503  C3                  RET                    <---在此处停下来

7、这里到了我们得到整个程序内存映象的时候了。
/dump 3C60000 F000 c:\temp\dump.u32
记下此处我们得到 OEP RVA = 3C61C00 - 3C60000 = 1C00。(也就是要减去实际基地址3C60000)

8、F5回到Windows,结束主程序。开始修补dump.u32。用PEditor打开dump.u32文件,选择sections,右键打开菜单,选择dumpfixer。OK!一次完成所有Section的RVA、Size的转换工作。再修改Entry Point为 1C00,单击apply changes保存,选择directory,修改其中的Import Table的RVA为 9000,Size为1000。单击保存。

9、用Hex WorkShop打开dump.u32和dump.bin,定位dump.dll位置到 9000,选择 1000 个字节。删除。
选择dump.bin的 1000 个字节,复制到dump.dll中。保存。

10、把dump.u32复制到主程序目录下,换名为ODBC.U32。重新运行主程序Authorware 4.exe。测试成功。

【后记】
从测试的几个DLL脱壳情况来看,加壳程序一般没有对Export table做处理。不知道Export table象import table一样加密后会怎么样。我还不太了解Windows对Export table的加载处理机制。万一遇到这种情况,我一定死翘翘了。不过还好,实验测试中没发现此类事件。不过真正的商业软件加的壳就不一定了。
但愿等我把export table的加载处理机制弄清楚了,再遇到这类软件。到那时,(俺手拿牛二尖刀,一脸阴笑)嘿嘿...................

【本月小结】
不知不觉,一个月就过去了。算下来俺也写十余篇脱文。感觉进步不少,这里要多谢看雪教学中各位高手精彩的文章给了我很大的帮助,投桃报李,因此俺也把自己的一点点所得写了出来。无奈俺用隔月上网的方式来减少网费,所以如果哪位朋友给我写信,可能只有等到我 9 月 20 日再次上网以后才能回复了。Email:ljtt@yeah.net