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 编辑 ] 好文,学习!/:good /:good 向各位前辈学习中 向寂寞敬礼~~:loveliness: :loveliness: 最近这个很热啊. 学习了。嘻嘻。Thanks 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 "这样语句找不到。 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重载后直接就断到这。
新手脱壳,很多东西不是很清楚请原谅。 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的地方就要特别注意了,另外就是语言特征点。 向楼主学习 第一个 简单的会脱了啊!!!
呵呵 向寂寞学习到一招了啊·~~/:014
页:
[1]
2