315技术社区's Archiver

咨询客服QQ:604164

伊飒 发表于 2008-5-3 14:41

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

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

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.