菜鸟脱Armadillo 系列练习1 的总结
【破文标题】菜鸟脱Armadillo 系列练习1 的总结【破文作者】horizon
【作者邮箱】
【作者主页】http://hi.baidu.com/horizon
【破解工具】OD PEID LORDPE ImportREC1.42
【破解平台】windows xp sp2
【软件名称】windows xp 纸牌
【软件大小】576k
【原版下载】https://www.chinapyg.com/viewthread.php?tid=29496&extra=page%3D1
【保护方式】标准保护
【软件简介】windows xp 系统自带的纸牌游戏
【破解声明】本人很菜,在脱这个的时候遇到很多问题脱了不下几十遍,看了许多文章和教程。所以想把过程写得劲量详细点让和我一样的人
少走弯路。同时也希望大虾多多指点。
------------------------------------------------------------------------
【破解过程】1.PEiD查壳为Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks
2.程序运行无注册提示。
3.程序运行只有一个进程.
方法:2次断点法,即是:
bp GetModuleHandleA/he GetModuleHandleA/bp GetModuleHandleA+5/he GetModuleHandleA+5
bp GetCurrentThreadId
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的地方就要特别注意了,另外就是语言特征点。
然后不要关掉OD用LordPE来dump进程,再用PEID检测为Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks,应该是误报吧。ImportREC载入
选择系统进程中的sol.exe,输入OEP:5F85,点自动搜索iat。提示发现数据,点获取输入表,指针为假,点显示无效函数,在左边窗口中被找到
的无效函数上点右键剪切指针数据,点修复抓取文件选择刚才用lordpe脱掉的那个文件提示修复完成,退出修复工具运行修复后的文件,可以运
行。到这里就结束了。发现这个壳不能用OD自带插件脱,脱的时候OD会死。脱出来的文件查壳是vc7.0,但无法修复,importrec提示没有足够
的空间,不能对抓取文件添加任何区块。看了几个录相都是用的lordpe,是不是穿山甲的壳都不能用OD脱呢?欢迎大虾指点,谢谢!
------------------------------------------------------------------------
【破解总结】高手都是由菜鸟成长起来的,不要光看教程更重要是动手。很多教程里的东西过得很快,有些知识点也不容易明白。脱完这个壳学到的东西:
OEP:上一句PUSH压栈下一句 CALL调用,再结合编程语言的特征点就可以找到。当程序运行了的时候应该明白已经过了OEP。
对于穿山甲壳下he GetModuleHandleA+5断点时,magic jump的判断有这个规律
返回到 00BB5CE1 来自 kernel32.GetModuleHandleA
ASCII "kernel32.dll" //判断返回的标记
看到上述字样就是返回时机,返回后找附近最大的跳转。穿山甲通常是je跳。
我自己对上述两个断的理解:程序要运行就要得到模块句柄然后得到程序进程ID,所以壳解压的时候也要这么做。根据程序执行的思路就不难理解了。本次用的是二次断点法,大家可以试下内存断点法。
------------------------------------------------------------------------
【版权声明】转载请注明作者并保持文章的完整, 谢谢!
[ 本帖最后由 horizon_c 于 2008-5-3 23:45 编辑 ] 一个很简单的问题 被你搞得这么复杂 你强!/:good
单进程版
只需bp GetModuleHandleA+5 和 内存访问断点(有时候直接到OEP,有时候需要F8几下 到一个CALL上 F7进入)就OK了!!~~~ 楼上的正解 很多的脱壳教程看下只是知道招数但不知道心法,如果要讨论就变成了华山派气宗和剑宗的纷争了。只有理解了以后遇到难题才会有办法,一昧地按照教程来做得到的东西是很少的。就像这个穿山甲,很多教程都是要先隐藏OD,结果我发现我隐藏了OD就断不下来。加上自己的思考,我用的是硬件断点而不是bp,所以可以不用隐藏再想想其实GetModuleHandleA不用+5应该也可以,因为+5就是针对od来的。对我来说我学到了很多东西,我也总结了一些东西。而这些恰恰是教程里很少提到的。破解是需要运气,而运气不是平白无帮产生的,它是在千万次失败背后总结出来的。我觉得我发的这篇文章是有意义的,至少对于和我一样什么都不懂的人来说是这样。
[ 本帖最后由 horizon_c 于 2008-5-1 11:09 编辑 ] 我同意二楼的看法,不过有些东西我等菜鸟并没搞明白,我这么做的目的就是为了搞明白。就像你说的bp GetModuleHandleA+5,我在看了你的贴后,我想用bp GetModuleHandleA试试看,经过摸索得出了下面的看法:
这个练习不会检测OD,maigc jump的地址是会随机变化的。而用bp GetModuleHandleA下断是不行的。为什么呢?找了些资料看了,应该是用bp GetModuleHandleA+5。+5表示防止程序检测GetModuleHandleA前面是否下断。在三人行的教程中提到这个+5在win2000是断不下来的,因为2000不接受命令后跟上常数。
[ 本帖最后由 horizon_c 于 2008-5-1 13:00 编辑 ] 后来试了用内存断点法:
用bp GetModuleHandleA+5下断的话,到magic jump的过程要多几步但关键字不变。看到
返回到 00BA5CE1 来自 kernel32.GetModuleHandleA
ASCII "kernel32.dll"
就是返回时机了。
在返回找到magic jump后不用修改alt+b删除断点直接alt+m
找到01001000
在程序sol的.text f2下断
shift+f9运行
00BAF68F 8B12 MOV EDX,DWORD PTR DS://断在这里了,f8往下走
00BAF691 8955 DC MOV DWORD PTR SS:,EDX
00BAF694 834D FC FF OR DWORD PTR SS:,FFFFFFFF
00BAF698 EB 11 JMP SHORT 00BAF6AB
00BAF69A 6A 01 PUSH 1
00BAF69C 58 POP EAX
00BAF69D C3 RETN
00BAF69E 8B65 E8 MOV ESP,DWORD PTR SS:
00BAF6A1 834D FC FF OR DWORD PTR SS:,FFFFFFFF
00BAF6A5 8B7D 08 MOV EDI,DWORD PTR SS:
00BAF6A8 8B55 DC MOV EDX,DWORD PTR SS:
00BAF6AB A1 E400BC00 MOV EAX,DWORD PTR DS:
00BAF6B0 3190 88000000 XOR DWORD PTR DS:,EDX
00BAF6B6 A1 E400BC00 MOV EAX,DWORD PTR DS:
00BAF6BB 3190 88000000 XOR DWORD PTR DS:,EDX
00BAF6C1 A1 E400BC00 MOV EAX,DWORD PTR DS:
00BAF6C6 8B88 90000000 MOV ECX,DWORD PTR DS:
00BAF6CC 3348 2C XOR ECX,DWORD PTR DS:
00BAF6CF 3348 18 XOR ECX,DWORD PTR DS:
00BAF6D2 030D FC00BC00 ADD ECX,DWORD PTR DS: ; sol.01000000
00BAF6D8 8B17 MOV EDX,DWORD PTR DS:
00BAF6DA 85D2 TEST EDX,EDX
00BAF6DC 75 1B JNZ SHORT 00BAF6F9
00BAF6DE FF77 18 PUSH DWORD PTR DS:
00BAF6E1 FF77 14 PUSH DWORD PTR DS:
00BAF6E4 FF77 10 PUSH DWORD PTR DS:
00BAF6E7 8B90 90000000 MOV EDX,DWORD PTR DS:
00BAF6ED 3350 40 XOR EDX,DWORD PTR DS:
00BAF6F0 3350 04 XOR EDX,DWORD PTR DS:
00BAF6F3 2BCA SUB ECX,EDX
00BAF6F5 FFD1 CALL ECX //f7进入就来到OEP了
01005F85 6A 70 PUSH 70
01005F87 68 F8120001 PUSH sol.010012F8
01005F8C E8 DF010000 CALL sol.01006170
希望老鸟们不要笑话,要多给解释才好啊,谢谢! 内存访问断点后 ,其实2次SHIFT+F9 一样到达OEP 嘿嘿!!
我个人觉得 有的版本必须用HE 有的用BP 有的需要+5 有的不需要
隐藏OD 我觉得单进程不隐藏也没什么大问题
不过双进程的就要隐藏! 不同的OD 可能脱的效果不一样
一步步学习中
/:L 我是菜鸟,按老大的方式一步步做完了脱壳,最后生成dumped.exe和dumped_.exe文件.但不知道这就表示脱壳完毕了吗?sol.exe没有什么变化呀.请哪位老大指点一下. 原帖由 醉三风 于 2008-6-3 10:50 发表 https://www.chinapyg.com/images/common/back.gif/:L 我是菜鸟,按老大的方式一步步做完了脱壳,最后生成dumped.exe和dumped_.exe文件.但不知道这就表示脱壳完毕了吗?sol.exe没有什么变化呀.请哪位老大指点一下.
dumped_.exe就是脱了壳的程序。
页:
[1]
2