传奇私服伴侣3.03主程序脱壳(工具为主)
 

文章标题: 传奇私服伴侣3.03主程序脱壳(工具为主)
文章作者: xiaoboy
作者邮箱: xiao-boy@qq.com
软件名称: 传奇私服伴侣3.03主程序
下载地址: http://www.myiis.cn/download/anticc_install.exe
加壳方式: Armadillo v4.X CopyMem-II
保护方式: Code Splicing+Import Table Elimination
使用工具: flyODBG、PEiD、ImportREC,LordPE_fix
操作平台: XPSP2
软件介绍: 传奇师傅防CC攻击
作者声明: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! 小弟弟一次写脱文 有错误之处请多多指教!
详细过程:

 

1. 找OEP peid显示:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks 根据个人经验这个一般都是Armadillo v4.X CopyMem-II 的壳,但不确认 之后FI显示为 Armadillo v4.0 运行程序之后出现2个进程,就确认是 Armadillo v4.X CopyMem-II 的壳了。 既然是快速脱壳那当然不会太麻烦的。。。 用flyODBG 载入ANTICC.exe 设置flyODBG忽略所有其它异常选项和 C000001D..C000001E 异常 。 用IsDebug插件去掉flyODBG的调试器标志。 然后用Armadillo V4.0-V4.4.Standard.Protection.osc 直奔OEP..........快巴。 2 利用ArmInline 7.1 修复程序现在程序已到了OEP了,代码如下: 004B9AE8 55 PUSH EBP ; This is the OEP! Found By: fly 004B9AE9 8BEC MOV EBP, ESP 004B9AEB 83C4 F0 ADD ESP, -10 004B9AEE B8 90954B00 MOV EAX, ANTICC.004B9590 004B9AF3 E8 C8CBF4FF CALL ANTICC.004066C0 //我们着这跟进去。。。。。 004B9AF8 A1 74CF4B00 MOV EAX, DWORD PTR DS:[4BCF74] 004B9AFD C600 01 MOV BYTE PTR DS:[EAX], 1 004B9B00 A1 04D34B00 MOV EAX, DWORD PTR DS:[4BD304] 004B9B05 8B00 MOV EAX, DWORD PTR DS:[EAX] 004B9B07 E8 68A1FAFF CALL ANTICC.00463C74 004B9B0C A1 04D34B00 MOV EAX, DWORD PTR DS:[4BD304] 004B9B11 8B00 MOV EAX, DWORD PTR DS:[EAX] 004B9B13 BA 689B4B00 MOV EDX, ANTICC.004B9B68 004B9B18 E8 3F9DFAFF CALL ANTICC.0046385C 004B9B1D 8B0D E8D14B00 MOV ECX, DWORD PTR DS:[4BD1E8] ; ANTICC.004C01F0 004B9B23 A1 04D34B00 MOV EAX, DWORD PTR DS:[4BD304] 004B9B28 8B00 MOV EAX, DWORD PTR DS:[EAX] 004B9B2A 8B15 44194B00 MOV EDX, DWORD PTR DS:[4B1944] ; ANTICC.004B1990 004B9B30 E8 57A1FAFF CALL ANTICC.00463C8C 004B9B35 8B0D 14CF4B00 MOV ECX, DWORD PTR DS:[4BCF14] ; ANTICC.004C01E8 004B9B3B A1 04D34B00 MOV EAX, DWORD PTR DS:[4BD304] 004B9B40 8B00 MOV EAX, DWORD PTR DS:[EAX] 004B9B42 8B15 F8164B00 MOV EDX, DWORD PTR DS:[4B16F8] ; ANTICC.004B1744 004B9B48 E8 3FA1FAFF CALL ANTICC.00463C8C 跟进后就到了下面代码: 004066C0 53 PUSH EBX 004066C1 8BD8 MOV EBX, EAX 004066C3 33C0 XOR EAX, EAX 004066C5 A3 9CA04B00 MOV DWORD PTR DS:[4BA09C], EAX 004066CA 6A 00 PUSH 0 004066CC E8 2BFFFFFF CALL ANTICC.004065FC ; JMP to kernel32.GetModuleHandleA //再跟进。。。。 004066D1 A3 68E64B00 MOV DWORD PTR DS:[4BE668], EAX 004066D6 A1 68E64B00 MOV EAX, DWORD PTR DS:[4BE668] 004066DB A3 A8A04B00 MOV DWORD PTR DS:[4BA0A8], EAX 004066E0 33C0 XOR EAX, EAX 004066E2 A3 ACA04B00 MOV DWORD PTR DS:[4BA0AC], EAX 004066E7 33C0 XOR EAX, EAX 004066E9 A3 B0A04B00 MOV DWORD PTR DS:[4BA0B0], EAX 在跟进就到到: 004065FC - FF25 545F3900 JMP NEAR DWORD PTR DS:[395F54] ; kernel32.GetModuleHandleA // 光标停在这里。。 00406602 8BC0 MOV EAX, EAX 00406604 - FF25 FC633900 JMP NEAR DWORD PTR DS:[3963FC] ; kernel32.LocalAlloc 0040660A 8BC0 MOV EAX, EAX 0040660C - FF25 E0643900 JMP NEAR DWORD PTR DS:[3964E0] ; kernel32.TlsGetValue 00406612 8BC0 MOV EAX, EAX 00406614 - FF25 785F3900 JMP NEAR DWORD PTR DS:[395F78] ; kernel32.TlsSetValue 0040661A 8BC0 MOV EAX, EAX 0040661C 50 PUSH EAX 0040661D 6A 40 PUSH 40 0040661F E8 E0FFFFFF CALL ANTICC.00406604 ; JMP to kernel32.LocalAlloc 00406624 C3 RETN 00406625 8D40 00 LEA EAX, DWORD PTR DS:[EAX] 00406628 - E9 E5C8EA01 JMP 022B2F12 // 返回到壳里。。。。根据FLY以前的文章判断这就是Code Splicing了 0040662D C3 RETN 0040662E 8BC0 MOV EAX, EAX 00406630 53 PUSH EBX 00406631 E8 F2FFFFFF CALL ANTICC.00406628 00406636 8BD8 MOV EBX, EAX 00406638 85DB TEST EBX, EBX 0040663A 74 36 JE SHORT ANTICC.00406672 0040663C 833D 9CA04B00 FF CMP DWORD PTR DS:[4BA09C], -1 00406643 75 0A JNZ SHORT ANTICC.0040664F 00406645 - E9 E6C8EA01 JMP 022B2F30 // 返回到壳里。。。。根据FLY以前的文章判断这就是Code Splicing了 当光标停在004065FC 处时 注意看信息窗口提示 : DS:[00395F54]=7C80B529 (kernel32.GetModuleHandleA) //不同的机子或许不一样的 00395F54 就是IAT表的地址。其实上面做的就是查找IAT表的地址。现在我们在数据窗口跟随地址,就出现了乱续后的 IAT表 如下: 00395F54 7C80B529 kernel32.GetModuleHandleA 00395F58 77D6AA06 USER32.SetMenuItemInfoA 00395F5C 77D1FACD USER32.EnumThreadWindows 00395F60 77D3EC98 USER32.LoadStringA 00395F64 770F71A2 OLEAUT32.SetErrorInfo 00395F68 77F07C0C GDI32.SetEnhMetaFileBits 00395F6C 7C80B529 kernel32.GetModuleHandleA 00395F70 7C80D47E kernel32.GetLocaleInfoA 00395F74 770F4850 OLEAUT32.SysFreeString 00395F78 7C809BF5 kernel32.TlsSetValue 00395F7C 77D18C06 USER32.SetTimer 00395F80 77D1C64D USER32.InflateRect 00395F84 7C882FD3 kernel32.LoadLibraryExA 向上翻倒结束 00395D90 00140121 00395D94 001807D7 //开始 记住这个地址待会有用,然后算出表的大小= 8F4 .这些待会都有用的。 00395D98 77D1F807 USER32.DrawEdge 00395D9C 77D1BCBD USER32.DispatchMessageA 00395DA0 77D1E666 USER32.DestroyWindow 00395DA4 77D5050B USER32.MessageBoxA 00395DA8 77D3FA46 USER32.GetKeyboardType 00395DAC 77EFA990 GDI32.SetROP2 00395DB0 77D1E3A1 USER32.DestroyMenu 00395DB4 77D1E8CE USER32.DestroyIcon 向下翻倒结束 00396670 77D1CEFD USER32.PeekMessageA 00396674 77D25380 USER32.SetActiveWindow 00396678 77D32420 USER32.DrawFrameControl 0039667C 77D35C98 USER32.IsDialogMessageA 00396680 7C81E4BD kernel32.CreateEventA 00396684 7C80977B kernel32.InterlockedIncrement 00396688 ABABABAB /// 结束 0039668C ABABABAB Import Table Elimination 所在处我们已经找到 接下来就是Code Splicing 了 我们在看回上面的代码: 004065FC - FF25 545F3900 JMP NEAR DWORD PTR DS:[395F54] ; kernel32.GetModuleHandleA // 光标停在这里。。 00406602 8BC0 MOV EAX, EAX 00406604 - FF25 FC633900 JMP NEAR DWORD PTR DS:[3963FC] ; kernel32.LocalAlloc 0040660A 8BC0 MOV EAX, EAX 0040660C - FF25 E0643900 JMP NEAR DWORD PTR DS:[3964E0] ; kernel32.TlsGetValue 00406612 8BC0 MOV EAX, EAX 00406614 - FF25 785F3900 JMP NEAR DWORD PTR DS:[395F78] ; kernel32.TlsSetValue 0040661A 8BC0 MOV EAX, EAX 0040661C 50 PUSH EAX 0040661D 6A 40 PUSH 40 0040661F E8 E0FFFFFF CALL ANTICC.00406604 ; JMP to kernel32.LocalAlloc 00406624 C3 RETN 00406625 8D40 00 LEA EAX, DWORD PTR DS:[EAX] 00406628 - E9 E5C8EA01 JMP 022B2F12 // 返回到壳里。。。。根据FLY以前的文章判断这就是Code Splicing了 0040662D C3 RETN //不同的机器位置也不一样的。。 0040662E 8BC0 MOV EAX, EAX 00406630 53 PUSH EBX 00406631 E8 F2FFFFFF CALL ANTICC.00406628 00406636 8BD8 MOV EBX, EAX 00406638 85DB TEST EBX, EBX 0040663A 74 36 JE SHORT ANTICC.00406672 0040663C 833D 9CA04B00 FF CMP DWORD PTR DS:[4BA09C], -1 00406643 75 0A JNZ SHORT ANTICC.0040664F 00406645 - E9 E6C8EA01 JMP 022B2F30 // 返回到壳里。。。。根据FLY以前的文章判断这就是Code Splicing了 ,跟进 到达显示如下: 020A2F30 F7D6 NOT ESI 020A2F32 0FCB BSWAP EBX 020A2F34 75 02 JNZ SHORT 020A2F38 020A2F36 75 41 JNZ SHORT 020A2F79 020A2F38 50 PUSH EAX 020A2F39 66:87FA XCHG DX, DI 020A2F3C 66:87FA XCHG DX, DI 020A2F3F 66:87D2 XCHG DX, DX 020A2F42 78 00 JS SHORT 020A2F44 020A2F44 66:87FA XCHG DX, DI 020A2F47 66:87FA XCHG DX, DI 020A2F4A 58 POP EAX 020A2F4B 0FCB BSWAP EBX 经过上翻下翻得出: 020A0000 66:87FA XCHG DX, DI //Code Splicing开始 记住待会有用 020A0003 66:87F6 XCHG SI, SI 020A0006 66:87FA XCHG DX, DI 020A0009 BB 0A000000 MOV EBX, 0A 020A000E 54 PUSH ESP 020A000F - E9 951336FE JMP ANTICC.004013A9 020AFFA5 91 XCHG EAX, ECX 020AFFA6 0FC9 BSWAP ECX 020AFFA8 66:87CB XCHG BX, CX 020AFFAB 8BFF MOV EDI, EDI 020AFFAD 66:87CB XCHG BX, CX 020AFFB0 0FC9 BSWAP ECX 020AFFB2 91 XCHG EAX, ECX 020AFFB3 75 00 JNZ SHORT 020AFFB5 020AFFB5 50 PUSH EAX 020AFFB6 56 PUSH ESI 020AFFB7 8B43 04 MOV EAX, DWORD PTR DS:[EBX+4] 020AFFBA 50 PUSH EAX 020AFFBB - E9 AB2F37FE JMP ANTICC.00422F6B //Code Splicing结束 大小为 ffc0 020AFFC0 0000 ADD BYTE PTR DS:[EAX], AL 现在位置都确定 我们就打开 ArmInline 7.1 [sleiv] process ID = 看文件-->附加-->ID Start Of Target Code = 00401000 Length Of Target Code = 000B9000 在ArmInline的Code Splicing选项添入: =================================== Start Of Spliced Code = 020A0000 Length Of spliced Code = 0000ffc0 点“remove splicing”。 Patch succesful修复成功。 ----------------------------------- 在Import Elimination选项添入: Base Of Existing IAT=00395D94 Length Of Existing IAT=8F4 New Base RVA Of IAT=4C1000 //即内存窗口的.idata 段的开始位置 点“rebase IAT”。 IAT Elimination修复成功。 =================================== 完成修复之后就打开LordPE_fix 修正大小后 dump 完整转存。再用ImportREC 1.6 修复IAT表,就可以完工了 PEID 深度扫描显示 Borland Delphi 6.0 - 7.0 OK 还有些效验 要去除才可以正常运行。。

【经验总结】这个教会大家如可使用现有的工具快速达到脱壳的目的,但是基础才是最重要。
上一篇   下一篇