脱壳教程Armadillo3.05
[转帖] 脱壳教程Armadillo3.05 by 笨虫虫软件名称:windows98 记事本
下载地址:windows自带
加壳方式:armadillo3.05
软件功能:文字记录
编译语言:VC++
破解工具:OllyDbg v1.10原版,ImportREC 1.6 Final,LordPE
脱壳作者:笨虫虫
大家好!我是燃烧吧菜鸟学堂和黑客基地的VIP会员笨虫虫,今天我们来玩玩armadillo3.05,玩破解久的人都知道armadillo是根难啃的骨头,所以今天我们就来啃啃这根骨头。高手就不用看了嘛,这个适合我们小菜鸟来学习。
脱armadillo一般是3大断点法!
1、BP OpenMutexA
2、BP GetModuleHandleA 或者是he GetModuleHandleA+5
3、BP GetCurrentThreadId
*****************************************
首先我们用OD载入加了壳的记事本忽略所有异常,隐藏插件,先下OpenMutexA断点F9运行
7C82827A >8BFF mov edi,edi //我们停到这里,可能你与我的不一样
7C82827C 55 push ebp
7C82827D 8BEC mov ebp,esp
7C82827F 51 push ecx
7C828280 51 push ecx
7C828281 837D 10 00 cmp dword ptr ss:,0
7C828285 56 push esi
看到堆栈
0012F5B0 00411DA6/CALL 到 OpenMutexA 来自 NOTEPAD3.00411DA0
0012F5B4 001F0001|Access = 1F0001
0012F5B8 00000000|Inheritable = FALSE
0012F5BC 0012FBF0\MutexName = "6C8:A2591DD25" //这个地方法,一会我们要到0012FBF0这个值
Ctrl+G 401000 键入以下代码
00401000 60 pushad
00401001 9C pushfd
00401002 68 B4FB1200 push 0012FBF0 ★ 堆栈里看到的值
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 B4B2A577 call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 E9 33F7A577 jmp kernel32.OpenMutexA
在401000处新建起源,右键-》此处新建EIP
F9运行,再次中断在OpenMutexA处,取消断点。
再次Ctrl+G 401000
撤消刚才做的选择,右键-》撤消选择
*****************************************
2、下GetModuleHandleA断点F9运行
7C80C85C >8BFF mov edi,edi //我们断在这里,可能你的与我不一样,这是没有关系的,取消断点
7C80C85E 55 push ebp
7C80C85F 8BEC mov ebp,esp
7C80C861 837D 08 00 cmp dword ptr ss:,0//主要看这里
7C80C865 74 18 je short kernel32.7C80C87F//我们这里下断,F2
按F9,注意堆栈
****************
0012EC9C/0012ECD4
0012ECA0|77C07962返回到 msvcrt.77C07962 来自 kernel32.GetModuleHandleA
0012ECA4|77BE31BCASCII "kernel32.dll"
0012ECA8|77C31A70msvcrt.77C31A70
0012ED44/0012ED60
0012ED48|77CA5E74返回到 SHLWAPI.77CA5E74 来自 kernel32.GetModuleHandleA
0012ED4C|77CA5270ASCII "KERNEL32.DLL"
0012ED50|00000001
0012EC84/0012ECBC
0012EC88|77F700FC返回到 COMCTL32.77F700FC 来自 kernel32.GetModuleHandleA
0012EC8C|77F70148ASCII "kernel32.dll"
0012EC90|77FB5BE8COMCTL32.77FB5BE8
0012F558/0012F5B8
0012F55C|00411073返回到 NOTEPAD3.00411073 来自 kernel32.GetModuleHandleA
0012F560|00000000
0012F564|7C93F012返回到 ntdll.7C93F012 来自 ntdll.7C93EA73
0012C27C/0012C508
0012C280|003C5331返回到 003C5331 来自 kernel32.GetModuleHandleA
0012C284|0012C3BCASCII "kernel32.dll"//看到这里就是返回时机了
****************
此时,取消断点,按Ctrl+F9&F7返回!
003C5331 8B0D 60D83E00 mov ecx,dword ptr ds:
003C5337 89040E mov dword ptr ds:,eax
003C533A A1 60D83E00 mov eax,dword ptr ds:
003C533F 393C06 cmp dword ptr ds:,edi
003C5342 75 16 jnz short 003C535A
003C5344 8D85 B4FEFFFF lea eax,dword ptr ss:
003C534A 50 push eax
003C534B FF15 B8503E00 call dword ptr ds: ; kernel32.LoadLibraryA
003C5351 8B0D 60D83E00 mov ecx,dword ptr ds:
003C5357 89040E mov dword ptr ds:,eax
003C535A A1 60D83E00 mov eax,dword ptr ds:
003C535F 393C06 cmp dword ptr ds:,edi
003C5362 0F84 AD000000 je 003C5415 //Magic Jump,改成jmp
003C5368 33C9 xor ecx,ecx
003C536A 8B03 mov eax,dword ptr ds:
003C536C 3938 cmp dword ptr ds:,edi
*****************************************
第三、下GetCurrentThreadId断点 按F9运行
注意看堆栈
*************
0012BB40 73391E36/CALL 到 GetCurrentThreadId 来自 73391E30
0012BB44 00000001
0012BB48 73391C1A返回到 73391C1A 来自 73391DE2
0012BB4C 73391B60返回到 73391B60 来自 73391B8C
0012BB20 7339353F/CALL 到 GetCurrentThreadId 来自 73393539
0012BB24 00000000
0012BB28 734A0470
0012BB2C 734A04D8
0012F5A8 003DCF2D/CALL 到 GetCurrentThreadId 来自 003DCF27//是时候返回了
0012F5AC 0012FF2C
0012F5B0 00000000
0012F5B4 7FFDE000
*************
此时,取消断点,按F7返回!
003DCF2D A3 F0183F00 mov dword ptr ds:,eax //回来到这里,我们按F8往下走
003DCF32 E8 2487FEFF call 003C565B
003DCF37 6A 00 push 0
003DCF39 E8 4BD9FEFF call 003CA889
003DCF3E 59 pop ecx
003DCF3F E8 7D39FFFF call 003D08C1
003DCF44 8BF8 mov edi,eax
003DCF46 A1 E0183F00 mov eax,dword ptr ds:
003DCF4B 8B48 74 mov ecx,dword ptr ds:
003DCF4E 3348 5C xor ecx,dword ptr ds:
003DCF51 3308 xor ecx,dword ptr ds:
003DCF53 03F9 add edi,ecx
003DCF55 8B0E mov ecx,dword ptr ds:
003DCF57 85C9 test ecx,ecx
003DCF59 75 2E jnz short 003DCF89
003DCF5B 8B78 5C mov edi,dword ptr ds:
003DCF5E E8 5E39FFFF call 003D08C1
003DCF63 8B0D E0183F00 mov ecx,dword ptr ds: ; NOTEPAD3.0043D258
003DCF69 FF76 14 push dword ptr ds:
003DCF6C 8B51 74 mov edx,dword ptr ds:
003DCF6F FF76 10 push dword ptr ds:
003DCF72 33D7 xor edx,edi
003DCF74 3311 xor edx,dword ptr ds:
003DCF76 FF76 0C push dword ptr ds:
003DCF79 03C2 add eax,edx
003DCF7B 8B51 78 mov edx,dword ptr ds:
003DCF7E 3351 14 xor edx,dword ptr ds:
003DCF81 33D7 xor edx,edi
003DCF83 2BC2 sub eax,edx
003DCF85 FFD0 call eax
003DCF87 EB 25 jmp short 003DCFAE
003DCF89 83F9 01 cmp ecx,1
003DCF8C 75 22 jnz short 003DCFB0
003DCF8E FF76 04 push dword ptr ds:
003DCF91 FF76 08 push dword ptr ds:
003DCF94 6A 00 push 0
003DCF96 E8 2639FFFF call 003D08C1
003DCF9B 50 push eax
003DCF9C A1 E0183F00 mov eax,dword ptr ds:
003DCFA1 8B48 78 mov ecx,dword ptr ds:
003DCFA4 3348 5C xor ecx,dword ptr ds:
003DCFA7 3348 14 xor ecx,dword ptr ds:
003DCFAA 2BF9 sub edi,ecx
003DCFAC FFD7 call edi //看到EDI的值了吗?edi=004010CC (NOTEPAD3.004010CC)
98记事本的入口。我们按F8进入。呵呵一片红色
*************************************************
004010CC 55 push ebp //用LordPE Dump!
004010CD 8BEC mov ebp,esp
004010CF 83EC 44 sub esp,44
004010D2 56 push esi
004010D3 FF15 E4634000 call dword ptr ds: ; kernel32.GetCommandLineA
004010D9 8BF0 mov esi,eax
004010DB 8A00 mov al,byte ptr ds:
004010DD 3C 22 cmp al,22
004010DF 75 1B jnz short NOTEPAD3.004010FC
注意不要关OD,直接打开ImprotREC否则不能修复成功,选择我们要脱的进程。然后输入OEP,10cc。自动搜索IAT-》获取输入表,有一个假指针-》点显示无效函数-》右键-》剪切指针-》修复抓取文件
呵呵~~成功 按F9,注意堆栈
****************
0012EC9C/0012ECD4
0012ECA0|77C07962返回到 msvcrt.77C07962 来自 kernel32.GetModuleHandleA
0012ECA4|77BE31BCASCII "kernel32.dll"
0012ECA8|77C31A70msvcrt.77C31A70
0012ED44/0012ED60
0012ED48|77CA5E74返回到 SHLWAPI.77CA5E74 来自 kernel32.GetModuleHandleA
0012ED4C|77CA5270ASCII "KERNEL32.DLL"
0012ED50|00000001
0012EC84/0012ECBC
0012EC88|77F700FC返回到 COMCTL32.77F700FC 来自 kernel32.GetModuleHandleA
0012EC8C|77F70148ASCII "kernel32.dll"
0012EC90|77FB5BE8COMCTL32.77FB5BE8
0012F558/0012F5B8
0012F55C|00411073返回到 NOTEPAD3.00411073 来自 kernel32.GetModuleHandleA
0012F560|00000000
0012F564|7C93F012返回到 ntdll.7C93F012 来自 ntdll.7C93EA73
0012C27C/0012C508
0012C280|003C5331返回到 003C5331 来自 kernel32.GetModuleHandleA
0012C284|0012C3BCASCII "kernel32.dll"//看到这里就是返回时机了
我看了很多相关的文章,怎么去判断这个返回的时机呢
还有一个就是怎么去找那个Magic Jump,
请多指点`~谢谢 原帖由 yosen2001 于 2006-10-8 18:05 发表
我看了很多相关的文章,怎么去判断这个返回的时机呢
还有一个就是怎么去找那个Magic Jump,
请多指点`~谢谢
跟我有一樣的疑問
ALT+F9返回的時机,我翻找其它文章,大部分都說要憑經驗來判別返回
可是我猜因該有規則吧
Magic Jump如果返回時機錯了,很容易造成紅色海洋@@ 0012F558/0012F5B8
0012F55C|00411073返回到 NOTEPAD3.00411073 来自 kernel32.GetModuleHandleA
0012F560|00000000
0012F564|7C93F012返回到 ntdll.7C93F012 来自 ntdll.7C93EA73
0012C27C/0012C508
0012C280|003C5331返回到 003C5331 来自 kernel32.GetModuleHandleA
0012C284|0012C3BCASCII "kernel32.dll"//看到这里就是返回时机了
你肯定没有仔细的看,一个是7C93F012,一个是003C5331,明白了没有?还有MAGIC JMP003C5362 0F84 AD000000 je 003C5415 //Magic Jump,改成jmp,仔细看看就弄明白了 下了看看啊 为什么要使用BP OpenMutexA,难道这壳是双进程? 返回时机一般是防冲比较大,而且是
0012C280|003C5331返回到 003C5331 来自 kernel32.GetModuleHandleA
0012C284|0012C3BCASCII "kernel32.dll"
Magic jump 是kernel32.LoadLibraryA
下面一个大跳转。/:11多练习几次即可体验出来。 我想请问楼主,为什么要下那三个api函数断点,是为了解决什么问题,为什么脱壳常会下那几个断点,断下来后寻找返回意味着什么?
求求大侠们照顾一下菜鸟吧!不然我们永远只会跟在你们后面完全模仿! 我觉得这个好像穿山甲的经典脱法 Magic jump 离kernel32.LoadLibraryA非常近的,看雪那里有用kernel32.LoadLibraryA脱穿山甲的,LZ可以去看下
页:
[1]
2