初学脱Armadillo单进程标准壳及两种保护方式笔记
【破文标题】初学脱Armadillo单进程标准壳及两种保护方式笔记【破文作者】dgrzh(交响诗篇)
【作者邮箱】[email protected]
【破解工具】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 00000000mov eax,dword ptr fs:
0051BC58 50 push eax
0051BC59 64:8925 0000000>mov dword ptr fs:,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:,0
7C80B532 74 18 je short kernel32.7C80B54C这里下硬件执行断点
7C80B534 FF75 08 push dword ptr ss:
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:
7C80B543 E8 F4300000 call 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返回
00C15FC9 8B0D AC40C400 mov ecx,dword ptr ds: 来到这里
00C15FCF 89040E mov dword ptr ds:,eax
00C15FD2 A1 AC40C400 mov eax,dword ptr ds:
00C15FD7 391C06 cmp dword ptr ds:,ebx
00C15FDA 75 16 jnz short 00C15FF2
00C15FDC 8D85 B4FEFFFF lea eax,dword ptr ss:
00C15FE2 50 push eax
00C15FE3 FF15 BC62C300 call dword ptr ds: ; kernel32.LoadLibraryA
00C15FE9 8B0D AC40C400 mov ecx,dword ptr ds:
00C15FEF 89040E mov dword ptr ds:,eax
00C15FF2 A1 AC40C400 mov eax,dword ptr ds:
00C15FF7 391C06 cmp dword ptr ds:,ebx
00C15FFA 0F84 2F010000 je 00C1612F 把Je改为Jmp(修改Magic Jump)改好后回车
00C16000 33C9 xor ecx,ecx
00C16002 8B07 mov eax,dword ptr ds:
00C16004 3918 cmp dword ptr ds:,ebx
00C16006 74 06 je short 00C1600E
00C1612F 83C7 0C add edi,0C 来到这里
00C16132 89BD 78FDFFFF mov dword ptr ss:,edi
00C16138 83C6 04 add esi,4
00C1613B 395F FC cmp dword ptr ds:,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: ; 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:
00C2F9D1 FF77 08 push dword ptr ds:
00C2F9D4 6A 00 push 0
00C2F9D6 FF77 0C push dword ptr ds:
00C2F9D9 8B50 60 mov edx,dword ptr ds:
00C2F9DC 3350 44 xor edx,dword ptr ds:
00C2F9DF 3350 1C xor edx,dword ptr ds:
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:
004C5301 8B00 mov eax,dword ptr ds:
004C5303 E8 CCFDF9FF call Loader.004650D4
004C5308 8B0D 4C9E4C00 mov ecx,dword ptr ds: ; Loader.004CB034
ctrl+b 输入FF 25(现在来查找IAT的起始地址)
004012F4 - FF25 CC15E200 jmp dword ptr ds: ; kernel32.RaiseException这里右健-数据窗口中跟随-内存地址
004012FA 8BC0 mov eax,eax
004012FC - FF25 C417E200 jmp dword ptr ds: ; ntdll.RtlUnwind
00401302 8BC0 mov eax,eax
00401304 - FF25 EC14E200 jmp dword ptr ds: ; kernel32.UnhandledExceptionFilter
0040130A 8BC0 mov eax,eax
0040130C - FF25 B818E200 jmp dword ptr ds: ; kernel32.WriteFile
00401312 8BC0 mov eax,eax
00401314 - FF25 381CE200 jmp dword ptr ds: ; USER32.CharNextA
0040131A 8BC0 mov eax,eax
0040131C - FF25 A018E200 jmp dword ptr ds: ; 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默认在我这里也就是.idata段
点Rebase IAT 修复 在右边窗口可以看到提示:修复成功
然后用LordPE dump。在用ImportREC修复即可。 /:good /:good 学习中…… 感谢楼主分享。。。。。。。。
页:
[1]