好友
阅读权限 20
听众
最后登录 1970-1-1
dgrzh
发表于 2008-7-27 10:23
【破文标题】初学脱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>55push ebp载入后停在这里
0051BC448BECmov ebp,esp
0051BC466A FFpush -1
0051BC4868 904F5400push Loader.00544F90
0051BC4D68 80B95100push Loader.0051B980
0051BC5264:A1 00000000mov eax,dword ptr fs:[0]
0051BC5850push eax
0051BC5964:8925 0000000>mov dword ptr fs:[0],esp
CTRL+G输入GetModuleHandleA
7C80B529 ke>8BFFmov edi,edi来到这里,下面有两个je,选下面第一个
7C80B52B55push ebp
7C80B52C8BECmov ebp,esp
7C80B52E837D 08 00cmp dword ptr ss:[ebp+8],0
7C80B53274 18je short kernel32.7C80B54C这里下硬件执行断点
7C80B534FF75 08push dword ptr ss:[ebp+8]
7C80B537E8 682D0000call kernel32.7C80E2A4
7C80B53C85C0test eax,eax
7C80B53E74 08je short kernel32.7C80B548
7C80B540FF70 04push dword ptr ds:[eax+4]
7C80B543E8 F4300000call kernel32.GetModuleHandleW
Shift+F9按了N多下(这时注意看堆栈窗口)
00129524/0012EC6C
00129528|00C27105返回到 00C27105 来自 kernel32.GetModuleHandleA
0012952C|00C3BC1CASCII "kernel32.dll"
00129530|00C3CEC4ASCII "VirtualAlloc"看的这个就要注意了
在一下
00129524/0012EC6C
00129528|00C27122返回到 00C27122 来自 kernel32.GetModuleHandleA
0012952C|00C3BC1CASCII "kernel32.dll"
00129530|00C3CEB8ASCII "VirtualFree"
在一下
00129288/00129528
0012928C|00C15FC9返回到 00C15FC9 来自 kernel32.GetModuleHandleA
00129290|001293DCASCII "kernel32.dll"看到这个说明返回时机到了
删除硬件断点ALT+F9返回
00C15FC98B0D AC40C400mov ecx,dword ptr ds:[C440AC]来到这里
00C15FCF89040Emov dword ptr ds:[esi+ecx],eax
00C15FD2A1 AC40C400mov eax,dword ptr ds:[C440AC]
00C15FD7391C06cmp dword ptr ds:[esi+eax],ebx
00C15FDA75 16jnz short 00C15FF2
00C15FDC8D85 B4FEFFFFlea eax,dword ptr ss:[ebp-14C]
00C15FE250push eax
00C15FE3FF15 BC62C300call dword ptr ds:[C362BC]; kernel32.LoadLibraryA
00C15FE98B0D AC40C400mov ecx,dword ptr ds:[C440AC]
00C15FEF89040Emov dword ptr ds:[esi+ecx],eax
00C15FF2A1 AC40C400mov eax,dword ptr ds:[C440AC]
00C15FF7391C06cmp dword ptr ds:[esi+eax],ebx
00C15FFA0F84 2F010000je 00C1612F把Je改为Jmp(修改Magic Jump)改好后回车
00C1600033C9xor ecx,ecx
00C160028B07mov eax,dword ptr ds:[edi]
00C160043918cmp dword ptr ds:[eax],ebx
00C1600674 06je short 00C1600E
00C1612F83C7 0Cadd edi,0C来到这里
00C1613289BD 78FDFFFFmov dword ptr ss:[ebp-288],edi
00C1613883C6 04add esi,4
00C1613B395F FCcmp dword ptr ds:[edi-4],ebx
00C1613E^ 0F85 49FEFFFFjnz 00C15F8D
00C16144EB 03jmp short 00C16149这里下F2断点
Shift+F9断下后,返回上面找到修改处
00C15FFA0F84 2F010000jmp 00C1612F找到这里,撤消选择处修改(也就是把修改处改回来)
CTRL+G输入CreateThread
7C81082F ke>8BFFmov edi,edi来到这里,下F2断点
7C81083155push ebp
7C8108328BECmov ebp,esp
Shift+F9断下后,取消断点,ALT+F9返回
00C1C51E50push eax来到这里,F8单步走
00C1C51FFF15 4C62C300call dword ptr ds:[C3624C]; kernel32.CloseHandle
00C1C5255Fpop edi
00C1C5265Epop esi
00C1C527C9leave
00C1C528C3retn
.....................................................
中间剩略
.....................................................
00C2F9C983FA 01cmp edx,1
00C2F9CC75 1Bjnz short 00C2F9E9
00C2F9CEFF77 04push dword ptr ds:[edi+4]
00C2F9D1FF77 08push dword ptr ds:[edi+8]
00C2F9D46A 00push 0
00C2F9D6FF77 0Cpush dword ptr ds:[edi+C]
00C2F9D98B50 60mov edx,dword ptr ds:[eax+60]
00C2F9DC3350 44xor edx,dword ptr ds:[eax+44]
00C2F9DF3350 1Cxor edx,dword ptr ds:[eax+1C]
00C2F9E22BCAsub ecx,edx
00C2F9E4FFD1call ecx来到这里 F7进去
为什么?看信息窗口显示
ecx=004C52EC (Loader.004C52EC)大的跳转,明显是OEP
004C52EC55push ebp这里是OEP
004C52ED8BECmov ebp,esp
004C52EF83C4 F0add esp,-10
004C52F2B8 6C4E4C00mov eax,Loader.004C4E6C
004C52F7E8 1418F4FFcall Loader.00406B10
004C52FCA1 8C9C4C00mov eax,dword ptr ds:[4C9C8C]
004C53018B00mov eax,dword ptr ds:[eax]
004C5303E8 CCFDF9FFcall Loader.004650D4
004C53088B0D 4C9E4C00mov ecx,dword ptr ds:[4C9E4C]; Loader.004CB034
ctrl+b 输入FF 25(现在来查找IAT的起始地址)
004012F4- FF25 CC15E200jmp dword ptr ds:[E215CC]; kernel32.RaiseException这里右健-数据窗口中跟随-内存地址
004012FA8BC0mov eax,eax
004012FC- FF25 C417E200jmp dword ptr ds:[E217C4]; ntdll.RtlUnwind
004013028BC0mov eax,eax
00401304- FF25 EC14E200jmp dword ptr ds:[E214EC]; kernel32.UnhandledExceptionFilter
0040130A8BC0mov eax,eax
0040130C- FF25 B818E200jmp dword ptr ds:[E218B8]; kernel32.WriteFile
004013128BC0mov eax,eax
00401314- FF25 381CE200jmp dword ptr ds:[E21C38]; USER32.CharNextA
0040131A8BC0mov eax,eax
0040131C- FF25 A018E200jmp dword ptr ds:[E218A0]; kernel32.CreateThread
在数据窗口中往上找,数值全为零的就是IAT的起始位置。同样往下找,数值全为零的就是IAT的结束位置。
为了更好观察,在数据窗口里右健-长型-地址。
00E213E400000000IAT的起始位置
00E213E80006012C
00E213EC021C07F4
00E213F076A78416ole32.OleDraw
00E213F4769F3FB3ole32.OleSetMenuDescriptor
00E213F87C810C8Fkernel32.GetFileSize
00E213FC769A204Cole32.CoTaskMemFree
00E214007C823094kernel32.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默认在我这里也就是.IDA ta段
点Rebase IAT 修复 在右边窗口可以看到提示:修复成功
然后用LordPE dump。在用ImportREC修复即可。