首页
社区
课程
招聘
我发篇yoda's cryptor 1.x / modified的破文吧,高手就不用看了
发表于: 2006-8-18 23:24 4504

我发篇yoda's cryptor 1.x / modified的破文吧,高手就不用看了

2006-8-18 23:24
4504
【脱壳文件】自己写的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后的文件,没什么问题,脱壳完毕

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
2
我好像没有脱的这么复杂。。直接在分配函数下断点
然后再分配的空间上下一个写入断点很快就找到 处理代码
不定一下kernel32 和user32 的代码让他可以被 IAT修复工具识别
然后后面有一个lstrcmp 这里是特殊API 改为JMp就可以了
2006-8-18 23:53
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
恩,不错,谢谢指点。因为没脱过这个壳,怕它清DR7为0使硬件断点失效才用的这个方法。现在看来没什么必要。
2006-8-19 18:42
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
4
希望楼主可以公布目标程序,让大家也可以学习到楼主的过程!
2006-8-19 23:25
0
游客
登录 | 注册 方可回帖
返回
//