对 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。
- 标 题:对 CreateInstall 2000 的脱壳 (10千字)
- 作 者:ljttt
- 时 间:2000-8-12 16:01:53
- 链 接:http://bbs.pediy.com