【目 标】: 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的,要不就没这么易了.
感谢鬼龙之舞的代码着色器 |