交响诗篇 发表于 2008-5-2 15:50:01

初学脱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修复即可。

cshkviper 发表于 2008-5-2 22:19:16

angelfish 发表于 2008-5-3 12:13:10

/:good /:good 学习中……

hyhnet 发表于 2008-5-5 16:44:34

感谢楼主分享。。。。。。。。
页: [1]
查看完整版本: 初学脱Armadillo单进程标准壳及两种保护方式笔记