首页
社区
课程
招聘
[原创]初学脱Armadillo单进程标准壳及两种保护方式笔记
发表于: 2008-5-2 15:47 5922

[原创]初学脱Armadillo单进程标准壳及两种保护方式笔记

2008-5-2 15:47
5922
【破文标题】初学脱Armadillo单进程标准壳及两种保护方式笔记
【破文作者】dgrzh
【作者邮箱】dgrzh@sohu.com
【破解工具】OD,PEID,ArmInLine,ImportREC,LordPE
【破解平台】XP
【软件名称】菜鸟辅助V6.61
【破解声明】看了许多前辈和高手的文章,一直想自己也来动手脱壳。刚好碰到这个软柿子,
于是有了这篇文章。没什么技术含量,只是个人的学习脱壳笔记记录。请大家多多指教。
------------------------------------------------------------------------
PEID查为Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
用FI查为Armadillo 4.00
保护方式
标准版单进程
Protection Options>
Standard protection or Minimum protection
Enable Import Table Elimination
Enable Strategic Code Splicing

OD载入程序,忽略所有异常
0051BC43 Lo>  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 0000000>mov dword ptr fs:[0],esp
CTRL+G  输入GetModuleHandleA
7C80B529 ke>  8BFF            mov edi,edi   来到这里,下面有两个je,选下面第一个
7C80B52B      55              push ebp
7C80B52C      8BEC            mov ebp,esp
7C80B52E      837D 08 00      cmp dword ptr ss:[ebp+8],0
7C80B532      74 18           je short kernel32.7C80B54C  这里下硬件执行断点
7C80B534      FF75 08         push dword ptr ss:[ebp+8]
7C80B537      E8 682D0000     call kernel32.7C80E2A4
7C80B53C      85C0            test eax,eax
7C80B53E      74 08           je short kernel32.7C80B548
7C80B540      FF70 04         push dword ptr ds:[eax+4]
7C80B543      E8 F4300000     call kernel32.GetModuleHandleW
Shift+F9按了N多下(这时注意看堆栈窗口)
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返回
00C15FC9      8B0D AC40C400   mov ecx,dword ptr ds:[C440AC]   来到这里
00C15FCF      89040E          mov dword ptr ds:[esi+ecx],eax
00C15FD2      A1 AC40C400     mov eax,dword ptr ds:[C440AC]
00C15FD7      391C06          cmp dword ptr ds:[esi+eax],ebx
00C15FDA      75 16           jnz short 00C15FF2
00C15FDC      8D85 B4FEFFFF   lea eax,dword ptr ss:[ebp-14C]
00C15FE2      50              push eax
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   把Je改为Jmp(修改Magic Jump)改好后回车
00C16000      33C9            xor ecx,ecx
00C16002      8B07            mov eax,dword ptr ds:[edi]
00C16004      3918            cmp dword ptr ds:[eax],ebx
00C16006      74 06           je short 00C1600E

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  这里下F2断点
Shift+F9断下后,返回上面找到修改处

00C15FFA      0F84 2F010000   jmp 00C1612F   找到这里,撤消选择处修改(也就是把修改处改回来)

CTRL+G  输入CreateThread
7C81082F ke>  8BFF            mov edi,edi   来到这里,下F2断点
7C810831      55              push ebp
7C810832      8BEC            mov ebp,esp
Shift+F9断下后,取消断点,ALT+F9返回
00C1C51E      50              push eax   来到这里,F8单步走
00C1C51F      FF15 4C62C300   call dword ptr ds:[C3624C]             ; kernel32.CloseHandle
00C1C525      5F              pop edi
00C1C526      5E              pop esi
00C1C527      C9              leave
00C1C528      C3              retn
.....................................................
中间剩略
.....................................................
00C2F9C9      83FA 01         cmp edx,1
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进去

为什么?看信息窗口显示
ecx=004C52EC (Loader.004C52EC)  大的跳转,明显是OEP

004C52EC      55              push ebp   这里是OEP
004C52ED      8BEC            mov ebp,esp
004C52EF      83C4 F0         add esp,-10
004C52F2      B8 6C4E4C00     mov eax,Loader.004C4E6C
004C52F7      E8 1418F4FF     call Loader.00406B10
004C52FC      A1 8C9C4C00     mov eax,dword ptr ds:[4C9C8C]
004C5301      8B00            mov eax,dword ptr ds:[eax]
004C5303      E8 CCFDF9FF     call Loader.004650D4
004C5308      8B0D 4C9E4C00   mov ecx,dword ptr ds:[4C9E4C]          ; Loader.004CB034
ctrl+b 输入FF 25(现在来查找IAT的起始地址)
004012F4    - FF25 CC15E200   jmp dword ptr ds:[E215CC]              ; kernel32.RaiseException这里右健-数据窗口中跟随-内存地址
004012FA      8BC0            mov eax,eax
004012FC    - FF25 C417E200   jmp dword ptr ds:[E217C4]              ; ntdll.RtlUnwind
00401302      8BC0            mov eax,eax
00401304    - FF25 EC14E200   jmp dword ptr ds:[E214EC]              ; kernel32.UnhandledExceptionFilter
0040130A      8BC0            mov eax,eax
0040130C    - FF25 B818E200   jmp dword ptr ds:[E218B8]              ; kernel32.WriteFile
00401312      8BC0            mov eax,eax
00401314    - FF25 381CE200   jmp dword ptr ds:[E21C38]              ; USER32.CharNextA
0040131A      8BC0            mov eax,eax
0040131C    - FF25 A018E200   jmp dword ptr ds:[E218A0]              ; kernel32.CreateThread
在数据窗口中往上找,数值全为零的就是IAT的起始位置。同样往下找,数值全为零的就是IAT的结束位置。
为了更好观察,在数据窗口里右健-长型-地址。
00E213E4  00000000  IAT的起始位置
00E213E8  0006012C
00E213EC  021C07F4
00E213F0  76A78416  ole32.OleDraw
00E213F4  769F3FB3  ole32.OleSetMenuDescriptor
00E213F8  7C810C8F  kernel32.GetFileSize
00E213FC  769A204C  ole32.CoTaskMemFree
00E21400  7C823094  kernel32.GlobalFindAtomA

这时打开ArmInLine
选择程序的ID 在OD里打开附加就可查看到
code splicing
star of spliced code:3430000程序自己找到的一般都正确
length of spliced code:20000这里改成两万
点remove splices 修复 在右边窗口可以看到提示:修复成功

import elimination
Base Of Existing IAT:00E213E4
Length Of Existing IAT :1000懒的算就填1000
new base VA of IAT :4CC000默认在我这里也就是.idata段
点Rebase IAT 修复 在右边窗口可以看到提示:修复成功

然后用LordPE dump。在用ImportREC修复即可。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 244
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
大哥,要是在CreateThread下端点,段不下来,出现一片红的,跑飞了,怎么办?
2008-5-5 11:11
0
雪    币: 142
活跃值: (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
再多试下,不会的吧!!
2008-5-5 21:00
0
雪    币: 244
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
有的时候需要多试几次。
2008-5-10 16:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这确实是个软柿子,偶等菜鸟也搞定了,但它的网络破解却难搞了,有兴趣加QQ指点一下,本人QQ:66558226
2008-5-19 22:12
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
2008-5-20 14:44
0
游客
登录 | 注册 方可回帖
返回
//