【破文标题】初学脱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直播授课