• 标 题:对 CreateInstall 2000 的脱壳 (10千字)
  • 作 者:ljttt
  • 时 间:2000-8-12 16:01:53
  • 链 接:http://bbs.pediy.com

对 CreateInstall 2000 的脱壳

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

【前言】
CreateInstall 2000属于那种难脱的Asprotect加壳程序(也就是我前面所说的第三类Asprotect加壳程序),找OEP的难点虽然已经解决,但是import table的重建问题依然没有找到一种统一的方法,这次对CreateInstall 2000脱壳的方法只是一种,此法对有些Asprotect加壳的程序还是无效。
不过也算是开拓一种思路吧,就写了此文。

样例文件:    CI2000.EXE    (CreateInstall 2000的主程序文件)
加壳方式:    ASProtect + ASPack v1.084
检测工具:    FileInfo
脱壳工具:    SoftICE v4.05,ICEPatch v2.0,PEditor,Imp_List
目标:        脱壳
作者:        ljttt
日期:        2000-08-12

1、当然依然是获取有关程序的信息,这次我用PEditor。因为它很方便,一来它可以在右键菜单中出现。二来可以直接看到import table中的各个引入函数。三来,后面你就知道了。所以它是脱壳必备工具。
Entry Point:    0003F001
Size of image:    00053000
Image Base:    00400000

.idata Section
Virtual Offset:    00038000
Virtual Size:    00002000

2、Ctrl-D中断进入SoftICE,设断点
bpx CreateFileA do "p ret"

3、按 F5 键回到Windows,运行CI2000.EXE。中断进入SoftICE。
4、刚开始中断你在Explorer的怀抱,(你可以看右下角的文字,它显示的是当前中断在哪个Module),按 F12 键,看看右下角的文字,这次不错,在CI2000.EXE中,然后按 F12 键数次,直到你发现如下特征处

015F:004AB622  8B45EC              MOV      EAX,[EBP-14]    <--注意此处
015F:004AB625  3B45F0              CMP      EAX,[EBP-10]    <--注意此处
015F:004AB628  7443                JZ        004AB66D        <--如果比较的结果相同,就跳转了,否则就到下面显示File corrupted! 的框框了
015F:004AB62A  8A1508144B00        MOV      DL,[004B1408]

5、这是CRC检测的地方,(前文已有介绍。国外大师的文章也多次提到)。然后按 F12 键两次来到如下

015F:004AB957  E828FAFFFF          CALL      004AB384
015F:004AB95C  33C0                XOR      EAX,EAX        <--你停下此处
015F:004AB95E  5A                  POP      EDX
015F:004AB95F  59                  POP      ECX
015F:004AB960  59                  POP      ECX
015F:004AB961  648910              MOV      FS:[EAX],EDX
015F:004AB964  EB11                JMP      004AB977
015F:004AB966  E9E900FFFF          JMP      0049BA54

6、好,到了我们熟悉的地盘,它别想兴风作浪了。
7、向下翻页找到如下(当然如果你是初手,建议一步步的来,熟悉了以后,再简化你的步骤)

015F:004AB9FF  8D4824              LEA      ECX,[EAX+24]
015F:004ABA02  8B4508              MOV      EAX,[EBP+08]
015F:004ABA05  8B500C              MOV      EDX,[EAX+0C]
015F:004ABA08  8B4508              MOV      EAX,[EBP+08]
015F:004ABA0B  8B4008              MOV      EAX,[EAX+08]
015F:004ABA0E  E81DF1FFFF          CALL      004AAB30        <--注意此Call调用
015F:004ABA13  33C0                XOR      EAX,EAX        <--在此处要停下来
015F:004ABA15  5A                  POP      EDX
015F:004ABA16  59                  POP      ECX
015F:004ABA17  59                  POP      ECX
015F:004ABA18  648910              MOV      FS:[EAX],EDX
015F:004ABA1B  EB13                JMP      004ABA30
015F:004ABA1D  E93200FFFF          JMP      0049BA54

8、在 XOR EAX,EAX 处停下来,下指令
dd 438000
显示如下

0030:00438000 00000000  00000000  00000000  00000000      ................    <---第一段开始
0030:00438010 00000000  00000000  00000000  00000000      ................
..........(省略)
0030:00438390 00000000  00038C12  00038C00  00038BF0      ................    <---第一段结束,第二段开始
0030:004383A0 00038BE0  00038BD0  00038BC2  00000000      ................
0030:004383B0 0003914A  00039114  000391A2  00039196      J...............
..........(省略)
0030:00438660 00000000  00038C98  00038CAE  00038C86      ................
0030:00438670 00000000  00038BA4  00038B96  00038B82      ................
0030:00438680 00038B6E  00000000  00000275  00000000      n.......u.......    <---第二段结束,第三段开始
..........(省略)
0030:00438690 00000000  0000026F  00000000  00000000      ....o...........
0030:004386A0 00000045  00000000  00000000  00FF0000      E...............
..........(省略)
0030:00439240 00070000  00000000  0000004C  00000000      ........L.......
0030:00439250 002B0000  00000000  00000000  00000000      ..+.............
0030:00439260 0000012C  00000000  00000000  00000124      ,...........$...
0030:00439270 00000000  00000000  00000000  00000000      ................    <---第三段结束
0030:00439280 00000000  00000000  00000000  00000000      ................

这里我说明一下,本来此处一般是Dump出idata Section的时候了,但是第三类Asprotect加壳程序(Asprotect v1.0加壳的程序也属于此类)的import table还原后还是不完整。我们来分析一下它的特征。

第一段,全是 00,而一般完整的import table,此处应为 5 个长整数一组,有规律的连续分布(这和IMAGE_IMPORT_DESCRIPTOR的结构有关)。看来这是Asprotect作的第一个手脚。他把此处清零了。

第二段,一般是一段连续的几个长整数后加一个 00000000,我们如果对import table的结构有所了解的话,就知道这是PIMAGE_IMPORT_BY_NAME部分,Asprotect对该部分没有作手脚。

第三段,一般是排序的长整数或者是比较小的长整数并加以多个 00000000 间断,比如 26F,45,FF,4C,....。你可以找到这些数字。那么这是什么呢?这就是PIMAGE_IMPORT_BY_NAME指向的地方。正常情况下应该为Hint和Name[]。然而现在不是。分析以后发现,这又是Asprotect作的手脚。其中数字的位置对应Hint。而间断的 00000000 数字的位置则是Name[],也就是函数名称字符串的位置。而现在全被Asprotect用 00 去掉了。所以你在整个程序内存空间搜索,可能也找不到函数名称字符串。

那么现在我们该做什么呢?我先来介绍一下Imp_List这个软件,它的作用就是帮你Dump出import table。不过他有几个毛病,一、如果程序没有名为idata的Section,他就会不工作,二、如果 idata Section 中有些杂七杂八的东西,他工作后会出问题。
这里我们遇到的是第二种情况,因此必须帮他去掉 idata Section 中无用的东西。这些无用的东西就是第三段开始的字节,我们找到起始点 00438688
再找到结束点 00439270,这之间的字节属于第三段,我们要把它清零。
好,下指令
f 438688 439270-438688 00
现在,第三段全部被 00 填充。

9、该到找Entry Point的时候了。向下翻页,到如下处

015F:004ABB43  8B4508              MOV      EAX,[EBP+08]
015F:004ABB46  8D4818              LEA      ECX,[EAX+18]
015F:004ABB49  8B4508              MOV      EAX,[EBP+08]
015F:004ABB4C  8B10                MOV      EDX,[EAX]
015F:004ABB4E  8B4508              MOV      EAX,[EBP+08]
015F:004ABB51  8B401C              MOV      EAX,[EAX+1C]
015F:004ABB54  E887F6FFFF          CALL      004AB1E0        <---此处一定要按 F8 键进入
015F:004ABB59  5F                  POP      EDI
015F:004ABB5A  5E                  POP      ESI
015F:004ABB5B  5B                  POP      EBX
015F:004ABB5C  5D                  POP      EBP
015F:004ABB5D  C20400              RET      0004

10、把光标定位到Call 调用处,按 F7 键到此,然后按 F8 键进入该调用。

11、可以看到如下:

015F:004AB1DE  8BC0                MOV      EAX,EAX
015F:004AB1E0  55                  PUSH      EBP
015F:004AB1E1  8BEC                MOV      EBP,ESP
015F:004AB1E3  83C4F0              ADD      ESP,-10
015F:004AB1E6  53                  PUSH      EBX
015F:004AB1E7  56                  PUSH      ESI
015F:004AB1E8  57                  PUSH      EDI
015F:004AB1E9  894DF0              MOV      [EBP-10],ECX
015F:004AB1EC  8955F4              MOV      [EBP-0C],EDX
015F:004AB1EF  8945FC              MOV      [EBP-04],EAX
015F:004AB1F2  33C0                XOR      EAX,EAX
015F:004AB1F4  55                  PUSH      EBP
015F:004AB1F5  681DB24A00          PUSH      004AB21D
015F:004AB1FA  64FF30              PUSH      DWORD PTR FS:[EAX]
015F:004AB1FD  648920              MOV      FS:[EAX],ESP
015F:004AB200  33C9                XOR      ECX,ECX
015F:004AB202  B201                MOV      DL,01
015F:004AB204  B8B4D44900          MOV      EAX,0049D4B4
015F:004AB209  E8AE3CFFFF          CALL      0049EEBC        <--注意,第一个Call调用
015F:004AB20E  E86D0AFFFF          CALL      0049BC80        <--注意,第二个Call调用,此调用中是个异常
015F:004AB213  33C0                XOR      EAX,EAX
015F:004AB215  5A                  POP      EDX
015F:004AB216  59                  POP      ECX
015F:004AB217  59                  POP      ECX
015F:004AB218  648910              MOV      FS:[EAX],EDX
015F:004AB21B  EB0A                JMP      004AB227

12、把光标定位到 Call 0049BC80 调用处,(注意是第二个调用处)按F7键到此。
13、这里当然是要过Asprotect设下的异常陷井了。(如果你按 F8 键进入此调用,就可以看到异常调用),为了躲过它,下指令
db fs:0
显示如下

2927:00000000 D0 FD 68 00 00 00 69 00-00 C0 68 00 4E 29 37 29  ..h...i...h.N)7)
2927:00000010 00 00 00 00 00 00 00 00-3C B4 5D 81 01 00 FF FF  ........<.].....

14、注意 D0 FD 68 00 字节,下指令
dd 015f:68FDD0

015F:0068FDD0 0068FF68  004AB21D  0068FDF8  00498DDC      h.h...J...h...I.
015F:0068FDE0 00475DD8  004AB940  0043FC6F  00400000      .]G.@.J.o.C...@.

15、注意 004AB21D 字节,下指令
u 4AB21D

015F:004AB21D  E93208FFFF          JMP      0049BA54
015F:004AB222  E8C90AFFFF          CALL      0049BCF0

16、下指令
bpx 49BA54

17、好,设好断点,连按三次 F5 键,跳过三个异常陷井。然后继续跟踪到如下
015F:004AB322  8B00                MOV      EAX,[EAX]                         
015F:004AB324  50                  PUSH      EAX                               
015F:004AB325  6A00                PUSH      00                               
015F:004AB327  B841D44900          MOV      EAX,0049D441                     
015F:004AB32C  48                  DEC      EAX                               
015F:004AB32D  53                  PUSH      EBX                               
015F:004AB32E  50                  PUSH      EAX                               
015F:004AB32F  C3                  RET                                 

18、在 RET 处,就可以Dump出整个内存映象了。(记住你在这里找到的OEP,如果你还不清楚,下指令 dd esp 看看第 1-4 个字节的内容,我找到的是 41F170)下指令
/dump 400000 53000 c:\temp\dump.exe

19、按 F5 键回到Windows,运行Imp_List,单击Rebuild import table。在它的工作目录下我们可以找到
Address.txt
import0.bin
import1.bin
import2.bin
这四个文件。

20、打开Address.txt,可以看到它Dump出的函数情况。打开import0.bin,可以看到它重建后的import table。OK!太方便了。

21、用PEditor打开dump.exe文件,选择sections,右键打开菜单,选择dumpfixer。OK!一次完成所有Section的RVA、Size的转换工作。方便吧。还不快用PEditor。再修改Entry Point为 1F170,单击apply changes保存,选择directory,修改其中的Import Table的RVA为38000,Size为2000。单击保存。

22、用Hex WorkShop打开dump.exe和import0.bin,定位dump.exe位置为38000,选择1400个字节。(因为import0.bin只有这么大嘛)。删除。
选择import0.bin的1400个字节,复制到dump.exe中。保存。

23、运行,OK!

【后记】
还是那句话,如果谁对加壳、脱壳有兴趣,可以和我交个朋友。Email:ljtt@yeah.net。