论坛风格切换切换到宽版
  • 4586阅读
  • 0回复

asprotect手动脱壳篇之六(转载) [复制链接]

上一主题 下一主题
离线小楼
 
发帖
*
金钱
*
威望
*
只看楼主 倒序阅读 0 发表于: 2001-07-08
找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之类的工具?那儿有相关文章?

〖声明〗
说一下我写文章的目的,我希望大家把它当作是一种技术交流,不要当作教学一类。因为许多观点还只是我一家之言,我不想误导初学者。
--------------------------------------------------------------------------------

《加密及解密技术交流站》由 ljtt 制作 版权所有
&copy;2000 -2001 All Rights Reserved

转载本站所有文章请注明出处,尊重作者的劳动也是尊重你自己。让我们一同撑起绿色的天空!