【文章标题】: 菜鸟也脱Armadillo的Code Splicing和Import Table Elimination
【文章作者】: 寂寞的季节
【作者邮箱】: runle@163.com
【作者主页】: www.TheJiMo.cn
【软件名称】: 《侠义道II·侠义菜鸟辅助》
【下载地址】: 看雪论坛求助贴
【保护方式】: Armadillo的Code Splicing和Import Table Elimination
【使用工具】: OllyDBD、PEiD、LordPE、ImportREC、ArmInline
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
先八卦一下:
假期快结束了,又懒散过了一个月.啥也没学,就老想女生了....俺真失败.总要找点东西去做,否则会更颓废的.神啊 救救我吧
长期潜水来,第一次写脱文,因为俺很懒.
_____________________________________________________________
【大概流程】:
1.寻找OEP
2.IAT大小
3.ArmInline解决Code Splicing和Import Table Elimination
4.修复
_____________________________________________________________
!- Protected Armadillo
Protection system (Professional)
!- <Protection Options>
Standard protection or Minimum protection
Enable Import Table Elimination
Enable Strategic Code Splicing
!- <Backup Key Options>
Fixed Backup Keys
!- <Compression Options>
Best/Slowest Compression
!- <Other Options>
!- Version 4.40 31October2005
标准版的保护方式,不是很麻烦.
_____________________________________________________________
一.OEP
1.寻找Magic Jump返回的时机
忽略所有异常,隐藏OD
0051BC43 > 55 push ebp
0051BC44 8BEC mov ebp,esp
0051BC46 6A FF push -1
0051BC48 68 904F5400 push Loader.00544F90
0051BC4D 68 80B95100 push Loader.0051B980
0051BC52 64:A1 00000000 mov eax,dword ptr fs:[0]
0051BC58 50 push eax
0051BC59 64:8925 00000000 mov dword ptr fs:[0],esp
0051BC60 83EC 58 sub esp,58
0051BC63 53 push ebx
0051BC64 56 push esi
下断:he GetModuleHandleA+5 Shift+F9 观察堆栈
0012FF34 /0012FFC0
0012FF38 |0051BD0B 返回到 Loader.0051BD0B 来自 kernel32.GetModuleHandleA
0012EE60 /0012EE98
0012EE64 |5D175324 返回到 5D175324 来自 kernel32.GetModuleHandleA
0012EE68 |5D175370 ASCII "kernel32.dll"
0012EF20 /0012EF3C
0012EF24 |77F45BD8 返回到 SHLWAPI.77F45BD8 来自 kernel32.GetModuleHandleA
0012EF28 |77F4501C ASCII "KERNEL32.DLL"
0012F738 /0012F7A0
0012F73C |005068F3 返回到 Loader.005068F3 来自 kernel32.GetModuleHandleA
00129524 /0012EC6C
00129528 |00C27105 返回到 00C27105 来自 kernel32.GetModuleHandleA
0012952C |00C3BC1C ASCII "kernel32.dll"
00129530 |00C3CEC4 ASCII "VirtualAlloc"
00129524 /0012EC6C
00129528 |00C27122 返回到 00C27122 来自 kernel32.GetModuleHandleA
0012952C |00C3BC1C ASCII "kernel32.dll"
00129530 |00C3CEB8 ASCII "VirtualFree"
00129288 /00129528
0012928C |00C15FC9 返回到 00C15FC9 来自 kernel32.GetModuleHandleA
00129290 |001293DC ASCII "kernel32.dll"
删除断点 ALT+F9返回
00C15FE3 FF15 BC62C300 call dword ptr ds:[C362BC] ; kernel32.LoadLibraryA
00C15FE9 8B0D AC40C400 mov ecx,dword ptr ds:[C440AC]
00C15FEF 89040E mov dword ptr ds:[esi+ecx],eax
00C15FF2 A1 AC40C400 mov eax,dword ptr ds:[C440AC]
00C15FF7 391C06 cmp dword ptr ds:[esi+eax],ebx
00C15FFA 0F84 2F010000 je 00C1612F
00C16000 33C9 xor ecx,ecx
00C16002 8B07 mov eax,dword ptr ds:[edi]
00C16004 3918 cmp dword ptr ds:[eax],ebx
je 00C1612F修改jmp 00C1612F 回车跟到下面
00C1612F 83C7 0C add edi,0C
00C16132 89BD 78FDFFFF mov dword ptr ss:[ebp-288],edi
00C16138 83C6 04 add esi,4
00C1613B 395F FC cmp dword ptr ds:[edi-4],ebx
00C1613E ^ 0F85 49FEFFFF jnz 00C15F8D
00C16144 EB 03 jmp short 00C16149
00C16146 D6 salc
00C16147 D6 salc
jmp short 00C16149 下硬件断点 Shift+F9 断下 删除断点
向上找回原来的Magic Jump撤销选择
下断:BP CreateThread
7C810637 > 8BFF mov edi,edi
7C810639 55 push ebp
7C81063A 8BEC mov ebp,esp
7C81063C FF75 1C push dword ptr ss:[ebp+1C]
7C81063F FF75 18 push dword ptr ss:[ebp+18]
7C810642 FF75 14 push dword ptr ss:[ebp+14]
7C810645 FF75 10 push dword ptr ss:[ebp+10]
7C810648 FF75 0C push dword ptr ss:[ebp+C]
7C81064B FF75 08 push dword ptr ss:[ebp+8]
取消断点 ALT+F9
00C1C51E 50 push eax
00C1C51F FF15 4C62C300 call dword ptr ds:[C3624C] ; kernel32.CloseHandle
00C1C525 5F pop edi
00C1C526 5E pop esi
00C1C527 C9 leave
00C1C528 C3 retn
F8一路向下
00C2F9CC /75 1B jnz short 00C2F9E9
00C2F9CE |FF77 04 push dword ptr ds:[edi+4]
00C2F9D1 |FF77 08 push dword ptr ds:[edi+8]
00C2F9D4 |6A 00 push 0
00C2F9D6 |FF77 0C push dword ptr ds:[edi+C]
00C2F9D9 |8B50 60 mov edx,dword ptr ds:[eax+60]
00C2F9DC |3350 44 xor edx,dword ptr ds:[eax+44]
00C2F9DF |3350 1C xor edx,dword ptr ds:[eax+1C]
00C2F9E2 |2BCA sub ecx,edx
00C2F9E4 |FFD1 call ecx ; F7跟进去
004C5324 55 push ebp OEP
004C5325 8BEC mov ebp,esp
004C5327 83C4 F0 add esp,-10
004C532A B8 A44E4C00 mov eax,Loader.004C4EA4
004C532F E8 DC17F4FF call Loader.00406B10
004C5334 A1 8C9C4C00 mov eax,dword ptr ds:[4C9C8C]
004C5339 8B00 mov eax,dword ptr ds:[eax]
004C533B E8 94FDF9FF call Loader.004650D4
_____________________________________________________________
二.寻找IAT大小
Ctrl+b 搜索 FF 25
004012FC - FF25 E81BE400 jmp dword ptr ds:[E41BE8] ; ntdll.RtlUnwind
00401302 8BC0 mov eax,eax
00401304 - FF25 1C16E400 jmp dword ptr ds:[E4161C] ; kernel32.UnhandledExceptionFilter
0040130A 8BC0 mov eax,eax
0040130C - FF25 D018E400 jmp dword ptr ds:[E418D0] ; kernel32.WriteFile
00401312 8BC0 mov eax,eax
00401314 - FF25 AC1BE400 jmp dword ptr ds:[E41BAC] ; USER32.CharNextA
0040131A 8BC0 mov eax,eax
0040131C - FF25 8014E400 jmp dword ptr ds:[E41480] ; kernel32.CreateThread
jmp dword ptr ds:[E4161C]
数据窗口中跟随 内存地址
00E413B8 0006012C
00E413BC 021C0756
00E413C0 77D2F8EA USER32.FrameRect
00E413C4 77D18E28 USER32.RegisterWindowMessageA
00E41D68 76B10000 winmm.76B10000
00E41D6C BAADF00D
IAT头 00E413BC
IAT大小00E41D6C-00E413BC=9B0
_____________________________________________________________
三.ArmInline解决Code Splicing和Import Table Elimination
打开ArmInline选择进程Loader.exe[468]
Code Splicing选项中将代码长度改为20000
Import Table输入自己记录数据 IAT头00E413BC 大小9B0 新建的IAT它提供的信息是4CC000 我们到内存窗口看下
内存映射,项目 26
地址=004CC000
大小=00003000 (12288.)
物主=Loader 00400000
区段=.idata
类型=Imag 01001002
访问=R
初始访问=RWE
正好不用修改了 删除拼接和变基IAT
_____________________________________________________________
四.修复
ArmInline修复完毕后就可以用LordPE来dump进程了
ImportREC载入修复,全是有效的,保存吧
可以运行了 Borland Delphi 6.0 - 7.0
--------------------------------------------------------------------------------
【经验总结】
标准版的没啥难度,非标准版就麻烦许多,而且没有CC保护更容易了. 感谢观赏
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!
2008年02月16日 下午 07:46:04
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!