【文章标题】: 传奇私服伴侣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
还有些效验 要去除才可以正常运行。。
--------------------------------------------------------------------------------
【经验总结】
这个教会大家如可使用现有的工具快速达到脱壳的目的,但是基础才是最重要。。。
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!
2006年03月13日 22:30:51
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)