手脱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就可以全部修复了!

浙公网安备 33010602011771号