飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 12244|回复: 11

脱壳教程Armadillo3.05

[复制链接]
  • TA的每日心情
    开心
    2017-2-23 16:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2005-12-17 13:40:01 | 显示全部楼层 |阅读模式
    [转帖] 脱壳教程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:[ebp+10],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:[ebp+8],0//主要看这里
    7C80C865    74 18           je short kernel32.7C80C87F//我们这里下断,F2

    按F9,注意堆栈
    ****************
    0012EC9C  /0012ECD4
    0012ECA0  |77C07962  返回到 msvcrt.77C07962 来自 kernel32.GetModuleHandleA
    0012ECA4  |77BE31BC  ASCII "kernel32.dll"
    0012ECA8  |77C31A70  msvcrt.77C31A70

    0012ED44  /0012ED60
    0012ED48  |77CA5E74  返回到 SHLWAPI.77CA5E74 来自 kernel32.GetModuleHandleA
    0012ED4C  |77CA5270  ASCII "KERNEL32.DLL"
    0012ED50  |00000001

    0012EC84  /0012ECBC
    0012EC88  |77F700FC  返回到 COMCTL32.77F700FC 来自 kernel32.GetModuleHandleA
    0012EC8C  |77F70148  ASCII "kernel32.dll"
    0012EC90  |77FB5BE8  COMCTL32.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  |0012C3BC  ASCII "kernel32.dll"//看到这里就是返回时机了

    ****************

    此时,取消断点,按Ctrl+F9&F7返回!

    003C5331    8B0D 60D83E00   mov ecx,dword ptr ds:[3ED860]
    003C5337    89040E          mov dword ptr ds:[esi+ecx],eax
    003C533A    A1 60D83E00     mov eax,dword ptr ds:[3ED860]
    003C533F    393C06          cmp dword ptr ds:[esi+eax],edi
    003C5342    75 16           jnz short 003C535A
    003C5344    8D85 B4FEFFFF   lea eax,dword ptr ss:[ebp-14C]
    003C534A    50              push eax
    003C534B    FF15 B8503E00   call dword ptr ds:[3E50B8]         ; kernel32.LoadLibraryA
    003C5351    8B0D 60D83E00   mov ecx,dword ptr ds:[3ED860]
    003C5357    89040E          mov dword ptr ds:[esi+ecx],eax
    003C535A    A1 60D83E00     mov eax,dword ptr ds:[3ED860]
    003C535F    393C06          cmp dword ptr ds:[esi+eax],edi
    003C5362    0F84 AD000000   je 003C5415   //Magic Jump,改成jmp
    003C5368    33C9            xor ecx,ecx
    003C536A    8B03            mov eax,dword ptr ds:[ebx]
    003C536C    3938            cmp dword ptr ds:[eax],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:[3F18F0],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:[3F18E0]
    003DCF4B    8B48 74         mov ecx,dword ptr ds:[eax+74]
    003DCF4E    3348 5C         xor ecx,dword ptr ds:[eax+5C]
    003DCF51    3308            xor ecx,dword ptr ds:[eax]
    003DCF53    03F9            add edi,ecx
    003DCF55    8B0E            mov ecx,dword ptr ds:[esi]
    003DCF57    85C9            test ecx,ecx
    003DCF59    75 2E           jnz short 003DCF89
    003DCF5B    8B78 5C         mov edi,dword ptr ds:[eax+5C]
    003DCF5E    E8 5E39FFFF     call 003D08C1
    003DCF63    8B0D E0183F00   mov ecx,dword ptr ds:[3F18E0]      ; NOTEPAD3.0043D258
    003DCF69    FF76 14         push dword ptr ds:[esi+14]
    003DCF6C    8B51 74         mov edx,dword ptr ds:[ecx+74]
    003DCF6F    FF76 10         push dword ptr ds:[esi+10]
    003DCF72    33D7            xor edx,edi
    003DCF74    3311            xor edx,dword ptr ds:[ecx]
    003DCF76    FF76 0C         push dword ptr ds:[esi+C]
    003DCF79    03C2            add eax,edx
    003DCF7B    8B51 78         mov edx,dword ptr ds:[ecx+78]
    003DCF7E    3351 14         xor edx,dword ptr ds:[ecx+14]
    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:[esi+4]
    003DCF91    FF76 08         push dword ptr ds:[esi+8]
    003DCF94    6A 00           push 0
    003DCF96    E8 2639FFFF     call 003D08C1
    003DCF9B    50              push eax
    003DCF9C    A1 E0183F00     mov eax,dword ptr ds:[3F18E0]
    003DCFA1    8B48 78         mov ecx,dword ptr ds:[eax+78]
    003DCFA4    3348 5C         xor ecx,dword ptr ds:[eax+5C]
    003DCFA7    3348 14         xor ecx,dword ptr ds:[eax+14]
    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:[4063E4]        ; kernel32.GetCommandLineA
    004010D9     8BF0                mov esi,eax
    004010DB     8A00                mov al,byte ptr ds:[eax]
    004010DD     3C 22               cmp al,22
    004010DF     75 1B               jnz short NOTEPAD3.004010FC
    注意不要关OD,直接打开ImprotREC否则不能修复成功,选择我们要脱的进程。然后输入OEP,10cc。自动搜索IAT-》获取输入表,有一个假指针-》点显示无效函数-》右键-》剪切指针-》修复抓取文件
    呵呵~~成功
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-2-27 15:18
  • 签到天数: 205 天

    [LV.7]常住居民III

    发表于 2006-10-8 18:05:28 | 显示全部楼层
    按F9,注意堆栈
    ****************
    0012EC9C  /0012ECD4
    0012ECA0  |77C07962  返回到 msvcrt.77C07962 来自 kernel32.GetModuleHandleA
    0012ECA4  |77BE31BC  ASCII "kernel32.dll"
    0012ECA8  |77C31A70  msvcrt.77C31A70

    0012ED44  /0012ED60
    0012ED48  |77CA5E74  返回到 SHLWAPI.77CA5E74 来自 kernel32.GetModuleHandleA
    0012ED4C  |77CA5270  ASCII "KERNEL32.DLL"
    0012ED50  |00000001

    0012EC84  /0012ECBC
    0012EC88  |77F700FC  返回到 COMCTL32.77F700FC 来自 kernel32.GetModuleHandleA
    0012EC8C  |77F70148  ASCII "kernel32.dll"
    0012EC90  |77FB5BE8  COMCTL32.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  |0012C3BC  ASCII "kernel32.dll"//看到这里就是返回时机了



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

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

    请多指点`~谢谢
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-11-24 10:53:11 | 显示全部楼层
    原帖由 yosen2001 于 2006-10-8 18:05 发表



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

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

    请多指点`~谢谢

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

    Magic Jump如果返回時機錯了,很容易造成紅色海洋@@
    PYG19周年生日快乐!

    该用户从未签到

    发表于 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  |0012C3BC  ASCII "kernel32.dll"//看到这里就是返回时机了

    你肯定没有仔细的看,一个是7C93F012,一个是003C5331,明白了没有?还有MAGIC JMP003C5362    0F84 AD000000   je 003C5415   //Magic Jump,改成jmp,仔细看看就弄明白了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-4-2 11:35:16 | 显示全部楼层
    下了看看啊
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2019-3-25 06:30
  • 签到天数: 1096 天

    [LV.10]以坛为家III

    发表于 2007-5-15 06:27:32 | 显示全部楼层
    为什么要使用BP OpenMutexA  ,难道这壳是双进程?
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-5-15 19:28:36 | 显示全部楼层
    返回时机一般是防冲比较大,而且是
    0012C280  |003C5331  返回到 003C5331 来自 kernel32.GetModuleHandleA
    0012C284  |0012C3BC  ASCII "kernel32.dll"

    Magic jump 是kernel32.LoadLibraryA
    下面一个大跳转。/:11  多练习几次即可体验出来。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-14 16:00:13 | 显示全部楼层
    我想请问楼主,为什么要下那三个api函数断点,是为了解决什么问题,为什么脱壳常会下那几个断点,断下来后寻找返回意味着什么?
    求求大侠们照顾一下菜鸟吧!不然我们永远只会跟在你们后面完全模仿!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-22 08:55:15 | 显示全部楼层
    我觉得这个好像穿山甲的经典脱法
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-24 13:11:27 | 显示全部楼层
    Magic jump 离kernel32.LoadLibraryA非常近的,看雪那里有用kernel32.LoadLibraryA脱穿山甲的,LZ可以去看下
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表