手脱ASProtect 1.23实战

ASProtect 1.23 在原来版本的基础上,增加了更多的功能,使得ASProtect的保护能力更强了。废话不多说,就以一个叫做Crystal Button 的程序为例,说明一下脱壳的过程,很有意思的!
1、PEiD查壳,显示为:ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov。
2、OD载入应用程序,发现,第27次shift+F9时,程序运行了起来,因此,我们运行到第26次时,停下。此时断到红色代码行,代码如下:
00E639EC    3100            xor dword ptr ds:[eax],eax
00E639EE    64:8F05 0000000>pop dword ptr fs:[0]
00E639F5    58              pop eax
00E639F6    833D B07EE600 0>cmp dword ptr ds:[E67EB0],0
00E639FD    74 14           je short 00E63A13
00E639FF    6A 0C           push 0C
00E63A01    B9 B07EE600     mov ecx,0E67EB0
00E63A06    8D45 F8         lea eax,dword ptr ss:[ebp-8]
00E63A09    BA 04000000     mov edx,4
00E63A0E    E8 2DD1FFFF     call 00E60B40
00E63A13    FF75 FC         push dword ptr ss:[ebp-4]
00E63A16    FF75 F8         push dword ptr ss:[ebp-8]
00E63A19    8B45 F4         mov eax,dword ptr ss:[ebp-C]
00E63A1C    8338 00         cmp dword ptr ds:[eax],0
00E63A1F    74 02           je short 00E63A23
00E63A21    FF30            push dword ptr ds:[eax]
00E63A23    FF75 F0         push dword ptr ss:[ebp-10]
00E63A26    FF75 EC         push dword ptr ss:[ebp-14]
00E63A29    C3              retn

00E63A29处,F2下断,按一次shift+F9,运行到00E63A29处,此时观察堆栈窗口,显示为:

0012FF5C   00E76F14
0012FF60   00400000  crysb.00400000
0012FF64   574F42C8
0012FF68   0012FFA4
0012FF6C   00E50000

0012FF68处下断点,保险期间,用硬件断点,命令行中输入:hr 0012FF68,此时,先取消00E63A29处断点,按F9,此时,断到红色标记的位置:

00E77091   /EB 44           jmp short 00E770D7
00E77093   |EB 01           jmp short 00E77096
00E77095   |9A 51579CFC BF0>call far 00BF:FC9C5751
00E7709C   |0000            add byte ptr ds:[eax],al
00E7709E   |00B9 00000000   add byte ptr ds:[ecx],bh
00E770A4   |F3:AA           rep stos byte ptr es:[edi]
00E770A6   |9D              popfd
00E770A7   |5F              pop edi
00E770A8   |59              pop ecx
00E770A9   |C3              retn

此时,删除硬件断点,按F8,等来到蓝色标记的位置时,(注意了,这可是关键位置):

00E77135   /EB 02           jmp short 00E77139
00E77137   |CD20 EB02CD20   vxdcall 20CD02EB
00E7713D    83EC 0F         sub esp,0F
00E77140    64:EB 02        jmp short 00E77145
00E77143    CD20 8D64240B   vxdcall B24648D
00E77149    36:EB 02        jmp short 00E7714E
00E7714C    CD20 89742400   vxdcall 247489
00E77152    EB 01           jmp short 00E77155
00E77154    9A F3EB02CD 206>call far 6620:CD02EBF3
00E7715B    0FBCF5          bsf esi,ebp
00E7715E    EB 01           jmp short 00E77161
00E77160    F0:81DE 28EC301>lock sbb esi,1330EC28                                ; 不允许锁定前缀
00E77167    64:EB 01        jmp short 00E7716B
00E7716A    C7              ???                                                  ; 未知命令
00E7716B    3E:EB 01        jmp short 00E7716F
00E7716E    E8 0FCEF3EB     call ECDB3F82

见到jmp,就F7跟进,跟踪一会后,便来到了如下地址处:

00E771BB    55              push ebp
00E771BC    8BEC            mov ebp,esp
00E771BE    6A FF           push -1
00E771C0    68 A8A44900     push 49A4A8
00E771C5    68 B8634300     push 4363B8
00E771CA    64:A1 00000000  mov eax,dword ptr fs:[0]
00E771D0    EB 01           jmp short 00E771D3

是 不是看得粉色区域的代码有点面熟?不错,是VC代码的入口位置,而ASProtect 1.23壳的有意思之处是,它把原来OEP处的代码,分几段抽取了出来,增加了脱壳时分析的难度。以上粉色部分,是第一段代码被抽取的代码,此时,最好打 开记事本,将粉色区域的代码拷贝下来,单步跟到jmp时,F7跟进,

00E771D3    50              push eax
00E771D4    64:8925 0000000>mov dword ptr fs:[0],esp
00E771DB    83EC 58         sub esp,58
00E771DE    EB 01           jmp short 00E771E1

此时粉色部分是第二段被抽取的代码部分,以后,我把抽取的代码全部置为粉色,

00E771E1    53              push ebx
00E771E2    EB 01           jmp short 00E771E5

***************************************************

00E771E5    56              push esi
00E771E6    EB 01           jmp short 00E771E9

***************************************************

00E771E9    57              push edi                                             ; ntdll.7C930228
00E771EA    8965 E8         mov dword ptr ss:[ebp-18],esp
00E771ED    EB 02           jmp short 00E771F1

此时,jmp处F7了后,按F8继续向下跟踪,经过一会,来到了真正的EOP处(红色代码区域),代码如下:

004364B6    FF15 98224900   call dword ptr ds:[492298]
004364BC    33D2            xor edx,edx
004364BE    8AD4            mov dl,ah
004364C0    8915 C4CC4D00   mov dword ptr ds:[4DCCC4],edx
004364C6    8BC8            mov ecx,eax
004364C8    81E1 FF000000   and ecx,0FF
004364CE    890D C0CC4D00   mov dword ptr ds:[4DCCC0],ecx
004364D4    C1E1 08         shl ecx,8
004364D7    03CA            add ecx,edx
004364D9    890D BCCC4D00   mov dword ptr ds:[4DCCBC],ecx
004364DF    C1E8 10         shr eax,10
004364E2    A3 B8CC4D00     mov dword ptr ds:[4DCCB8],eax

此时把代码窗口向上翻,会看到如下的代码:

0043648C    5D              pop ebp
0043648D    C2 0400         retn 4
00436490    0000            add byte ptr ds:[eax],al
00436492    0000            add byte ptr ds:[eax],al
00436494    0000            add byte ptr ds:[eax],al
00436496    0000            add byte ptr ds:[eax],al
00436498    0000            add byte ptr ds:[eax],al
0043649A    0000            add byte ptr ds:[eax],al
0043649C    0000            add byte ptr ds:[eax],al
0043649E    0000            add byte ptr ds:[eax],al
004364A0    0000            add byte ptr ds:[eax],al
004364A2    0000            add byte ptr ds:[eax],al
004364A4    0000            add byte ptr ds:[eax],al
004364A6    0000            add byte ptr ds:[eax],al
004364A8    0000            add byte ptr ds:[eax],al
004364AA    0000            add byte ptr ds:[eax],al
004364AC    0000            add byte ptr ds:[eax],al
004364AE    0000            add byte ptr ds:[eax],al
004364B0    0000            add byte ptr ds:[eax],al
004364B2    0000            add byte ptr ds:[eax],al
004364B4    0000            add byte ptr ds:[eax],al
004364B6    FF15 98224900   call dword ptr ds:[492298]
004364BC    33D2            xor edx,edx
004364BE    8AD4            mov dl,ah
004364C0    8915 C4CC4D00   mov dword ptr ds:[4DCCC4],edx
004364C6    8BC8            mov ecx,eax
004364C8    81E1 FF000000   and ecx,0FF
004364CE    890D C0CC4D00   mov dword ptr ds:[4DCCC0],ecx
004364D4    C1E1 08         shl ecx,8
004364D7    03CA            add ecx,edx
004364D9    890D BCCC4D00   mov dword ptr ds:[4DCCBC],ecx
004364DF    C1E8 10         shr eax,10
004364E2    A3 B8CC4D00     mov dword ptr ds:[4DCCB8],eax

现在明白了吧,代码果然被抽取了,现在可以脱壳吗?答案是---不行。为啥,因为被抽取的代码没有还原出来,那怎么还原呢?答案就在 add byte ptr ds:[eax],al 处,将一系列的add byte ptr ds:[eax],al处编辑入上面的粉色代码,最后形式如下:


0043648D    C2 0400         retn 4
00436490    55              push ebp
00436491    8BEC            mov ebp,esp
00436493    6A FF           push -1
00436495    68 A8A44900     push crysb.0049A4A8
0043649A    68 B8634300     push crysb.004363B8
0043649F    64:A1 00000000  mov eax,dword ptr fs:[0]
004364A5    50              push eax
004364A6    64:8925 0000000>mov dword ptr fs:[0],esp
004364AD    83EC 58         sub esp,58
004364B0    53              push ebx
004364B1    56              push esi
004364B2    57              push edi
004364B3    8965 E8         mov dword ptr ss:[ebp-18],esp
004364B6    FF15 98224900   call dword ptr ds:[492298]
004364BC    33D2            xor edx,edx
004364BE    8AD4            mov dl,ah
004364C0    8915 C4CC4D00   mov dword ptr ds:[4DCCC4],edx
004364C6    8BC8            mov ecx,eax
004364C8    81E1 FF000000   and ecx,0FF
004364CE    890D C0CC4D00   mov dword ptr ds:[4DCCC0],ecx

此时可以脱壳了,但要注意,此时的OEP的地址是:36490 ,大家都知道为什么吧脱壳,用ImportREC修复时,首先使用“跟踪级别1”修复了大部分,但还是会有6个指针无法修复,此时,使用:插件跟踪->ASProtect 1.22进行修复,此时IAT就可以全部修复了!

posted @ 2012-07-12 11:10  monkeycd  阅读(644)  评论(0)    收藏  举报