【脱壳文件】自己写的exe(mfc写的)
【下载地址】无
【加壳方式】yoda's cryptor 1.x / modified
【作 者】一民
【作者声明】只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!若感兴趣转载请著明出处,谢谢
【调试环境】WinXPSP2、OllyDBD110、LordPE
【脱壳过程】见下
一、前言
好象没有多少这个壳的资料呢,我发一个吧
二、加壳方式
yoda's cryptor 1.x / modified
三、过程
某文件tt.exe用PEID查是yoda's cryptor 1.x / modified的壳,找了一遍论坛,好象没什么教程,都是1.2的多,看来找教程的时间应该比破的时间长,自己破了
有OD载入:
00695060 tt.<> 60 pushad
00695061 E8 00000000 call 00695066 ; tt.00695066
00695066 5D pop ebp
00695067 81ED 0F1E4000 sub ebp,401E0F
0069506D B9 57090000 mov ecx,957
00695072 8DBD 571E4000 lea edi,[dword ebp+401E57]
00695078 8BF7 mov esi,edi
0069507A AC lods [byte esi]
0069507B EB 01 jmp short 0069507E ; tt.0069507E
0069507D E8 F934BB2C call 2D24857B
00695082 92 xchg eax,edx
00695083 04 B9 add al,0B9
00695085 2C 16 sub al,16
00695087 EB 01 jmp short 0069508A ; tt.0069508A
00695089 C2 EB01 ret 1EB
0069508C - E9 F9F9EB01 jmp 02554A8A
00695091 C2 F92A ret 2AF9
00695094 C102 C1 rol [dword edx],0C1
00695097 C0C8 B1 ror al,0B1
....................
直接有ESP定理也可以,但是这里用下"最后异常"的方法吧,以前看了些这个壳的特征,最后一次异常是读0异常,打开OD的调试选项:除了读取无效地址异常外全都忽略,按F9飞........
第一次停在这:
006956B9 CD 68 int 68
006956BB 33DB xor ebx,ebx
006956BD 64:8F03 pop [dword fs:ebx]
006956C0 83C4 04 add esp,4
006956C3 66:81FF 9712 cmp di,1297
006956C8 74 0E je short 006956D8 ; tt.006956D8
006956CA 66:81FF 7712 cmp di,1277
006956CF 74 07 je short 006956D8 ; tt.006956D8
006956D1 66:81FF 3013 cmp di,1330
006956D6 75 08 jnz short 006956E0 ; tt.006956E0
006956D8 EB 01 jmp short 006956DB ; tt.006956DB
006956DA FF61 EB jmp [dword ecx-15]
006956DD 01E8 add eax,ebp
006956DF C3 ret
........
看了下代码,不是我们要找的,继续:
又过了几个内存异常,来到这:
00E733A6 3100 xor [dword eax],eax;<======来到这
00E733A8 EB 01 jmp short 00E733AB
00E733AA 68 648F0500 push 58F64
00E733AF 0000 add [byte eax],al
00E733B1 00EB add bl,ch
.........
看堆栈:
0012FF5C FFFFFFFF SEH 链尾部
0012FF60 00E7335D SE 句柄
0012FF64 00E40000
0012FF68 00E74138
.......
bp E7335d,SHIFT+F9飞.....
.......
00E7336E 8380 B8000000 02 add [dword eax+B8],2;<====记下出口0xE733a8
00E73375 EB 1A jmp short 00E73391
......
bp 0xE733a8
出来:
00E733A8 /EB 01 jmp short 00E733AB
00E733AA |68 648F0500 push 58F64
00E733AF 0000 add [byte eax],al
..............
继续跟....
00E732ED 33D2 xor edx,edx
00E732EF 8A55 FF mov dl,[byte ebp-1]
00E732F2 8D85 FFFEFFFF lea eax,[dword ebp-101]
00E732F8 E8 43D8FFFF call 00E70B40
00E732FD 8DB5 FFFEFFFF lea esi,[dword ebp-101]
00E73303 EB 02 jmp short 00E73307
00E73305 8B36 mov esi,[dword esi]
00E73307 83FB 03 cmp ebx,3
00E7330A 75 1D jnz short 00E73329
00E7330C 56 push esi
00E7330D 8B45 0C mov eax,[dword ebp+C]
00E73310 50 push eax
00E73311 E8 EAFBFFFF call 00E72F00
00E73316 8B15 9065E700 mov edx,[dword E76590]
00E7331C 8902 mov [dword edx],eax
00E7331E B8 D017E700 mov eax,0E717D0
00E73323 8B17 mov edx,[dword edi]
00E73325 8902 mov [dword edx],eax
00E73327 EB 19 jmp short 00E73342
00E73329 56 push esi
00E7332A 8B45 0C mov eax,[dword ebp+C]
00E7332D 50 push eax
00E7332E E8 CDFBFFFF call 00E72F00
00E73333 8B17 mov edx,[dword edi]
00E73335 8902 mov [dword edx],eax ; soundlib.CreateSoundLib 呵呵API出来了,不过这好象是没被处理的API
00E73337 EB 09 jmp short 00E73342
00E73339 B8 A417E700 mov eax,0E717A4
00E7333E 8B17 mov edx,[dword edi]
00E73340 8902 mov [dword edx],eax
00E73342 8307 04 add [dword edi],4
00E73345 5F pop edi
00E73346 5E pop esi
00E73347 5B pop ebx
00E73348 8BE5 mov esp,ebp
00E7334A 5D pop ebp
00E7334B C2 0C00 ret 0C
........
反复提取API填到59A000以后的地址中
继续跟,来到这:
00E732B4 E8 47FCFFFF call 00E72F00 ;<====(eax=ascii"kernel32.dll")
00E732B9 E8 7EFEFFFF call 00E7313C
00E732BE 8B17 mov edx,[dword edi]
00E732C0 8902 mov [dword edx],eax
..........
E732BE的代码是不是和00E73333很象啊?呵呵,有名堂.....
00E732B4其实是LoadLibraryA,API的地址在EAX中,那E7333E是干什么的呢?跟进去看看:
00E7313C 53 push ebx
00E7313D 56 push esi
00E7313E 57 push edi
00E7313F 55 push ebp
00E73140 83C4 F0 add esp,-10
00E73143 890424 mov [dword esp],eax
00E73146 B8 C8000000 mov eax,0C8
00E7314B E8 BCF3FEFF call 00E6250C
00E73150 894424 04 mov [dword esp+4],eax
00E73154 8B4424 04 mov eax,[dword esp+4]
00E73158 894424 08 mov [dword esp+8],eax
00E7315C 8B2C24 mov ebp,[dword esp]
00E7315F E8 84FFFFFF call 00E730E8
00E73164 8BD8 mov ebx,eax
00E73166 C64424 0C 00 mov [byte esp+C],0
00E7316B 0FB633 movzx esi,[byte ebx]
00E7316E 8D43 01 lea eax,[dword ebx+1]
00E73171 0FB638 movzx edi,[byte eax]
00E73174 8D53 02 lea edx,[dword ebx+2]
00E73177 8BCE mov ecx,esi
00E73179 8BC5 mov eax,ebp
00E7317B E8 08D8FFFF call 00E70988
00E73180 84C0 test al,al
00E73182 74 18 je short 00E7319C
00E73184 8BCF mov ecx,edi
00E73186 8BD5 mov edx,ebp
00E73188 8B4424 08 mov eax,[dword esp+8]
00E7318C E8 BF20FFFF call 00E65250
00E73191 017C24 08 add [dword esp+8],edi
00E73195 03EF add ebp,edi
00E73197 C64424 0C 01 mov [byte esp+C],1
00E7319C 83C6 02 add esi,2
00E7319F 03DE add ebx,esi
00E731A1 807C24 0C 00 cmp [byte esp+C],0
00E731A6 75 05 jnz short 00E731AD
00E731A8 803B 00 cmp [byte ebx],0
00E731AB ^ 75 BE jnz short 00E7316B
00E731AD 807C24 0C 00 cmp [byte esp+C],0
00E731B2 ^ 75 AB jnz short 00E7315F
00E731B4 8B7424 08 mov esi,[dword esp+8]
00E731B8 2B7424 04 sub esi,[dword esp+4]
00E731BC 8D46 06 lea eax,[dword esi+6]
00E731BF E8 48F3FEFF call 00E6250C
00E731C4 8BD8 mov ebx,eax
00E731C6 8BCE mov ecx,esi
00E731C8 8B7C24 04 mov edi,[dword esp+4]
00E731CC 8BD7 mov edx,edi
00E731CE 8BC3 mov eax,ebx
00E731D0 E8 7B20FFFF call 00E65250
00E731D5 8BEB mov ebp,ebx
00E731D7 03EE add ebp,esi
00E731D9 896C24 08 mov [dword esp+8],ebp
00E731DD B8 02000000 mov eax,2
00E731E2 E8 CDF5FEFF call 00E627B4
00E731E7 83E8 01 sub eax,1
00E731EA 73 1A jnb short 00E73206
00E731EC 8B4424 08 mov eax,[dword esp+8]
00E731F0 C600 E9 mov [byte eax],0E9
00E731F3 83C5 05 add ebp,5
00E731F6 8B0424 mov eax,[dword esp]
00E731F9 2BC5 sub eax,ebp
00E731FB 03F0 add esi,eax
00E731FD 8B4424 08 mov eax,[dword esp+8]
00E73201 40 inc eax
00E73202 8930 mov [dword eax],esi
00E73204 EB 1B jmp short 00E73221
00E73206 8B4424 08 mov eax,[dword esp+8]
00E7320A C600 68 mov [byte eax],68
00E7320D 033424 add esi,[dword esp]
00E73210 8B4424 08 mov eax,[dword esp+8]
00E73214 40 inc eax
00E73215 8930 mov [dword eax],esi
00E73217 8B4424 08 mov eax,[dword esp+8]
00E7321B 83C0 05 add eax,5
00E7321E C600 C3 mov [byte eax],0C3
00E73221 8BC7 mov eax,edi
00E73223 E8 FCF2FEFF call 00E62524
00E73228 8BC3 mov eax,ebx
00E7322A 83C4 10 add esp,10
00E7322D 5D pop ebp
00E7322E 5F pop edi
00E7322F 5E pop esi
00E73230 5B pop ebx
00E73231 C3 ret
原来是偷API的开头的代码到壳里去啊,改下这句:
00E73228 8BC3 mov eax,ebx
改为:
pop eax
push eax
(因为此时[ESP]=API的地址)呵呵壳的算盘算空了.
00E73531 53 push ebx
00E73532 8D5D F8 lea ebx,[dword ebp-8]
00E73535 53 push ebx
00E73536 80F8 05 cmp al,5
00E73539 74 06 je short 00E73541
00E7353B 0FB60E movzx ecx,[byte esi]
00E7353E 41 inc ecx
00E7353F EB 05 jmp short 00E73546
00E73541 B9 04000000 mov ecx,4
00E73546 01CE add esi,ecx
00E73548 E8 E7FCFFFF call 00E73234
00E7354D 5B pop ebx
00E7354E ^ EB CE jmp short 00E7351E
00E73550 61 popad ;处理完API后来到这,看看59A000处,好象还有几个API没出来
00E73551 E8 3A000000 call 00E73590
00E73556 68 5F35E700 push 0E7355F
00E7355B FF0424 inc [dword esp]
00E7355E C3 ret
59A000处:
...............
0059A0D8 77E60618 kernel32.FreeLibrary
0059A0DC 00E717A4 ;这是一个没出来的
0059A0E0 77E605D8 kernel32.LoadLibraryA
.....
后面还有几个,下面我就以这个为例子吧:
at e717a4
可以看到:
00E717A4 55 push ebp
00E717A5 8BEC mov ebp,esp
00E717A7 8B55 0C mov edx,[dword ebp+C]
00E717AA 8B45 08 mov eax,[dword ebp+8]
00E717AD 8B0D 8464E700 mov ecx,[dword E76484]
00E717B3 8B09 mov ecx,[dword ecx]
00E717B5 3BC8 cmp ecx,eax
00E717B7 75 09 jnz short 00E717C2
00E717B9 8B0495 D863E700 mov eax,[dword edx*4+E763D8]
00E717C0 EB 07 jmp short 00E717C9
00E717C2 52 push edx
00E717C3 50 push eax
00E717C4 E8 F739FFFF call 00E651C0 ; jmp to kernel32.GetProcAddress
00E717C9 5D pop ebp
00E717CA C2 0800 ret 8
呵呵,直接把59A0DC处改为GetProcAddress的地址就可以了,底下几个也这样找
下面是他们的代码:
59a0d4
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
00E71C64 55 push ebp
00E71C65 8BEC mov ebp,esp
00E71C67 8B45 08 mov eax,[dword ebp+8]
00E71C6A 85C0 test eax,eax
00E71C6C 75 13 jnz short 00E71C81
00E71C6E 813D A47AE7>cmp [dword E77AA4],400000
00E71C78 75 07 jnz short 00E71C81
00E71C7A A1 A47AE700 mov eax,[dword E77AA4]
00E71C7F EB 06 jmp short 00E71C87
00E71C81 50 push eax
00E71C82 E8 3135FFFF call 00E651B8 ; jmp to kernel32.GetModuleHandleA
00E71C87 5D pop ebp
00E71C88 C2 0400 ret 4
59a0dc
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
00E717A4 55 push ebp
00E717A5 8BEC mov ebp,esp
00E717A7 8B55 0C mov edx,[dword ebp+C]
00E717AA 8B45 08 mov eax,[dword ebp+8]
00E717AD 8B0D 8464E7>mov ecx,[dword E76484]
00E717B3 8B09 mov ecx,[dword ecx]
00E717B5 3BC8 cmp ecx,eax
00E717B7 75 09 jnz short 00E717C2
00E717B9 8B0495 D863>mov eax,[dword edx*4+E763D8]
00E717C0 EB 07 jmp short 00E717C9
00E717C2 52 push edx
00E717C3 50 push eax
00E717C4 E8 F739FFFF call 00E651C0 ; jmp to kernel32.GetProcAddress
00E717C9 5D pop ebp
00E717CA C2 0800 ret 8
下面两个直接在等下脱了壳后SMC一下就可以了
59a130
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
00E71CC0 A1 207EE700 mov eax,[dword E77E20] ;[dword E77E20]=000007e4
00E71CC5 C3 ret
59a18c
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
00E71CB8 A1 187EE700 mov eax,[dword E77E18];=ffffffff
00E71CBD C3 ret
下面继续:
还记得我刚才讲的最后一个异常吗,自己计算一下吧,哦,你刚才编了脚本吧,重新用脚本载入:
到修改完API的地方,修改完后记得把改过的代码改回来.
按F9飞,经过几个内存异常后来到最后的一个异常处:
00E739EC 3100 xor [dword eax],eax<========这里seh handler=e739cf
00E739EE 64:8F05 00000000 pop [dword fs:0]
00E739F5 58 pop eax
...............
00E739CF 8B4424 0C mov eax,[dword esp+C]
00E739D3 8380 B8000000 02 add [dword eax+B8],2
00E739DA C740 18 00000000 mov [dword eax+18],0;呵呵,设置DR7
00E739E1 31C0 xor eax,eax
00E739E3 C3 ret
出口:
00E739EE 64:8F05 00000000 pop [dword fs:0]
00E739F5 58 pop eax
.........
接下来壳开始解码,期间有很多变形CALL,应该懂识别吧
解码完后来到这:
00E84099 /E9 1C000000 jmp 00E840BA;跳到刚才解码出来的代码开始执行
00E8409E |1BB8 91F6F764 sbb edi,[dword eax+64F7F691]
00E840A4 |CD 82 int 82
00E840A6 |93 xchg eax,ebx
.......................
在红色的代码里运行一会就来到这
00E840BA 5B pop ebx
00E840BB 58 pop eax
00E840BC 05 25BA9B99 add eax,999BBA25
00E840C1 5C pop esp
00E840C2 EB 44 jmp short 00E84108
00E840C4 EB 01 jmp short 00E840C7
00E840C6 9A 51579CFC BF08 call far 08BF:FC9C5751
00E840CD 41 inc ecx
00E840CE E8 00B95E14 call 1546F9D3
00E840D3 0000 add [byte eax],al
00E840D5 F3:AA rep stos [byte es:edi]
00E840D7 9D popfd
00E840D8 5F pop edi
00E840D9 59 pop ecx
00E840DA C3 ret<=======([esp]=590178跳得好远啊,呵呵....)
00590170 . 55 push ebp<==========OEP
00590171 ? 8BEC mov ebp,esp
00590173 ? 83EC 14 sub esp,14
00590176 . 6A 00 push 0
00590178 . FF15 D4A05900 call [dword 59A0D4]<=======来到这call kernel32.GetModuleHandleA,壳把程序入口代码给偷了
0059017E . 8945 FC mov [dword ebp-4],eax
00590181 ? 8B45 FC mov eax,[dword ebp-4]
00590184 . 0FB708 movzx ecx,[word eax]
00590187 ? 81F9 4D5A0000 cmp ecx,5A4D
0059018D ? 74 07 je short 00590196 ; tt.00590196
0059018F ? 33C0 xor eax,eax
00590191 ? E9 87000000 jmp 0059021D ; tt.0059021D
00590196 . 8B55 FC mov edx,[dword ebp-4]
00590199 ? 8B45 FC mov eax,[dword ebp-4]
0059019C . 0342 3C add eax,[dword edx+3C]
................
如果设OEP为:590170要记得各寄存器的值和ESP的相关值,就可以DUMP了,
直接运行DUMP后的文件,没什么问题,脱壳完毕
[课程]Linux pwn 探索篇!