Armadillo CopyM-II+Code Splicing+CC
 

破文作者:linex
作者声明:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教
调试环境:Win2003、OllyDBD、PEiD、LordPE、ImportREC
脱壳过程:前两天有人问我能不能脱一个软件的壳,我试了下,发现是用的 Armadillo CopyM-II+Code Splicing+CC方式加的壳,按看雪论坛的教程走了下,脱壳成功。特写下来作一笔记共享。(附注:XP以下的系统就别看了,2000下不能这么脱)

        一、OEP
        下断BP WaitForDebugEvent,F9,暂停:
      

0012BCB8 005058BF /CALL 到 WaitForDebugEvent 来自 MSEND.005058B9 0012BCBC 0012CD90 |pDebugEvent = 0012CD90 0012BCC0 000003E8 \Timeout = 1000. ms 右击堆栈,0012CD90处跟随,然后进代码窗口005058BF ,Ctrl+F,搜索:OR EAX,FFFFFFF8

00505E8F . 83C8 F8 OR EAX,FFFFFFF8 向上找到

00505E43 > 83BD CCF5FFFF>CMP DWORD PTR SS:[EBP-A34],0 00505E4A . 0F8C A8020000 JL MSEND1.005060F8 00505E50 . 8B8D CCF5FFFF MOV ECX,DWORD PTR SS:[EBP-A34] 00505E56 . 3B0D 480F5400 CMP ECX,DWORD PTR DS:[540F48] 00505E5C . 0F8D 96020000 JGE MSEND1.005060F8 00505E62 . 8B95 40F6FFFF MOV EDX,DWORD PTR SS:[EBP-9C0] 在00505E43这里下断点,然后把DWORD PTR SS:[EBP-A34]清0,此时数据窗口中:

0012CDA8 004AF0A0 MSEND1.004AF0A0 二、DUMP 现在继续向下找到这里:

00505F0D . 51 PUSH ECX 00505F0E . E8 2F210000 CALL MSEND1.00508042 00505F13 . 83C4 0C ADD ESP,0C 00505F16 25 FF000000 AND EAX,0FF //这里打补丁 00505F1B 85C0 TEST EAX,EAX 00505F1D 0F84 D5010000 JE MSEND1.005060F8 00505F23 837D D8 00 CMP DWORD PTR SS:[EBP-28],0 补丁代码: 00505F16 FF85 CCF5FFFF INC DWORD PTR SS:[EBP-A34] 00505F1C C705 4C0F5400>MOV DWORD PTR DS:[540F4C],1 00505F26 ^ E9 18FFFFFF JMP MSEND1.00505E43 然后去005060F8处下断,F9停下,继续打补丁:

005060F8 68 C0080000 PUSH 8C0 005060FD E8 2B31347C CALL kernel32.DebugActiveProcessStop 先保证设置你的OD为实时调试器,然后再运行一下。

这时你看到了什么?OD自动附加到了子进程里面了,并且停在OEP处,这时候就可以把Code Splicing段保存下来了 Alt+M打开内存窗口,找到类型=Priv 访问=RWE的区段,备份到文件。

内存映射, 条目 31 地址=039D0000 大小=00020000 (131072.) 属主= 039D0000 (自身) 区段= 类型=Priv 00021040 访问=RWE 初始访问=RWE 补上Code Splicing 此时LODEPE上场,先DUMP下主程序,然后从磁盘载入刚才保存的Code Splicing段,修正RVA后保存文件。

三、IAT修复 因为这个软件没有使用IAT乱序,所以和一般的方法没什么区别了 用OD打开,下断BP DebugActiveProcess,再附加,IMR修复,一切都是“流水作业”(jingulong语)

四、CC 这里偶不敢多言,前人早有论述,可惜看不懂,所以基本上是连蒙带猜的,好在CC不算多,改了几处INT3地址

004ADF81 CC INT3 004ADF82 ^ 76 B8 JBE SHORT dumpedm_.004ADF3C 004ADF84 60 PUSHAD 004ADF85 48 DEC EAX 004ADF86 8B0D 70FD4B00 MOV ECX,DWORD PTR DS:[4BFD70] 004ADF8C A1 78FD4B00 MOV EAX,DWORD PTR DS:[4BFD78] 004ADF91 8B15 74FD4B00 MOV EDX,DWORD PTR DS:[4BFD74] 004ADF97 66:83FA 00 CMP DX,0 004ADF9B CC INT3 004ADF9C 2D C700C4F1 SUB EAX,F1C400C7 004ADFA1 0200 ADD AL,BYTE PTR DS:[EAX] 004ADFA3 33C0 XOR EAX,EAX 004ADFA5 C3 RETN 004ADFA6 66:83F9 3C CMP CX,3C 004ADFAA CC INT3 004ADFAB 35 C7002A23 XOR EAX,232A00C7 004ADFB0 3036 XOR BYTE PTR DS:[ESI],DH 004ADFB2 C740 04 236B313>MOV DWORD PTR DS:[EAX+4],32316B23 004ADFB9 66:C740 08 3334 MOV WORD PTR DS:[EAX+8],3433 004ADFBF 33C0 XOR EAX,EAX 004ADFC1 C3 RETN 004ADFC2 66:83F9 32 CMP CX,32 004ADFC6 CC INT3 004ADFC7 3E:C700 C3C0B1A>MOV DWORD PTR DS:[EAX],A6B1C0C3 004ADFCE C740 04 C8EDBCF>MOV DWORD PTR DS:[EAX+4],FEBCEDC8 004ADFD5 66:C740 08 BAC3 MOV WORD PTR DS:[EAX+8],0C3BA 004ADFDB 33C0 XOR EAX,EAX 004ADFDD C3 RETN

改为:

004ADF81 90 NOP 004ADF82 90 NOP 004ADF83 90 NOP 004ADF84 90 NOP 004ADF85 48 DEC EAX 004ADF86 8B0D 70FD4B00 MOV ECX,DWORD PTR DS:[4BFD70] 004ADF8C A1 78FD4B00 MOV EAX,DWORD PTR DS:[4BFD78] 004ADF91 8B15 74FD4B00 MOV EDX,DWORD PTR DS:[4BFD74] 004ADF97 66:83FA 00 CMP DX,0 004ADF9B 75 09 JNZ SHORT dumpedm_.004ADFA6 004ADF9D C700 C4F10200 MOV DWORD PTR DS:[EAX],2F1C4 004ADFA3 33C0 XOR EAX,EAX 004ADFA5 C3 RETN 004ADFA6 66:83F9 3C CMP CX,3C 004ADFAA 75 16 JNZ SHORT dumpedm_.004ADFC2 004ADFAC C700 2A233036 MOV DWORD PTR DS:[EAX],3630232A 004ADFB2 C740 04 236B313>MOV DWORD PTR DS:[EAX+4],32316B23 004ADFB9 66:C740 08 3334 MOV WORD PTR DS:[EAX+8],3433 004ADFBF 33C0 XOR EAX,EAX 004ADFC1 C3 RETN 004ADFC2 66:83F9 32 CMP CX,32 004ADFC6 75 16 JNZ SHORT dumpedm_.004ADFDE 004ADFC8 C700 C3C0B1A6 MOV DWORD PTR DS:[EAX],A6B1C0C3 004ADFCE C740 04 C8EDBCF>MOV DWORD PTR DS:[EAX+4],FEBCEDC8 004ADFD5 66:C740 08 BAC3 MOV WORD PTR DS:[EAX+8],0C3BA 004ADFDB 33C0 XOR EAX,EAX 004ADFDD C3 RETN TEST=>OK.

上一篇   下一篇