jisheng 发表于 2005-12-17 13:40:01

脱壳教程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-》获取输入表,有一个假指针-》点显示无效函数-》右键-》剪切指针-》修复抓取文件
呵呵~~成功

yosen2001 发表于 2006-10-8 18:05:28

按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,

请多指点`~谢谢

pgailnew 发表于 2006-11-24 10:53:11

原帖由 yosen2001 于 2006-10-8 18:05 发表



我看了很多相关的文章,怎么去判断这个返回的时机呢

还有一个就是怎么去找那个Magic Jump,

请多指点`~谢谢
跟我有一樣的疑問
ALT+F9返回的時机,我翻找其它文章,大部分都說要憑經驗來判別返回
可是我猜因該有規則吧

Magic Jump如果返回時機錯了,很容易造成紅色海洋@@

小子贼野 发表于 2007-3-31 17:28:01

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,仔细看看就弄明白了

mulonggu 发表于 2007-4-2 11:35:16

下了看看啊

yunfeng 发表于 2007-5-15 06:27:32

为什么要使用BP OpenMutexA,难道这壳是双进程?

棒棒糖 发表于 2007-5-15 19:28:36

返回时机一般是防冲比较大,而且是
0012C280|003C5331返回到 003C5331 来自 kernel32.GetModuleHandleA
0012C284|0012C3BCASCII "kernel32.dll"

Magic jump 是kernel32.LoadLibraryA
下面一个大跳转。/:11多练习几次即可体验出来。

rsice 发表于 2007-6-14 16:00:13

我想请问楼主,为什么要下那三个api函数断点,是为了解决什么问题,为什么脱壳常会下那几个断点,断下来后寻找返回意味着什么?
求求大侠们照顾一下菜鸟吧!不然我们永远只会跟在你们后面完全模仿!

kgdurgwu 发表于 2007-6-22 08:55:15

我觉得这个好像穿山甲的经典脱法

小子贼野 发表于 2007-6-24 13:11:27

Magic jump 离kernel32.LoadLibraryA非常近的,看雪那里有用kernel32.LoadLibraryA脱穿山甲的,LZ可以去看下
页: [1] 2
查看完整版本: 脱壳教程Armadillo3.05