找Entry Point的又一方法 -----针对Asprotect v1.0加壳的程序
【前言】
这几天我在捣鼓对Asprotect加壳程序的脱壳,结果战况惨烈。花了N个钟头,所获甚少。急疯的时候,就差向Asprotect作者索要程序源代码了(当然也想过绑架他,可路费俺花不起)。从跟踪几个加壳程序的情况来看,发现它们的脱壳难度不同,虽然在用FileInfo检测的时候都报告ASProtect
+ ASPack v1.084加壳。(看来这种"侦察兵"工具也该加紧升级了!!!)
由于Asprotect加壳的程序大多都有防跟踪的代码,已知的有检测SICE,SIWVID,SIWDEBUG,BCHK。(想了解手动跳过防跟踪的方法请看国外大师的文章)这里我可不想每次都把时间花在这上面。我用ICEPatch修补了SoftICE。
以下以Asprotect加壳过的ARPR v1.0为例吧。(注:从我跟踪的Azpr v3.10、AATool v4.0的情况来看,都与此类似。你也可以用Asprotect
v1.0加壳一个程序来试试)
样例文件: arpr.exe (ARPR v1.0的主程序文件)
加壳方式: ASProtect + ASPack v1.084
检测工具: FileInfo
调试工具: SoftICE v4.05,ICEPatch v2.0
目标: 找到Entry Point
作者: ljttt
日期: 2000-08-03
一、粗步确定Entry Point的所在的Call调用的方法
首先,要找个比较好的入口进入arpr.exe。由于修补了SoftICE,所以就以这种防跟踪的部分为我们设断点进入的地方。
1、设断点
bpint 3
(注:对于只检测NTICE等防跟踪的加壳程序,可以设断点 bpx CreateFileA,以后类似。不同的地方可能是以后要多按几个F12吧)
这时,一般你可以看到类似如下的屏幕:
015F:004BF23C CC
INT 3
<--你中断在此
015F:004BF23D EB02
JMP 004BF241
015F:004BF23F E9025DEB02 JMP
03374F46
015F:004BF244 E9FF33C05A JMP
5B0C2648
015F:004BF249 59
POP ECX
015F:004BF24A 59
POP ECX
015F:004BF24B 648910 MOV
FS:[EAX],EDX
015F:004BF24E EB0A
JMP 004BF25A
015F:004BF250 E91305FFFF JMP
004AF768 <--注意这个跳转语句,int 3过后就要到这里继续了。
015F:004BF255 E8AA07FFFF CALL
004AFA04
015F:004BF25A 8A1518514C00 MOV
DL,[004C5118]
015F:004BF260 8B45F8 MOV
EAX,[EBP-08]
2、把光标移到第五个Jmp语句以后,按F7键。好,我们过了第一道陷井。然后按三次F12。然后开始按F10跟踪,
直到出现如下类似屏幕
015F:004BF842 EB13
JMP 004BF857 <--跳转了
015F:004BF844 E91FFFFEFF JMP
004AF768
015F:004BF849 66B80E00 MOV
AX,000E
015F:004BF84D E8D2EDFFFF CALL
004BE624
015F:004BF852 E8AD01FFFF CALL
004AFA04
015F:004BF857 8B4508 MOV
EAX,[EBP+08] <--跳到此处
015F:004BF85A 8D4818 LEA
ECX,[EAX+18]
015F:004BF85D 8B4508 MOV
EAX,[EBP+08]
015F:004BF860 8B10
MOV EDX,[EAX]
015F:004BF862 8B4508 MOV
EAX,[EBP+08]
015F:004BF865 8B401C MOV
EAX,[EAX+1C]
015F:004BF868 E887F6FFFF CALL
004BEEF4 <---哈哈,目标。这就是Entry
Point所在的Call调用。
015F:004BF86D 5F
POP EDI
015F:004BF86E 5E
POP ESI
015F:004BF86F 5B
POP EBX
015F:004BF870 5D
POP EBP
015F:004BF871 C20400 RET
0004
这里有个窍门,在按完三个F12后,在SoftICE代码窗口用PageDown向下翻页,找最早出现的ret的语句前的Call调用处,按F7键可以快速来到Entry
Point所在的Call调用。这样不用按F10一步步地跟踪,不过如果要找import table时,就要一步步的来。
二、找宝贝-------Entry Point
【注】我遇到的Asprotect加壳的程序在跟踪到Entry Point入口的Call调用以后,内部跟踪时有很大不同,简单的,不远处就发现了。难的,其中还有陷井。Asprotect
v1.0加壳的程序就是这种情况。arpr.exe也一样。而Thumbnailer就没有这样的危险。
如果你继续跟踪,可能会在一个Call调用中发现这种情况。
015F:004AF992 8BC0
MOV EAX,EAX
015F:004AF994 5A
POP EDX
015F:004AF995 54
PUSH ESP
015F:004AF996 55
PUSH EBP
015F:004AF997 57
PUSH EDI
015F:004AF998 56
PUSH ESI
015F:004AF999 53
PUSH EBX
015F:004AF99A 50
PUSH EAX
015F:004AF99B 52
PUSH EDX
015F:004AF99C 54
PUSH ESP
015F:004AF99D 6A07
PUSH 07
015F:004AF99F 6A01
PUSH 01
015F:004AF9A1 68CEFAED0E PUSH
0EEDFACE
015F:004AF9A6 52
PUSH EDX
015F:004AF9A7 E914E3FFFF JMP
KERNEL32!RaiseException
015F:004AF9AC C3
RET
看到了吧,这是一个异常,Asprotect留下的陷井。如果没有特别的方法,跟踪就此中断了,虽然离Entry Point不远了。(我为此头痛了好几天)经过几天的奋斗,我找到的以下方法可以继续跟踪。
在JMP KERNEL32!RaiseException处(其实你也可以不用进入此Call调用中,只要在此Call调用前的mov fs:[eax],esp指令后就行了。)
1、下指令
db fs:0
显示如下
0EE7:00000000 D0 FD 5C 00 00 00 5D 00-00 F0 5B 00 F6 38 77 29 ..\...]...[..8w)
0EE7:00000010 00 00 00 00 00 00 00 00-3C A7 5D 81 01 00 FF FF ........<.].....
0EE7:00000020 00 00 00 00 B1 5D 78 C1-8F 29 00 00 C4 A7 5D 81 .....]x..)....].
0EE7:00000030 4C A5 5D 81 48 69 00 80-?? ?? ?? ?? ?? ?? ?? ?? L.].Hi..........
0EE7:00000040 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
2、注意前四个字节,看到了吗,前四个字节为 D0、FD、5C、00。当成长整数,也就是005CFDD0。好了,我们下指令
dd 015F:005CFDD0
(注:这里下指令 dd 005CFDD0不行,我试过,必须要加你跟踪时的程序所在段选择符,就是SoftICE屏幕中代码部分最左边看到的015F:xxxx字样)
显示如下
015F:005CFDD0 005CFF68 004BEF31 005CFDF8 004ACAF0
h.\.1.K...\...J.
015F:005CFDE0 00489AEC 004BF654 0045CC6F 00400000
..H.T.K.o.E...@.
015F:005CFDF0 004BE624 005CFE1C 005CFE0C 004BF86D
$.K...\...\.m.K.
3、这里注意第四-八个字节,也就是004BEF31。我们下指令
u 004BEF31
(注:这里可以省略段选择符)
显示如下
015F:004BEF31 E93208FFFF JMP
004AF768 <--关键!
015F:004BEF36 E8C90AFFFF CALL
004AFA04
015F:004BEF3B 33C0
XOR EAX,EAX
4、看到了吗Jmp 004AF768,好就在此处下断点
bpx 4AF768
5、好了,准备工作做完,就再不怕Asprotect给我们下的异常陷井了。按F5继续,三次以后(因为我跟踪的情况只有三次异常陷井),还是中断在我们设好的断点处。
以后跟踪的时候,就没有什么难点了,OK,Entry Point离你近在咫尺了。
(注:如果你有了经验,可以还可以进一步简化跟踪步骤。找到它要到的地方,直接按F7,就不用那么多步骤。这也是我前面直接按F7的原因。当然那是我 N *
N次战斗后的一点收获。这里我想让大家了解一下原因,就写得详细一点。如果想了解以上方法的原理,到绿盟处下载第十期的月刊。看看WebCrazy写的《 Windows
NT/2000内部数据结构探究》一文,如果还不懂,问问WebCrazy吧,抱歉!我只懂这一点儿。如果没有WebCrazy大虾的文章,恐怕我还在Asprotect的陷井中兜圈子。唉,Asprotect连CIH病毒中的一些技术都用进去了。不知道以后还有什么变化。不会把二维变形病毒中的技术也用进去吧,写个什么变形引擎之类的,ou,我这不是没事找抽吗?)
【后记】
由于手头上收集的Asprotect加壳程序不多,所以没法更多的验证。dr0老兄要我说说,就写了此文。
对Asprotect加壳程序的脱壳花了我很长时间。就有些问题向RuFeng兄写信问过,(不过他现在正在开发调试器,打扰他实在抱歉)也没有下文。cloudnumber9兄这些天也没碰上。没办法,自力更生处理了一部分问题。不过我还有许多问题要向各位请教?(老毛病了)看在我写文章劳心劳力劳神的份上,知道的就请告诉我。欢迎交流!!!
1、Asprotect v1.0加壳的程序的import table怎样重建,我用ProcDump得到的不完整,无法使用?手动脱壳也不成功。cloudnumber9兄说国外都已经出了修正工具?那儿有下载?
2、怎样写UnAspack之类的工具?那儿有相关文章?
〖声明〗
说一下我写文章的目的,我希望大家把它当作是一种技术交流,不要当作教学一类。因为许多观点还只是我一家之言,我不想误导初学者。
- 标 题:找Entry Point的又一方法 -----针对Asprotect v1.0加壳的程序 (7千字)
- 作 者:ljtt
- 时 间:2000-8-3 11:49:37
- 链 接:http://bbs.pediy.com