初学脱Armadillo单进程标准壳及两种保护方式笔记
【破文标题】初学脱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:
0051BC5850push eax
0051BC5964:8925 0000000>mov dword ptr fs:,esp
CTRL+G输入GetModuleHandleA
7C80B529 ke>8BFFmov edi,edi来到这里,下面有两个je,选下面第一个
7C80B52B55push ebp
7C80B52C8BECmov ebp,esp
7C80B52E837D 08 00cmp dword ptr ss:,0
7C80B53274 18je short kernel32.7C80B54C这里下硬件执行断点
7C80B534FF75 08push dword ptr ss:
7C80B537E8 682D0000call kernel32.7C80E2A4
7C80B53C85C0test eax,eax
7C80B53E74 08je short kernel32.7C80B548
7C80B540FF70 04push dword ptr ds:
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:来到这里
00C15FCF89040Emov dword ptr ds:,eax
00C15FD2A1 AC40C400mov eax,dword ptr ds:
00C15FD7391C06cmp dword ptr ds:,ebx
00C15FDA75 16jnz short 00C15FF2
00C15FDC8D85 B4FEFFFFlea eax,dword ptr ss:
00C15FE250push eax
00C15FE3FF15 BC62C300call dword ptr ds:; kernel32.LoadLibraryA
00C15FE98B0D AC40C400mov ecx,dword ptr ds:
00C15FEF89040Emov dword ptr ds:,eax
00C15FF2A1 AC40C400mov eax,dword ptr ds:
00C15FF7391C06cmp dword ptr ds:,ebx
00C15FFA0F84 2F010000je 00C1612F把Je改为Jmp(修改Magic Jump)改好后回车
00C1600033C9xor ecx,ecx
00C160028B07mov eax,dword ptr ds:
00C160043918cmp dword ptr ds:,ebx
00C1600674 06je short 00C1600E
00C1612F83C7 0Cadd edi,0C来到这里
00C1613289BD 78FDFFFFmov dword ptr ss:,edi
00C1613883C6 04add esi,4
00C1613B395F FCcmp dword ptr ds:,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:; kernel32.CloseHandle
00C1C5255Fpop edi
00C1C5265Epop esi
00C1C527C9leave
00C1C528C3retn
.....................................................
中间剩略
.....................................................
00C2F9C983FA 01cmp edx,1
00C2F9CC75 1Bjnz short 00C2F9E9
00C2F9CEFF77 04push dword ptr ds:
00C2F9D1FF77 08push dword ptr ds:
00C2F9D46A 00push 0
00C2F9D6FF77 0Cpush dword ptr ds:
00C2F9D98B50 60mov edx,dword ptr ds:
00C2F9DC3350 44xor edx,dword ptr ds:
00C2F9DF3350 1Cxor edx,dword ptr ds:
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:
004C53018B00mov eax,dword ptr ds:
004C5303E8 CCFDF9FFcall Loader.004650D4
004C53088B0D 4C9E4C00mov ecx,dword ptr ds:; Loader.004CB034
ctrl+b 输入FF 25(现在来查找IAT的起始地址)
004012F4- FF25 CC15E200jmp dword ptr ds:; kernel32.RaiseException这里右健-数据窗口中跟随-内存地址
004012FA8BC0mov eax,eax
004012FC- FF25 C417E200jmp dword ptr ds:; ntdll.RtlUnwind
004013028BC0mov eax,eax
00401304- FF25 EC14E200jmp dword ptr ds:; kernel32.UnhandledExceptionFilter
0040130A8BC0mov eax,eax
0040130C- FF25 B818E200jmp dword ptr ds:; kernel32.WriteFile
004013128BC0mov eax,eax
00401314- FF25 381CE200jmp dword ptr ds:; USER32.CharNextA
0040131A8BC0mov eax,eax
0040131C- FF25 A018E200jmp 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修复即可。 按照三人行的 bp OpenMutexA 双变但进程补代码
he OutputDebugStringA 字串
bp GetModuleHandleA+5 找 mj跳
三个断点 搞定不难 好文!利用楼主的方法脱壳新版的6.67成功!
但ximo的文章中那个记事本却脱不了,加壳是一样的.没藏住OD???
第一步:
设OD选项--》调试选项===》异常--》忽略所有(全勾上,包括单步)
设OD隐藏--》插件--》Invisible或者插件--》HideOD-->hide
第二步:载入notepad
提示:模块‘Notepad’入口点超出代码范围(在PE文件头中指定)。可能这是一个自解压或自修改文件。请在设置断点时记住这一点!
不明白怎么为,不管它先。也许这就是问题所在!
00544000 > 60 PUSHAD《---停在这儿了,和楼主的情况一样。
00544001 E8 00000000CALL Notepad.00544006
00544006 5D POP EBP
00544007 50 PUSH EAX
00544008 51 PUSH ECX
00544009 0FCA BSWAP EDX
0054400B F7D2 NOT EDX
0054400D 9C PUSHFD
0054400E F7D2 NOT EDX
00544010 0FCA BSWAP EDX
第三步:下断点:he GetModuleHandleA+9 我是用Ctrl+G 输入GetModuleHandleA+9
(第一次停下,得接着SHIFT+F9):
7C824753 74 18JE SHORT kernel32.7C82476D《---停在这儿了
7C824755 FF75 08PUSH DWORD PTR SS:
7C824758 E8 C2040000CALL kernel32.7C824C1F
7C82475D 85C0 TEST EAX,EAX
7C82475F 74 08JE SHORT kernel32.7C824769
7C824761 FF70 04PUSH DWORD PTR DS:
7C824764 E8 CD090000CALL kernel32.GetModuleHandleW
7C824769 5D POP EBP
7C82476A C2 0400RETN 4
7C82476D 64:A1 18000000 MOV EAX,DWORD PTR FS:
7C824773 8B40 30MOV EAX,DWORD PTR DS:
7C824776 8B40 08MOV EAX,DWORD PTR DS:
7C824779^EB EEJMP SHORT kernel32.7C824769
7C82477B 90 NOP
7C82477C 90 NOP
堆栈窗口:
0012FF9C 00000000
0012FFA0 00544000OFFSET Notepad.<模块入口点>
0012FFA4 8082E027
0012FFA8 00000000
0012FFAC 00000000
0012FFB0 7C957A5Bntdll.7C957A5B
0012FFB4 7C82F238kernel32.7C82F238
0012FFB8 FFFFFFFE
0012FFBC 00000009
0012FFC0 0012FFF8
0012FFC4 7C82F23B返回到 kernel32.7C82F23B 《-----显然不是返回时机,
// 没出现我们的最爱ASCII "VirtualAlloc "ASCII "VirtualFree" 接着SHIFT+F9吧
0012FFC8 00000000
0012FFCC 00000000
0012FFD0 7FFD6000
0012FFD4 00000000
0012FFD8 0012FFC8
0012FFDC B534ECE4
0012FFE0 FFFFFFFFSEH 链尾部
SHIFT+F9多次后,一直没我们的最爱出现,发现寄存器窗口中寄存器EAX ECX。。。。都在不断变值飞一样,我想飞了已经。。。
接着提示:链太长还继续吗?继续!程序结束了。
是什么原因导致的呢?
再次载入程序,不设任何断点,也不跟随任何表达式。F9!并不会运行出我所想要的程序界面来,无论怎么按F9!看来,还是没藏好。
楼主怎么藏的呢???请教!!!! 谢谢!解决了.换个版本的OD就成了!
页:
[1]