寂寞的季节 发表于 2008-4-6 15:10:16

Armadillo 系列练习1

【文章标题】: Armadillo 系列练习1
【文章作者】: 寂寞的季节
【作者邮箱】: [email protected]
【作者主页】: www.thejimo.cn
【下载地址】: https://www.chinapyg.com/viewthread.php?tid=29496&pid=223817&page=1&extra=page%3D1
【使用工具】: OllyDBD、PEiD、LordPE、ImportREC
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
    看见xuhw兄弟出了一个系列的穿山甲练习题,觉得自己也应该发点帖子配合下。毕竟来了论坛很久了,汉化作品也一直没更新,老挂个汉化组的名字不合适所有决定写几篇关于穿山甲的入门教程。
_____________________________________________________________
!- Protected Armadillo
Protection system (Professional)
!- <Protection Options>
Standard protection or Minimum protection
!- <Backup Key Options>
Fixed Backup Keys
!- <Compression Options>
Better/Slower Compression
!- <Other Options>
!- Version 4.40 31October2005

_____________________________________________________________
流程
1寻找Magic Jump返回的时机
2寻找OEP
3修复
_____________________________________________________________
1寻找Magic Jump返回的时机

载入程序01058000 >60                  pushad
01058001    E8 00000000         call sol.01058006
01058006    5D                  pop ebp
01058007    50                  push eax
01058008    51                  push ecx
01058009    0FCA                bswap edx
0105800B    F7D2                not edx下 bp GetModuleHandleA+5观察堆栈    SHIFT+F9跳过异常0007FF0C   0007FF98
0007FF10   0104430B返回到 sol.0104430B 来自 kernel32.GetModuleHandleA
0007FF14   000000000007F710/0007F778
0007F714|0102EEF3返回到 sol.0102EEF3 来自 kernel32.GetModuleHandleA000794FC/0007EC44
00079500|00B26DF3返回到 00B26DF3 来自 kernel32.GetModuleHandleA
00079504|00B3BC1CASCII "kernel32.dll"
00079508|00B3CEC4ASCII "VirtualAlloc"000794FC/0007EC44
00079500|00B26E10返回到 00B26E10 来自 kernel32.GetModuleHandleA
00079504|00B3BC1CASCII "kernel32.dll"
00079508|00B3CEB8ASCII "VirtualFree"00079260/00079500
00079264|00B15CE1返回到 00B15CE1 来自 kernel32.GetModuleHandleA
00079268|000793B4ASCII "kernel32.dll"到了返回时机 ALT+F900B15CE1    8B0D AC40B400       mov ecx,dword ptr ds:
00B15CE7    89040E            mov dword ptr ds:,eax
00B15CEA    A1 AC40B400         mov eax,dword ptr ds:
00B15CEF    391C06            cmp dword ptr ds:,ebx
00B15CF2    75 16               jnz short 00B15D0A
00B15CF4    8D85 B4FEFFFF       lea eax,dword ptr ss:
00B15CFA    50                  push eax
00B15CFB    FF15 BC62B300       call dword ptr ds:                   ; kernel32.LoadLibraryA
00B15D01    8B0D AC40B400       mov ecx,dword ptr ds:
00B15D07    89040E            mov dword ptr ds:,eax
00B15D0A    A1 AC40B400         mov eax,dword ptr ds:
00B15D0F    391C06            cmp dword ptr ds:,ebx
00B15D12    0F84 2F010000       je 00B15E47                                  ; 变JMP00B15E53    395F FC             cmp dword ptr ds:,ebx
00B15E56^ 0F85 49FEFFFF       jnz 00B15CA5
00B15E5C    EB 03               jmp short 00B15E61                           ; 下硬件断点
00B15E5E    D6                  salc
00B15E5F    D6                  salcF9运行 删除断点 向上找回原来的Magic Jump撤销选择
_____________________________________________________________
2寻找OEP

bp CreateThread7C810637 >8BFF                mov edi,edi
7C810639    55                  push ebp
7C81063A    8BEC                mov ebp,esp
7C81063C    FF75 1C             push dword ptr ss:
7C81063F    FF75 18             push dword ptr ss:
7C810642    FF75 14             push dword ptr ss:
7C810645    FF75 10             push dword ptr ss:
7C810648    FF75 0C             push dword ptr ss:
7C81064B    FF75 08             push dword ptr ss:
7C81064E    6A FF               push -1取消断点 ALT+F900B1C242    50                  push eax
00B1C243    FF15 4C62B300       call dword ptr ds:                   ; kernel32.CloseHandle
00B1C249    5F                  pop edi
00B1C24A    5E                  pop esi
00B1C24B    C9                  leave
00B1C24C    C3                  retn
00B1C24D    55                  push ebpF8一路向下到00B2F6FC   /75 1E               jnz short 00B2F71C
00B2F6FE   |FF77 04             push dword ptr ds:
00B2F701   |FF77 08             push dword ptr ds:
00B2F704   |6A 00               push 0
00B2F706   |FF77 0C             push dword ptr ds:
00B2F709   |8B90 90000000       mov edx,dword ptr ds:
00B2F70F   |3350 40             xor edx,dword ptr ds:
00B2F712   |3350 04             xor edx,dword ptr ds:
00B2F715   |2BCA                sub ecx,edx
00B2F717   |FFD1                call ecx                                     ; F7 进去01005F85    6A 70               push 70                                    ; OEP到了
01005F87    68 F8120001         push sol.010012F8
01005F8C    E8 DF010000         call sol.01006170
01005F91    33DB                xor ebx,ebx
01005F93    53                  push ebx
01005F94    8B3D 98100001       mov edi,dword ptr ds:               ; kernel32.GetModuleHandleA
01005F9A    FFD7                call edi
01005F9C    66:8138 4D5A      cmp word ptr ds:,5A4D
01005FA1    75 1F               jnz short sol.01005FC2_____________________________________________________________
3修复

用LordPE来dump进程了
ImportREC载入修复 3个无效剪切 可以运行

   


--------------------------------------------------------------------------------
【经验总结】
ARM的教程已经发的很烂了,没有任何的技术含量,只是配合xuhw兄弟的练习。谢谢欣赏

--------------------------------------------------------------------------------
【版权声明】:转载请注明作者并保持文章的完整, 谢谢!

[ 本帖最后由 寂寞的季节 于 2008-4-6 16:36 编辑 ]

glassfox 发表于 2008-4-7 00:28:38

好文,学习!/:good /:good

逍遥子 发表于 2008-4-7 01:16:08

向各位前辈学习中

塞上小飞 发表于 2008-4-7 18:24:12

向寂寞敬礼~~:loveliness: :loveliness:

幻影¤雾之戀 发表于 2008-4-8 20:30:51

最近这个很热啊.

绝恋de烦神 发表于 2008-4-30 11:22:56

学习了。嘻嘻。Thanks

horizon_c 发表于 2008-4-30 12:56:10

xpsp2
od 1.1
对第一个题进行的练习:

OD载入,忽略所有异常,隐藏OD
01058000 >60            PUSHAD
01058001    E8 00000000   CALL sol.01058006
01058006    5D            POP EBP
下断he GetModuleHandleA+5,f9运行
010615C3    F0:             PREFIX LOCK:                           ; 多余的前缀
010615C4    F0:C7         ???                                    ; 未知命令
010615C6    C8 64678F       ENTER 6764,8F
010615CA    06            PUSH ES
010615CB    0000            ADD BYTE PTR DS:,AL
010615CD    83C4 04         ADD ESP,4
010615D0    C3            RETN

出现了异常C000001E (INVALID LOCK SEQUENCE)运行不下去了,忽略掉。点f9运行提示:
不知道如何在地址010615c5处绕过命令。请尝试更改EIP或者跳过异常执行程序。
(这里如果不先f9运行发现异常,直接忽略掉然后shift+f9的话,程序就退出了,不知道为什么)
shift+f9
7C92EB35    C2 0800         RETN 8
7C92EB38    90            NOP
7C92EB39    90            NOP
7C92EB3A    90            NOP
7C92EB3B    90            NOP
7C92EB3C    90            NOP
7C92EB3D >55            PUSH EBP//这个地方有点像VC++特征点
7C92EB3E    8BEC            MOV EBP,ESP
7C92EB40    83EC 50         SUB ESP,50
继续shift+f9
7C96EAFA^\E9 12BFFDFF   JMP ntdll.7C94AA11 //回跳了
7C96EAFF    83A5 E4FCFFFF 0>AND DWORD PTR SS:,0
//来到这里无法进行下去了。

堆栈数据:
第一次shift+f9
0007FF98   0007FFE0指针到下一个 SEH 记录
0007FF9C   01061595SE 句柄
0007FFA0   01059A01sol.01059A01
0007FFA4   7C930738ntdll.7C930738
0007FFA8   FFFFFFFF
0007FFAC   0007FFF0
0007FFB0   0007FFC4
0007FFB4   7FFDD000
0007FFB8   7C92EB94ntdll.KiFastSystemCallRet
0007FFBC   0007FFB0
0007FFC0   00000000
0007FFC4   7C816FD7返回到 kernel32.7C816FD7
0007FFC8   7C930738ntdll.7C930738

第二次:
0007FF98   0007FFE0指针到下一个 SEH 记录
0007FF9C   010614F1SE 句柄
0007FFA0   01059AE9sol.01059AE9
0007FFA4   7C930738ntdll.7C930738
0007FFA8   FFFFFFFF
0007FFAC   0007FFF0
0007FFB0   0007FFC4
0007FFB4   7FFDD000
0007FFB8   7C92EB94ntdll.KiFastSystemCallRet
0007FFBC   0007FFB0
0007FFC0   00000000
0007FFC4   7C816FD7返回到 kernel32.7C816FD7
0007FFC8   7C930738ntdll.7C930738

不知道是哪里的问题,N多次的代码都是这样。
"/CALL 到 GetModuleHandleA 来自 00C1532B "这样语句找不到。

horizon_c 发表于 2008-4-30 13:01:14

he GetModuleHandleA+5下断,运行后不能断到
7C80B6A6    837D 08 00      CMP DWORD PTR SS:,0
7C80B6AA    74 18         JE SHORT kernel32.7C80B6C4
7C80B6AC    FF75 08         PUSH DWORD PTR SS:
7C80B6AF    E8 C0290000   CALL kernel32.7C80E074
这里。
不删除硬件断点,OD重载后直接就断到这。

新手脱壳,很多东西不是很清楚请原谅。

horizon_c 发表于 2008-4-30 19:16:54

OD载入,忽略所有异常及C000001E (INVALID LOCK SEQUENCE)如果不忽略这个会有很多异常。
不要隐藏OD,发现隐藏了之后断不下来
01058000 >60            PUSHAD
01058001    E8 00000000   CALL sol.01058006
01058006    5D            POP EBP

下断he GetModuleHandleA+5,shift+f9

7C80B6A6    837D 08 00      CMP DWORD PTR SS:,0
7C80B6AA    74 18         JE SHORT kernel32.7C80B6C4
7C80B6AC    FF75 08         PUSH DWORD PTR SS:
7C80B6AF    E8 C0290000   CALL kernel32.7C80E074
7C80B6B4    85C0            TEST EAX,EAX
7C80B6B6    74 08         JE SHORT kernel32.7C80B6C0
7C80B6B8    FF70 04         PUSH DWORD PTR DS:
7C80B6BB    E8 7D2D0000   CALL kernel32.GetModuleHandleW

********************************************************************************************
1.
000794FC/0007EC44                                                       
00079500|00BB6DF3返回到 00BB6DF3 来自 kernel32.GetModuleHandleA
00079504|00BCBC1CASCII "kernel32.dll"
00079508|00BCCEC4ASCII "VirtualAlloc"                        //此时的堆栈,shift+f9

2.
000794FC/0007EC44
00079500|00BC6E10返回到 00BC6E10 来自 kernel32.GetModuleHandleA
00079504|00BDBC1CASCII "kernel32.dll"
00079508|00BDCEB8ASCII "VirtualFree"                        //此时的堆栈,shift+f9

3.
00079260/00079500
00079264|00BB5CE1返回到 00BB5CE1 来自 kernel32.GetModuleHandleA
00079268|000793B4ASCII "kernel32.dll"                        //判断返回的标记
第一个断点完成,在菜单选调试->硬件断点->删除断点alt+f9返回。
********************************************************************************************

00BA5CE1    8B0D AC40BD00   MOV ECX,DWORD PTR DS:        //返回到这(有时候重载OD到这地址会是00BB5CE1,我觉得是壳加密的

原因,而且每个人机器和系统不一样的话地址应该不一样的吧,似乎5CE1这里是一样的。见寂寞的季节的贴子)
00BA5CE7    89040E          MOV DWORD PTR DS:,EAX
00BA5CEA    A1 AC40BD00   MOV EAX,DWORD PTR DS:
00BA5CEF    391C06          CMP DWORD PTR DS:,EBX
00BA5CF2    75 16         JNZ SHORT 00BA5D0A
00BA5CF4    8D85 B4FEFFFF   LEA EAX,DWORD PTR SS:
00BA5CFA    50            PUSH EAX
00BA5CFB    FF15 BC62BC00   CALL DWORD PTR DS:               ; kernel32.LoadLibraryA
00BA5D01    8B0D AC40BD00   MOV ECX,DWORD PTR DS:
00BA5D07    89040E          MOV DWORD PTR DS:,EAX
00BA5D0A    A1 AC40BD00   MOV EAX,DWORD PTR DS:
00BA5D0F    391C06          CMP DWORD PTR DS:,EBX
00BA5D12    0F84 2F010000   JE 00BA5E47                                //magic jump改为jmp记下地址
00BA5D18    33C9            XOR ECX,ECX
00BA5D1A    8B07            MOV EAX,DWORD PTR DS:
00BA5D1C    3918            CMP DWORD PTR DS:,EBX
00BA5D1E    74 06         JE SHORT 00BA5D26
00BA5D20    41            INC ECX
00BA5D21    83C0 0C         ADD EAX,0C
00BA5D24^ EB F6         JMP SHORT 00BA5D1C
00BA5D26    8BD9            MOV EBX,ECX
00BA5D28    C1E3 02         SHL EBX,2
00BA5D2B    53            PUSH EBX
00BA5D2C    E8 63F20100   CALL 00BC4F94                            ; JMP to msvcrt.operator new
00BA5D31    8B0D A440BD00   MOV ECX,DWORD PTR DS:
00BA5D37    89040E          MOV DWORD PTR DS:,EAX


改完magic jump下断bp GetCurrentThreadId,shift+f9观察堆栈
7C809728 >64:A1 18000000MOV EAX,DWORD PTR FS:                //停在这里了
7C80972E    8B40 24         MOV EAX,DWORD PTR DS:
7C809731    C3            RETN
********************************************************************************************
1.
00078B24   73391E36/CALL 到 GetCurrentThreadId 来自 73391E30
00078B28   00000001
00078B2C   73391C1A返回到 73391C1A 来自 73391DE2
00078B30   73391B60返回到 73391B60 来自 73391B8C

2.再shift+f9
00078B04   7339353F/CALL 到 GetCurrentThreadId 来自 73393539

3.shift+f9
出错了,一片红色
0007205C   00BD7898ASCII "RALB294AEC2"
00072060   00BB1846返回到 00BB1846 来自 00BACC9F
不知道是什么原因,想了一下会不会是magic jump那呢?
重新来过,到第二步的时候ctrl+g找到00BA5D12改回来shift+f9运行
0007F6F8   00BA60EC/CALL 到 GetCurrentThreadId 来自 00BA60E6
看过黑鹰的教程说是感觉缓存比较大的时候是返回时机,我是从这来看的
前面两个堆栈都是7339而这个比较不同,跨度也大,所以我决定在这返回。

alt+b把断点取消掉,alt+f9返回
********************************************************************************************
00BA60EC    50            PUSH EAX                                //返回到这里了,f8进入吧。
00BA60ED    FF75 FC         PUSH DWORD PTR SS:
00BA60F0    E8 05000000   CALL 00BA60FA                        //这个call我用f8过的后来试过用f7过的话,走下去程序就运行了
按道理这应该算是个近call,请大虾指点。
00BA60F5    83C4 0C         ADD ESP,0C
00BA60F8    C9            LEAVE
00BA60F9    C3            RETN                                //程序跳转


00BBF5F6    33DB            XOR EBX,EBX                              //来到这里                        
00BBF5F8    53            PUSH EBX
00BBF5F9    E8 95CBFEFF   CALL 00BAC193
00BBF5FE    59            POP ECX
00BBF5FF    BE 98FABC00   MOV ESI,0BCFA98
00BBF604    8BCE            MOV ECX,ESI
00BBF606    E8 3393FDFF   CALL 00B9893E
00BBF60B    84C0            TEST AL,AL
00BBF60D    75 09         JNZ SHORT 00BBF618
00BBF60F    6A 01         PUSH 1
00BBF611    8BCE            MOV ECX,ESI
00BBF613    E8 D2E2FDFF   CALL 00B9D8EA
00BBF618    C705 E0C0BC00 D>MOV DWORD PTR DS:,0BCCFD8
00BBF622    B9 00ECBC00   MOV ECX,0BCEC00
00BBF627    E8 312EFDFF   CALL 00B9245D
00BBF62C    53            PUSH EBX
00BBF62D    E8 2B2EFDFF   CALL 00B9245D
00BBF632    59            POP ECX
00BBF633    33D2            XOR EDX,EDX
00BBF635    8955 DC         MOV DWORD PTR SS:,EDX
00BBF638    895D FC         MOV DWORD PTR SS:,EBX
00BBF63B    A0 BC00BD00   MOV AL,BYTE PTR DS:
00BBF640    8845 C8         MOV BYTE PTR SS:,AL
00BBF643    84C0            TEST AL,AL
00BBF645    75 4D         JNZ SHORT 00BBF694
00BBF647    A1 E400BD00   MOV EAX,DWORD PTR DS:
00BBF64C    8B88 88000000   MOV ECX,DWORD PTR DS:
00BBF652    894D C4         MOV DWORD PTR SS:,ECX
00BBF655    894D D0         MOV DWORD PTR SS:,ECX
00BBF658    8B0D FC00BD00   MOV ECX,DWORD PTR DS:            ; sol.01000000
00BBF65E    894D C0         MOV DWORD PTR SS:,ECX
00BBF661    8B70 6C         MOV ESI,DWORD PTR DS:
00BBF664    3370 60         XOR ESI,DWORD PTR DS:
00BBF667    3370 54         XOR ESI,DWORD PTR DS:
00BBF66A    03F1            ADD ESI,ECX
00BBF66C    8975 D4         MOV DWORD PTR SS:,ESI
00BBF66F    8B98 90000000   MOV EBX,DWORD PTR DS:
00BBF675    3358 7C         XOR EBX,DWORD PTR DS:
00BBF678    3358 44         XOR EBX,DWORD PTR DS:
00BBF67B    895D A8         MOV DWORD PTR SS:,EBX
00BBF67E    8D4D D0         LEA ECX,DWORD PTR SS:
00BBF681    E8 7A19FDFF   CALL 00B91000
00BBF686    33D2            XOR EDX,EDX
00BBF688    F7F3            DIV EBX
00BBF68A    03D6            ADD EDX,ESI
00BBF68C    8955 CC         MOV DWORD PTR SS:,EDX
00BBF68F    8B12            MOV EDX,DWORD PTR DS:
00BBF691    8955 DC         MOV DWORD PTR SS:,EDX
00BBF694    834D FC FF      OR DWORD PTR SS:,FFFFFFFF
00BBF698    EB 11         JMP SHORT 00BBF6AB
00BBF69A    6A 01         PUSH 1
00BBF69C    58            POP EAX
00BBF69D    C3            RETN
00BBF69E    8B65 E8         MOV ESP,DWORD PTR SS:
00BBF6A1    834D FC FF      OR DWORD PTR SS:,FFFFFFFF
00BBF6A5    8B7D 08         MOV EDI,DWORD PTR SS:
00BBF6A8    8B55 DC         MOV EDX,DWORD PTR SS:
00BBF6AB    A1 E400BD00   MOV EAX,DWORD PTR DS:
00BBF6B0    3190 88000000   XOR DWORD PTR DS:,EDX
00BBF6B6    A1 E400BD00   MOV EAX,DWORD PTR DS:
00BBF6BB    3190 88000000   XOR DWORD PTR DS:,EDX
00BBF6C1    A1 E400BD00   MOV EAX,DWORD PTR DS:
00BBF6C6    8B88 90000000   MOV ECX,DWORD PTR DS:
00BBF6CC    3348 2C         XOR ECX,DWORD PTR DS:
00BBF6CF    3348 18         XOR ECX,DWORD PTR DS:
00BBF6D2    030D FC00BD00   ADD ECX,DWORD PTR DS:            ; sol.01000000
00BBF6D8    8B17            MOV EDX,DWORD PTR DS:
00BBF6DA    85D2            TEST EDX,EDX
00BBF6DC    75 1B         JNZ SHORT 00BBF6F9
00BBF6DE    FF77 18         PUSH DWORD PTR DS:
00BBF6E1    FF77 14         PUSH DWORD PTR DS:
00BBF6E4    FF77 10         PUSH DWORD PTR DS:
00BBF6E7    8B90 90000000   MOV EDX,DWORD PTR DS:
00BBF6ED    3350 40         XOR EDX,DWORD PTR DS:
00BBF6F0    3350 04         XOR EDX,DWORD PTR DS:
00BBF6F3    2BCA            SUB ECX,EDX
00BBF6F5    FFD1            CALL ECX
00BBF6F7   /EB 20         JMP SHORT 00BBF719
00BBF6F9   |83FA 01         CMP EDX,1
00BBF6FC   |75 1E         JNZ SHORT 00BBF71C
00BBF6FE   |FF77 04         PUSH DWORD PTR DS:
00BBF701   |FF77 08         PUSH DWORD PTR DS:
00BBF704   |6A 00         PUSH 0
00BBF706   |FF77 0C         PUSH DWORD PTR DS:
00BBF709   |8B90 90000000   MOV EDX,DWORD PTR DS:
00BBF70F   |3350 40         XOR EDX,DWORD PTR DS:
00BBF712   |3350 04         XOR EDX,DWORD PTR DS:
00BBF715   |2BCA            SUB ECX,EDX
00BBF717   |FFD1            CALL ECX                                //从这里进去,再继续f8程序就运行了
00BBF719   \8945 E4         MOV DWORD PTR SS:,EAX
00BBF71C    8B45 E4         MOV EAX,DWORD PTR SS:
00BBF71F    8B4D F0         MOV ECX,DWORD PTR SS:
00BBF722    64:890D 0000000>MOV DWORD PTR FS:,ECX
00BBF729    5F            POP EDI
00BBF72A    5E            POP ESI
00BBF72B    5B            POP EBX
00BBF72C    C9            LEAVE
00BBF72D    C3            RETN

01005F85    6A 70         PUSH 70                               
01005F87    68 F8120001   PUSH sol.010012F8                        //这里就是oep了
01005F8C    E8 DF010000   CALL sol.01006170
01005F91    33DB            XOR EBX,EBX
01005F93    53            PUSH EBX
01005F94    8B3D 98100001   MOV EDI,DWORD PTR DS:         ; kernel32.GetModuleHandleA
01005F9A    FFD7            CALL EDI                               
01005F9C    66:8138 4D5A    CMP WORD PTR DS:,5A4D
01005FA1    75 1F         JNZ SHORT sol.01005FC2
01005FA3    8B48 3C         MOV ECX,DWORD PTR DS:
01005FA6    03C8            ADD ECX,EAX
01005FA8    8139 50450000   CMP DWORD PTR DS:,4550
01005FAE    75 12         JNZ SHORT sol.01005FC2
01005FB0    0FB741 18       MOVZX EAX,WORD PTR DS:
01005FB4    3D 0B010000   CMP EAX,10B

总结一下:刚开始我已经过了这了,因为对照语言特征点看不出这是OEP而后面有个call edi。记得黑鹰高级班教程里的是call edi进的,所以

又走了进去,程序就运行了。结合之前f8 "00BBF717   |FFD1            CALL ECX"这一句后程序运行,然后再对照了xp系统中原始程序发现

原来这就是oep。从代码来看,它是压栈后调用程序而且在这之后程序运行说明原代码的入口就在这了,我理解的就是看到这样push然后下一句

再call的地方就要特别注意了,另外就是语言特征点。

unpack 发表于 2008-5-6 20:10:31

向楼主学习   第一个 简单的会脱了啊!!!
呵呵 向寂寞学习到一招了啊·~~/:014
页: [1] 2
查看完整版本: Armadillo 系列练习1