Armadillo 3.78 -> Silicon Realms Toolworks手动脱壳 Armadillo 3.78 -> Silicon Realms Toolworks
手动脱壳
日期:2005年10月29日 破解人:桂圆
―――――――――――――――――――――――――――――――――――――――――――【软件名称】:天骄正式区适用的1020A自动上线版 软件版本:10.20
【软件大小】: 1.37 MB
【下载地址】:http://www.ff777.com/down.htm
【软件简介】:正式区适用的1020A自动上线版
①随游戏更新,支持正式区的1.197版游戏
②修正勾选了远程下线指令接受到任何密语都下线关机的BUG。
③如果使用远程下线功能的同时需要关机,请同时选择“断开后关机”,否则只下线不关机,以方便多开的用户。
【软件限制】:
【破解声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
【破解工具】:OD, LORDPE IMP
―――――――――――――――――――――――――――――――――――――――――――
【破解过程】:
这个一个外挂程序
天骄外挂
下载地址:http://www.ff777.com/down.htm
呵呵,要破解它当然要先脱掉它啦嘿嘿
我们先用PEID查下壳
Armadillo 3.78 -> Silicon Realms Toolworks
我们运行程序看一下 好了,我们用OD载入
首先 忽略所有异常!
自己手动添加C000001E (INVALID LOCK SEQUENCE),
C000001D (ILLEGAL INSTRUCTION)
并且隐藏OD!
047D8000 TJMa> 60 pushad //OD
载入后在这里
047D8001 E8 00000000
call TJMan.047D8006
047D8006 5D pop ebp
047D8007 50 push eax
047D8008 51 push ecx
047D8009 0FCA bswap edx
047D800B F7D2
not edx
047D800D 9C pushfd
047D800E F7D2
not edx
047D8010 0FCA bswap edx
047D8012 EB 0F jmp short TJMan.047D8023
047D8014 B9 EB0FB8EB mov ecx,EBB80FEB
047D8019 07 pop es
047D801A B9 EB0F90EB mov ecx,EB900FEB
047D801F 08FD
or ch,bh
//
我们在命令行下断点 bp OpenMutexA 回车 Shift+F9运行!77E62391 kern> 55 push ebp //
断在这里 注意堆栈提示
77E62392 8BEC mov ebp,esp
77E62394 51 push ecx
77E62395 51 push ecx
77E62396 837D 10 00 cmp dword ptr ss:[ebp+10],0
77E6239A 56 push esi
77E6239B 0F84 C2E30100 je kernel32.77E80763
77E623A1 64:A1 18000000 mov eax,dword ptr fs:[18]
77E623A7 FF75 10 push dword ptr ss:[ebp+10]
77E623AA 8DB0 F80B0000 lea esi,dword ptr ds:[eax+BF8]
77E623B0 8D45 F8 lea eax,dword ptr ss:[ebp-8]
77E623B3 50 push eax
77E623B4 FF15 8C10E477
call dword ptr ds:[<&ntdll.RtlInitAnsiS>; ntdll.RtlInitAnsiString
/////////////
堆栈提示/////////////////////////////
0012D784 047AF398 /
CALL 到 OpenMutexA 来自 TJMan.047AF392
0012D788 001F0001 |Access = 1F0001
0012D78C 00000000 |Inheritable =
FALSE
0012D790 0012DDC4 \MutexName =
"6A0::DA1FAF23B7"
0012D794 0012FF04
0012D798 00000000
////////////////////////////////////////////////
Ctrl+G 401000
键入以下代码
00401000 60 pushad
00401001 9C pushfd
00401002 68 C4DD1200 push 12DDC4 ; ASCII
"648::DA5BE79566" ◆
00401007 33C0
xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 B5A6A577
call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 7A13A677 jmp kernel32.OpenMutexA
60 9C 68 C4 DD 12 00 33 C0 50 50 E8 B5 A6 A5 77 9D 61 E9 7A 13 A6 77
这里我们直接 划上一部分地址
将 上面的复制 后 右键 二进制 二进制粘贴在401000处新建起源,右键===>此处新建EIP
提示可疑的EIP 我们点确定 并且删除断点F9
运行,再次中断在OpenMutexA处,
77E62391 kern> 55 push ebp //
中断在这里
77E62392 8BEC mov ebp,esp
77E62394 51 push ecx
77E62395 51 push ecx
77E62396 837D 10 00 cmp dword ptr ss:[ebp+10],0
77E6239A 56 push esi
77E6239B 0F84 C2E30100 je kernel32.77E80763
77E623A1 64:A1 18000000 mov eax,dword ptr fs:[18]
77E623A7 FF75 10 push dword ptr ss:[ebp+10]
77E623AA 8DB0 F80B0000 lea esi,dword ptr ds:[eax+BF8]
77E623B0 8D45 F8 lea eax,dword ptr ss:[ebp-8]
77E623B3 50 push eax
77E623B4 FF15 8C10E477
call dword ptr ds:[<&ntdll.RtlInitAnsiS>; ntdll.RtlInitAnsiString
//
取消断点,到401000处撤消修改 //
我们在在命令行下he GetModuleHandleA+5断点
Shift+F9
运行!
77E5AD8B /0F84 37010000 je kernel32.77E5AEC8 //
中断在这里 我们注意堆栈,来寻找最佳返回时机
77E5AD91 |FF7424 04 push dword ptr ss:[esp+4]
77E5AD95 |E8 F8050000
call kernel32.77E5B392
77E5AD9A |85C0 test eax,eax
77E5AD9C |74 08 je short kernel32.77E5ADA6
77E5AD9E |FF70 04 push dword ptr ds:[eax+4]
77E5ADA1 |E8 27060000
call kernel32.GetModuleHandleW
77E5ADA6 |C2 0400 retn 4
77E5ADA9 kern> |55 push ebp
//
利用F9寻找 和ALT+F9返回 注意堆栈提示
/////////////
堆栈提示////////////////////////////////////////
0012CEAC 77C059FC
返回到 msvcrt.77C059FC 来自 kernel32.GetModuleHandleA
0012CEB0 77BE31AC ASCII
"kernel32.dll"
0012CEB4 77C2CA20 msvcrt.77C2CA20
0012CEB8 00000000
0012CF70 772A8663
返回到 SHLWAPI.772A8663 来自 kernel32.GetModuleHandleA
0012CF74 772AF8FC ASCII
"KERNEL32.DLL"
0012CF78 00000000
0012CF7C 772A0000 SHLWAPI.772A0000
0012CF80 0012CFBC
0012CE94 770FB124
返回到 OLEAUT32.770FB124 来自 kernel32.GetModuleHandleA
0012CE98 771722E4 ASCII
"KERNEL32.DLL"
0012CE9C 770FADAC
返回到 OLEAUT32.770FADAC 来自 OLEAUT32.770FB119
0012CEA0 77172064 OLEAUT32.77172064
0012CEA4 000003E8
0012CEA8 770FB0D0
返回到 OLEAUT32.770FB0D0 来自 OLEAUT32.770FAD8A
0012D728 047AE4D3
返回到 TJMan.047AE4D3 来自 kernel32.GetModuleHandleA
0012D72C 00000000
00127AB4 04EC4510
返回到 04EC4510 来自 kernel32.GetModuleHandleA
00127AB8 04ED7B20 ASCII
"kernel32.dll"
00127ABC 04ED8BF8 ASCII
"VirtualAlloc"00127AB4 04EC452D
返回到 04EC452D 来自 kernel32.GetModuleHandleA
00127AB8 04ED7B20 ASCII
"kernel32.dll"
00127ABC 04ED8BEC ASCII
"VirtualFree"00127818 04EB47CB
返回到 04EB47CB 来自 kernel32.GetModuleHandleA //嘿嘿,删除断点,在这里返回ALT+F9
0012781C 00127968 ASCII
"kernel32.dll" 04EB47CB 8B0D 7CF6ED04 mov ecx,dword ptr ds:[4EDF67C]
04EB47D1 89040E mov dword ptr ds:[esi+ecx],eax
04EB47D4 A1 7CF6ED04 mov eax,dword ptr ds:[4EDF67C]
04EB47D9 391C06 cmp dword ptr ds:[esi+eax],ebx
04EB47DC 75 16 jnz short 04EB47F4
04EB47DE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
04EB47E4 50 push eax
04EB47E5 FF15 0C21ED04
call dword ptr ds:[4ED210C] ; kernel32.LoadLibraryA
04EB47EB 8B0D 7CF6ED04 mov ecx,dword ptr ds:[4EDF67C]
04EB47F1 89040E mov dword ptr ds:[esi+ecx],eax
04EB47F4 A1 7CF6ED04 mov eax,dword ptr ds:[4EDF67C]
04EB47F9 391C06 cmp dword ptr ds:[esi+eax],ebx
04EB47FC 0F84 2F010000 je 04EB4931 //Magic Jump
!将它改成改jmp 04EB4931
04EB4802 33C9
xor ecx,ecx
04EB4804 8B07 mov eax,dword ptr ds:[edi]
04EB4806 3918 cmp dword ptr ds:[eax],ebx
//
我们再次的在命令行下断点bp GetCurrentThreadId
Shift+F9
运行!
77E5A7DF kern> 64:A1 18000000 mov eax,dword ptr fs:[18] //
中断在这里 再次寻找返回的最佳时机 F9和ALT+F9配合
77E5A7E5 8B40 24 mov eax,dword ptr ds:[eax+24]
77E5A7E8 C3 retn
77E5A7E9 kern> 8B4C24 04 mov ecx,dword ptr ss:[esp+4]
77E5A7ED 8B5424 08 mov edx,dword ptr ss:[esp+8]
77E5A7F1 8B4424 0C mov eax,dword ptr ss:[esp+C]
77E5A7F5 F0:0FB111
lock cmpxchg dword ptr ds:[ecx],edx
77E5A7F9 C2 0C00 retn 0C
77E5A7FC kern> 55 push ebp
//
注意堆栈变化00127118 73391E26 /
CALL 到 GetCurrentThreadId 来自 73391E20
0012711C 00000001
00127120 73391C0A
返回到 73391C0A 来自 73391DD2
00127124 73391B50
返回到 73391B50 来自 73391B7C
001270F8 73393526 /
CALL 到 GetCurrentThreadId 来自 73393520
001270FC 00000000
00127100 7349F470
00127368 73D3B003 /
CALL 到 GetCurrentThreadId 来自 MFC42.73D3AFFD
0012736C 00000000
00127370 73E03738 MFC42.73E03738
00127364 73D3B003 /
CALL 到 GetCurrentThreadId 来自 MFC42.73D3AFFD
00127368 00000000
0012736C 10005268 tjhook.10005268
00127370 10000000 tjhook.10000000
0012D76C 04EB4B97 /
CALL 到 GetCurrentThreadId 来自 04EB4B91 //嘿嘿,在这里返回取消断点 ALT+F9返回
0012D770 00000000
0012D774 0000015C
04EB4B97 50 push eax //
返回到了这里
04EB4B98 FF75 FC push dword ptr ss:[ebp-4]
04EB4B9B E8 05000000
call 04EB4BA5
04EB4BA0 83C4 0C add esp,0C
04EB4BA3 C9 leave
04EB4BA4 C3 retn //
返回到 04ECC9C9
04EB4BA5 6A 14 push 14
04EB4BA7 E8 CCCD0100
call 04ED1978 ; jmp
to msvcrt.operator
new
//
我们F8往下走04ECC9C9 6A 00 push 0 //
返回到了这里 继续F8
04ECC9CB E8 64E1FEFF
call 04EBAB34
04ECC9D0 59 pop ecx
04ECC9D1 BF 48B4ED04 mov edi,4EDB448
04ECC9D6 8BCF mov ecx,edi
04ECC9D8 E8 1FB9FDFF
call 04EA82FC
04ECC9DD 84C0 test al,al
04ECC9DF 75 09 jnz short 04ECC9EA //
跳
04ECC9E1 6A 01 push 1
04ECC9E3 8BCF mov ecx,edi
04ECC9E5 E8 DA01FEFF
call 04EACBC4
04ECC9EA B9 B0A7ED04 mov ecx,4EDA7B0
04ECC9EF C705 BC7FED04 0C>mov dword ptr ds:[4ED7FBC],4ED8D0C ; ASCII
"RC"
04ECC9F9 E8 2557FDFF
call 04EA2123
04ECC9FE 6A 00 push 0
04ECCA00 E8 1E57FDFF
call 04EA2123
04ECCA05 A1 90B8ED04 mov eax,dword ptr ds:[4EDB890]
04ECCA0A 59 pop ecx
04ECCA0B 8B15 A8B8ED04 mov edx,dword ptr ds:[4EDB8A8] ; TJMan.00400000
04ECCA11 8B3E mov edi,dword ptr ds:[esi]
04ECCA13 8B88 88000000 mov ecx,dword ptr ds:[eax+88]
04ECCA19 3348 50
xor ecx,dword ptr ds:[eax+50]
04ECCA1C 3348 04
xor ecx,dword ptr ds:[eax+4]
04ECCA1F 03CA add ecx,edx
04ECCA21 85FF test edi,edi
04ECCA23 75 18 jnz short 04ECCA3D
04ECCA25 8B50 6C mov edx,dword ptr ds:[eax+6C]
04ECCA28 FF76 14 push dword ptr ds:[esi+14]
04ECCA2B 3350 50
xor edx,dword ptr ds:[eax+50]
04ECCA2E FF76 10 push dword ptr ds:[esi+10]
04ECCA31 3350 18
xor edx,dword ptr ds:[eax+18]
04ECCA34 FF76 0C push dword ptr ds:[esi+C]
04ECCA37 2BCA
sub ecx,edx
04ECCA39 FFD1
call ecx //
我们在这里F7 进去
04ECCA3B EB 1B jmp short 04ECCA58
04ECCA3D 83FF 01 cmp edi,1
04ECCA40 75 18 jnz short 04ECCA5A
04ECCA42 FF76 04 push dword ptr ds:[esi+4]
04ECCA45 FF76 08 push dword ptr ds:[esi+8]
04ECC
00434072 55 push ebp //
嘿嘿,红字红字,OEP啦 ,快DUMP吧~
00434073 8BEC mov ebp,esp
00434075 6A FF push -1
00434077 68 B8A74300 push TJMan.0043A7B8
0043407C 68 D6414300 push TJMan.004341D6 ; jmp
to msvcrt._except_handler3
00434081 64:A1 00000000 mov eax,dword ptr fs:[0]
00434087 50 push eax
00434088 64:8925 00000000 mov dword ptr fs:[0],esp
0043408F 83EC 68
sub esp,68
00434092 53 push ebx
00434093 56 push esi
//
使用LORDPE 完整DUMP Import REConstructor修复OEP
处添入 34072 自动搜索IAT 获取输入表 有几个无效的指针 我们用级别1追踪下 嘿嘿 修复了几个 其他的全部CUT掉
抓取修复文件 把DUMP的修复下
嘿嘿
OK
啦 修复好后 我们运行下 成功~
在查下壳
Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks PEID
查的结果
我们用FI 查下
MS Visual C++
MS Visual C++
成功脱壳桂圆
2005.10.29
―――――――――――――――――――――――――――――――――――――――――――
【Crack_总结】:
很菜,所以不知道写什么心得,还得努力学习啊感谢WYNNEY
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)