• 标 题:PESpin 新版壳/变形壳的脱壳+修复-->DVDFab V1.75
  • 作 者:loveboom
  • 时 间:2004年4月08日 11:50
  • 链 接:http://bbs.pediy.com

PESpin 新版壳/变形壳的脱壳+修复-->DVDFab V1.75

【目    标】: DVDFab V1.75
【工    具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F
【任    务】:脱程序的壳,找回壳所抽的代码+简单优化
【操作平台】:WINDOWS 2000 ADV SP2
【作    者】:loveboom[DFCG][FCG]
【相关链接】: 目标软件自己去搜或去DFCG下(不小心删除了,只能自己去搜了)
【简要说明】:昨天有位网友发这么个东东说是PESpin v0.3壳,用我的脚本后,还是不会修复代码,叫我帮他修复一下,我自己也就趁这个机会看了一下,不看不要紧,一看吓了我一下,原来是FFF(FiGHTiNG FoR FuN)组织内部用的变形或新版的PESpin的壳,因为在外面还没看到新版的发布。难怪上次PESpin的作者说新版就要出来了,还是更变态的呢(BTW:上次叫作者发一个新版的给我,可惜到现在还没响应。).不过这次总算先领教了新版/变形壳的利害了。
这个壳说明白一点,后面就是偷人家aspr1.3B的代码。所以如果对1.3b有点了解的朋友,看我这篇文章问题应该不大。如果没接触过的朋友就当是现在开始接触1.3b吧。
这个版本在抽代码处比较PESpin v0.3的更变态的说。
【详细过程】:
这篇文章主要讲代码的修复,所以前面的过程我就没写了,如果你想具体一点的,去看我写的脚本就会明白的。
开工:
设置好后,运行我自己写的PESpin v.03的脱壳脚本(脚本在DFCG或看雪里有得下),一下就到了这里:
004E8C0D    BB B4010000     MOV EBX,1B4                              ; Stole Code found.please patch OEP code and then dumped it! 
注:看到我上面的注释吗?如果是v0.3的在这里就是壳开始抽代码处,但这个壳并不是这里,下面还有的.
004E8C12    EB 01           JMP SHORT DVDFab.004E8C15
按几次F8到这里:
004E6001    0000            ADD BYTE PTR DS:[EAX],AL
004E6003    0000            ADD BYTE PTR DS:[EAX],AL                    ;不要被这里的00给骗了.
004E6005    E9 69000000     JMP DVDFab.004E6073                ;这里一个远程跳
继续F8跟下去
004E6073    E8 00000000     CALL DVDFab.004E6078                        ;这里F7跟进
004E6078    5D              POP EBP
004E6079    81ED 4DE14B00   SUB EBP,DVDFab.004BE14D
004E607F    8D85 F2E04B00   LEA EAX,DWORD PTR SS:[EBP+4BE0F2]
004E6085    8D8D 94E14B00   LEA ECX,DWORD PTR SS:[EBP+4BE194]
004E608B    03CB            ADD ECX,EBX
004E608D    8941 01         MOV DWORD PTR DS:[ECX+1],EAX
004E6090    8D85 36E14B00   LEA EAX,DWORD PTR SS:[EBP+4BE136]
004E6096    8D8D FAE04B00   LEA ECX,DWORD PTR SS:[EBP+4BE0FA]
004E609C    8901            MOV DWORD PTR DS:[ECX],EAX
004E609E    B8 5E140000     MOV EAX,145E
004E60A3    8D8D FFE04B00   LEA ECX,DWORD PTR SS:[EBP+4BE0FF]
004E60A9    8901            MOV DWORD PTR DS:[ECX],EAX
004E60AB    8D8D 94E14B00   LEA ECX,DWORD PTR SS:[EBP+4BE194]
004E60B1    8D85 94F34B00   LEA EAX,DWORD PTR SS:[EBP+4BF394]
004E60B7    51              PUSH ECX
004E60B8    50              PUSH EAX
004E60B9    E8 76FFFFFF     CALL DVDFab.004E6034                ;这里f7跟进,或在上面的地方直接F4到这里.再F7跟进
004E60BE    61              POPAD
进去后,看看这段代码,是不是很眼熟(没有接触过aspr1.3B朋友当然不觉得了).
004E6034    55              PUSH EBP
004E6035    8BEC            MOV EBP,ESP
004E6037    53              PUSH EBX
004E6038    56              PUSH ESI
004E6039    8B75 0C         MOV ESI,DWORD PTR SS:[EBP+C]
004E603C    8B5D 08         MOV EBX,DWORD PTR SS:[EBP+8]
004E603F    EB 11           JMP SHORT DVDFab.004E6052
004E6041    0FB703          MOVZX EAX,WORD PTR DS:[EBX]
004E6044    03C6            ADD EAX,ESI
004E6046    83C3 02         ADD EBX,2
004E6049    8BD0            MOV EDX,EAX
004E604B    8BC6            MOV EAX,ESI
004E604D    E8 0C000000     CALL DVDFab.004E605E
004E6052    66:833B 00      CMP WORD PTR DS:[EBX],0
004E6056  ^ 75 E9           JNZ SHORT DVDFab.004E6041
004E6058    5E              POP ESI
004E6059    5B              POP EBX
004E605A    5D              POP EBP
004E605B    C2 0800         RETN 8                             ;直接在这里F4
004E605E    0102            ADD DWORD PTR DS:[EDX],EAX
004E6060    C3              RETN
到达004E605B处后,一路按F8。其实这里开始就是学aspr1.3B,F8走过一堆骗人的东西后,来到这里:
004E6101    FF51 1D         CALL DWORD PTR DS:[ECX+1D]               ; DVDFab.004E610F 这里F7跟进,如果怕跟"飞"的话就一直按f7好过。
004E6104    699A F3F00F61 4>IMUL EBX,DWORD PTR DS:[EDX+610FF0F3],690>
004E610E    9A 59F2EB01 9A8>CALL FAR 819A:01EBF259                   ; Far call
004E6115    D97C76 41       FSTCW WORD PTR DS:[ESI+ESI*2+41]
004E6119    0859 66         OR BYTE PTR DS:[ECX+66],BL
上面跟进后来到这里:
004E610F    59              POP ECX                                  ; DVDFab.004E6104  停在这里
004E6110    F2:             PREFIX REPNE:                            ; Superfluous prefix
004E6111    EB 01           JMP SHORT DVDFab.004E6114
004E6113    9A 81D97C76 410>CALL FAR 0841:767CD981                   ; Far call
004E611A    59              POP ECX
本想直接把F7跟下来的代码抓下来,但直接抓下来的代码不好看,所以我用tc保存下来给大家看。
Tc结果如下,下面开始分析代码:
004E6110 Main     PREFIX REPNE:
004E6114 Main     SBB ECX,841767C                           
004E611A Main     POP ECX                                   
004E611B Main     SUB WORD PTR DS:[4E6124],0C139
004E6124 Main     JMP SHORT DVDFab.004E6127
004E6127 Main     JMP SHORT DVDFab.004E612B
004E612B Main     LEA ESP,DWORD PTR SS:[ESP-28]
004E612F Main     ADD ESP,67
004E6132 Main     SUB ESP,43
004E6135 Main     ADD WORD PTR DS:[4E613E],0DEFB
004E613E Main     PREFIX REP:
004E6143 Main     PUSH EBP                          ;这里开始程序的代码
004E6144 Main     XOR WORD PTR DS:[4E614D],1BAE     ;解压下一行代码
004E614D Main     JMP SHORT DVDFab.004E6151
004E6151 Main     POP DWORD PTR SS:[ESP]            ;出栈上面的东西,所以一开始的代码全部无效
004E6155 Main     MOV EBP,ESP                       ;这几行不变,照抄
004E6157 Main     PUSH -1
004E6159 Main     PUSH DVDFab.0045E5A8
004E615E Main     PUSH DVDFab.004548D6
004E6163 Main     MOV EAX,DWORD PTR FS:[0]                 
004E6169 Main     SUB WORD PTR DS:[4E6172],0C139    ;这里学1.3b解压下一行代码
004E6172 Main     JMP SHORT DVDFab.004E6175
004E6175 Main     JMP SHORT DVDFab.004E6179
004E6179 Main     LEA ESP,DWORD PTR SS:[ESP-28]     ;这里又是骗人的东东
004E617D Main     ADD ESP,67
004E6180 Main     SUB ESP,43
004E6183 Main     ADD WORD PTR DS:[4E618C],0DEFB    ;解压下一行代码
004E618C Main     PREFIX REP:
004E6191 Main     PUSH EAX                          ;这行属于程序代码
004E6192 Main     XOR WORD PTR DS:[4E619B],1BAE     ;解压下一行代码
004E619B Main     JMP SHORT DVDFab.004E619F
004E619F Main     POP DWORD PTR SS:[ESP]             ;因为这里出栈,所以可以判断上面的代码为骗人的东东
004E61A3 Main     MOV DWORD PTR FS:[0],ESP           ;程序代码
004E61AA Main     SUB ESP,68
004E61AD Main     SUB WORD PTR DS:[4E61B6],0C139    ;解压下一行代码
004E61B6 Main     JMP SHORT DVDFab.004E61B9
004E61B9 Main     JMP SHORT DVDFab.004E61BD
004E61BD Main     LEA ESP,DWORD PTR SS:[ESP-28]     ;这里同上,又是骗人的东东
004E61C1 Main     ADD ESP,67
004E61C4 Main     SUB ESP,43
004E61C7 Main     ADD WORD PTR DS:[4E61D0],0DEFB    ;解压下一行代码
004E61D0 Main     PREFIX REP:
004E61D5 Main     PUSH EBX                          ;程序代码
004E61D6 Main     XOR WORD PTR DS:[4E61DF],1BAE     ;解压下一行代码
004E61DF Main     JMP SHORT DVDFab.004E61E3
004E61E3 Main     POP DWORD PTR SS:[ESP]            ;同上出栈上面骗人的东东
004E61E7 Main     SUB WORD PTR DS:[4E61F0],0C139    ;解压下一行代码
004E61F0 Main     JMP SHORT DVDFab.004E61F3
004E61F3 Main     JMP SHORT DVDFab.004E61F7
004E61F7 Main     LEA ESP,DWORD PTR SS:[ESP-28]     ;这里又来骗人
004E61FB Main     ADD ESP,67
004E61FE Main     SUB ESP,43
004E6201 Main     ADD WORD PTR DS:[4E620A],0DEFB    ;解压下一行代码
004E620A Main     PREFIX REP:
004E620F Main     PUSH ESI                          ;程序代码
004E6210 Main     XOR WORD PTR DS:[4E6219],1BAE     ;解压下一行代码
004E6219 Main     JMP SHORT DVDFab.004E621D
004E621D Main     POP DWORD PTR SS:[ESP]            ;出栈
004E6221 Main     SUB WORD PTR DS:[4E622A],0C139    ;解压下一行代码
004E622A Main     JMP SHORT DVDFab.004E622D
004E622D Main     JMP SHORT DVDFab.004E6231
004E6231 Main     LEA ESP,DWORD PTR SS:[ESP-28]     ;再来骗人
004E6235 Main     ADD ESP,67
004E6238 Main     SUB ESP,43
004E623B Main     ADD WORD PTR DS:[4E6244],0DEFB    ;解压下一行代码
004E6244 Main     PREFIX REP:
004E6249 Main     PUSH EDI                          ;程序代码
004E624A Main     XOR WORD PTR DS:[4E6253],1BAE     ;解压下一行代码
004E6253 Main     JMP SHORT DVDFab.004E6257
004E6257 Main     POP DWORD PTR SS:[ESP]            ;出栈
004E625B Main     MOV DWORD PTR SS:[EBP-18],ESP     ;程序代码,照下来
004E625E Main     XOR EBX,EBX
004E6260 Main     MOV DWORD PTR SS:[EBP-4],EBX
004E6263 Main     PUSH 2
004E6265 Main     PREFIX REP:
004E626A Main     JMP SHORT DVDFab.004E626E
004E626E Main     PUSH DVDFab.00454909              ;运行完所抽代码后,返回程序的地方
004E6273 Main     PUSH DVDFab.004E601D              ;这里push 返回地址,用于后面的"清场"
004E6278 Main     RETN   

004E601D    90              NOP                     ;这里开始清场子
004E601E    90              NOP
004E601F    90              NOP
004E6020    51              PUSH ECX
004E6021    57              PUSH EDI
004E6022    9C              PUSHFD
004E6023    FC              CLD
004E6024    BF 61604E00     MOV EDI,DVDFab.004E6061
004E6029    B9 5E140000     MOV ECX,145E
004E602E    F3:AA           REP STOS BYTE PTR ES:[EDI]
004E6030    9D              POPFD
004E6031    5F              POP EDI
004E6032    59              POP ECX
004E6033    C3              RETN                     ;"清场"完毕回到第一个push的地方
到这里分析完毕,所以正确的代码应该是:
PUSH EBP
MOV EBP,ESP
PUSH -1
PUSH dumped_.0045E5A8
PUSH <JMP.&msvcrt._except_handler3>
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
SUB ESP,68
PUSH EBX
PUSH ESI
PUSH EDI
MOV DWORD PTR SS:[EBP-18],ESP
XOR EBX,EBX
MOV DWORD PTR SS:[EBP-4],EBX
PUSH 2
把上面的代码补上去刚好全部对上了.现在用lordpe纠正
大小,再dumpàfixdump,简单优化把mackt的前三个段删除再重建PE就可以了.
不过优化后的文件还是很大.收工!
【总    结】:
看完后,发现其实这个PESpin的新版壳/变形壳的后面的代
码就是抄ASPR1.3B的代码或叫后面的代码是aspr1.3b的"克隆"版.
还好输入表的处理没有学aspr1.3b的,要不就没这么易了.

感谢鬼龙之舞的代码着色器

Thanks:

Fly 辉仔yock、jingulong、二哥、所有曾经关心支持或帮助过我的朋友!谢谢您们!

                    by  loveboom[DFCG][FCG]                           
                     Email:bmd2chen@tom.com