这段时间一直在研究这个,但是到已经好几天没有进展了,所以发个详细步骤上来让高手帮忙看看。
这是一个外国的保龄球小游戏,在onlinedown上可以下到。用Armadillo做的试用三次保护,试用玩后要输入用户名和注册码。但是可以用Trial-Reset恢复。
用peid v0.94看,是
Armadillo 3.00a - 3.61 -> Silicon Realms Toolworks [Overlay]
用fi看,是
Armadillo 3.5a
然后用Armafp看保护方式为:
======== 29-03-2007 08:19:19 ========
C:\Program Files\Ten Pin Championship Bowling\bowling.exe
★ 目标为Armadillo保护
★ 特征识别 = 0498EC78
保护系统级别为 (标准版)
◆所用到的保护模式有◆
标准保护 或 最小保护模式
【备份密钥设置】
固定的备份密钥
【程序压缩设置】
最好/最慢地压缩方式
【其它保护设置】
通过loadPE看也是单进程的。
于是用很多帖子介绍的两次断点法来找magic jump 和oep
用OllyICE调入程序,进入在这
2003B000 > 60 pushad <==== 进入在这
2003B001 E8 00000000 call 2003B006
2003B006 5D pop ebp
2003B007 50 push eax
2003B008 51 push ecx
2003B009 EB 0F jmp short 2003B01A
2003B00B B9 EB0FB8EB mov ecx, EBB80FEB
2003B010 07 pop es
2003B011 B9 EB0F90EB mov ecx, EB900FEB
2003B016 08FD or ch, bh
2003B018 EB 0B jmp short 2003B025
***********************************************************************************************************************************************
下断点he GetModuleHandleA,然后用F9和shift+F9通过断点,直到那个提醒注册和试用次数的窗口出现,因为没有key,所以点ok继续,点完后看堆栈是下面的情况
***********************************************************************************************************************************************
0011B5C0 7E2F8AE2 /CALL 到 GetModuleHandleA 来自 mshtml.7E2F8ADC
0011B5C4 7E2F8B3C \pModule = "OLEAUT32"
0011B5A8 7711CA41 /CALL 到 GetModuleHandleA 来自 OLEAUT32.7711CA3B
0011B5AC 7711D458 \pModule = "ole32.dll"
0011B5B0 7E2F8A68 /CALL 到 GetModuleHandleA 来自 mshtml.7E2F8A62
0011B5B4 7E2F8A7C \pModule = "KERNEL32.DLL"
0011B5B8 7E25648C ASCII "ReleaseActCtx"
0012BD64 00AC6A27 /CALL 到 GetModuleHandleA 来自 00AC6A21 <==到这里决定返回
0012BD68 0012BEA0 \pModule = "kernel32.dll"
用ctrl+F9返回,然后按F8到这里,
00AC6A21 FF15 C460AE00 call dword ptr [AE60C4] ; kernel32.GetModuleHandleA
00AC6A27 8B0D F0EDAE00 mov ecx, dword ptr [AEEDF0]
00AC6A2D 89040E mov dword ptr [esi+ecx], eax
00AC6A30 A1 F0EDAE00 mov eax, dword ptr [AEEDF0]
00AC6A35 393C06 cmp dword ptr [esi+eax], edi
00AC6A38 75 16 jnz short 00AC6A50
00AC6A3A 8D85 B4FEFFFF lea eax, dword ptr [ebp-14C]
00AC6A40 50 push eax
00AC6A41 FF15 CC60AE00 call dword ptr [AE60CC] ; kernel32.LoadLibraryA
00AC6A47 8B0D F0EDAE00 mov ecx, dword ptr [AEEDF0]
00AC6A4D 89040E mov dword ptr [esi+ecx], eax
00AC6A50 A1 F0EDAE00 mov eax, dword ptr [AEEDF0]
00AC6A55 393C06 cmp dword ptr [esi+eax], edi
00AC6A58 0F84 AB000000 je 00AC6B09 <==从上面看符合magic jump 的特征,特别是有LoadLibraryA,因此将其修改为jmp
00AC6A5E 33C9 xor ecx, ecx
00AC6A60 8B03 mov eax, dword ptr [ebx]
00AC6A62 3938 cmp dword ptr [eax], edi
00AC6A64 74 06 je short 00AC6A6C
00AC6A66 41 inc ecx
修改后的代码为:
00AC6A21 FF15 C460AE00 call dword ptr [AE60C4] ; kernel32.GetModuleHandleA
00AC6A27 8B0D F0EDAE00 mov ecx, dword ptr [AEEDF0]
00AC6A2D 89040E mov dword ptr [esi+ecx], eax
00AC6A30 A1 F0EDAE00 mov eax, dword ptr [AEEDF0]
00AC6A35 393C06 cmp dword ptr [esi+eax], edi
00AC6A38 75 16 jnz short 00AC6A50
00AC6A3A 8D85 B4FEFFFF lea eax, dword ptr [ebp-14C]
00AC6A40 50 push eax
00AC6A41 FF15 CC60AE00 call dword ptr [AE60CC] ; kernel32.LoadLibraryA
00AC6A47 8B0D F0EDAE00 mov ecx, dword ptr [AEEDF0]
00AC6A4D 89040E mov dword ptr [esi+ecx], eax
00AC6A50 A1 F0EDAE00 mov eax, dword ptr [AEEDF0]
00AC6A55 393C06 cmp dword ptr [esi+eax], edi
00AC6A58 E9 AC000000 jmp 00AC6B09
00AC6A5D 90 nop <===OllyIce自动加了一个nop
00AC6A5E 33C9 xor ecx, ecx
00AC6A60 8B03 mov eax, dword ptr [ebx]
********************************************************************************
这个时候,将原断点去掉,换成bp GetCurrentThreadID,按F9继续,看堆栈的情况为:
********************************************************************************
0012B624 73391E36 /CALL 到 GetCurrentThreadId 来自 73391E30
0012B628 00000001
0012B604 7339353F /CALL 到 GetCurrentThreadId 来自 73393539
0012B608 00000000
0012F56C 00AE20CB /CALL 到 GetCurrentThreadId 来自 00AE20C5 <===决定返回
0012F570 0012FF04
用ctrl+F9返回,再按F8,到这里
00AE20C5 FF15 1461AE00 call dword ptr [AE6114] ; kernel32.GetCurrentThreadId
00AE20CB A3 A032AF00 mov dword ptr [AF32A0], eax
00AE20D0 E8 404CFEFF call 00AC6D15
00AE20D5 6A 00 push 0
00AE20D7 E8 61A4FEFF call 00ACC53D
00AE20DC 6A 00 push 0
00AE20DE C705 98B8AE00 3>mov dword ptr [AEB898], 0AEC330 ; ASCII "RC"
00AE20E8 E8 A046FEFF call 00AC678D
00AE20ED 59 pop ecx
00AE20EE 59 pop ecx
00AE20EF E8 9821FFFF call 00AD428C
00AE20F4 8BF8 mov edi, eax
00AE20F6 A1 8C32AF00 mov eax, dword ptr [AF328C]
00AE20FB 8B48 68 mov ecx, dword ptr [eax+68]
00AE20FE 3348 58 xor ecx, dword ptr [eax+58]
00AE2101 3308 xor ecx, dword ptr [eax]
00AE2103 03F9 add edi, ecx
00AE2105 8B0E mov ecx, dword ptr [esi]
00AE2107 85C9 test ecx, ecx
00AE2109 75 2E jnz short 00AE2139
00AE210B 8B38 mov edi, dword ptr [eax]
00AE210D E8 7A21FFFF call 00AD428C
00AE2112 8B0D 8C32AF00 mov ecx, dword ptr [AF328C] ; bowling.2004B260
00AE2118 FF76 14 push dword ptr [esi+14]
00AE211B 8B51 68 mov edx, dword ptr [ecx+68]
00AE211E FF76 10 push dword ptr [esi+10]
00AE2121 3351 58 xor edx, dword ptr [ecx+58]
00AE2124 FF76 0C push dword ptr [esi+C]
00AE2127 33D7 xor edx, edi
00AE2129 03C2 add eax, edx
00AE212B 8B51 7C mov edx, dword ptr [ecx+7C]
00AE212E 3351 54 xor edx, dword ptr [ecx+54]
00AE2131 33D7 xor edx, edi
00AE2133 2BC2 sub eax, edx
00AE2135 FFD0 call eax
00AE2137 EB 24 jmp short 00AE215D
00AE2139 83F9 01 cmp ecx, 1
00AE213C 75 21 jnz short 00AE215F
00AE213E FF76 04 push dword ptr [esi+4]
00AE2141 FF76 08 push dword ptr [esi+8]
00AE2144 6A 00 push 0
00AE2146 E8 4121FFFF call 00AD428C
00AE214B 50 push eax
00AE214C A1 8C32AF00 mov eax, dword ptr [AF328C]
00AE2151 8B48 7C mov ecx, dword ptr [eax+7C]
00AE2154 3348 54 xor ecx, dword ptr [eax+54]
00AE2157 3308 xor ecx, dword ptr [eax]
00AE2159 2BF9 sub edi, ecx
00AE215B FFD7 call edi <==以上都都符合arm 3.xx系列的oep特征,于是决定用F7进入这里
00AE215D 8BD8 mov ebx, eax
00AE215F 5F pop edi
00AE2160 8BC3 mov eax, ebx
00AE2162 5E pop esi
00AE2163 5B pop ebx
00AE2164 C3 retn
00AE2165 837C24 08 01 cmp dword ptr [esp+8], 1
00AE216A 75 14 jnz short 00AE2180
00AE216C 68 E02EAF00 push 0AF2EE0
进入后到这里
200039D4 55 push ebp 《==到这里用按步骤用loadpe导出,然后用importREC修复IAT。
200039D5 8BEC mov ebp, esp
200039D7 6A FF push -1
200039D9 68 E0710020 push 200071E0
200039DE 68 FC490020 push 200049FC
200039E3 64:A1 00000000 mov eax, dword ptr fs:[0]
200039E9 50 push eax
200039EA 64:8925 0000000>mov dword ptr fs:[0], esp
200039F1 83EC 58 sub esp, 58
200039F4 53 push ebx
200039F5 56 push esi
200039F6 57 push edi
200039F7 8965 E8 mov dword ptr [ebp-18], esp
200039FA FF15 30710020 call dword ptr [20007130] ; kernel32.GetVersion
20003A00 33D2 xor edx, edx
20003A02 8AD4 mov dl, ah
20003A04 8915 C48A0020 mov dword ptr [20008AC4], edx
20003A0A 8BC8 mov ecx, eax
20003A0C 81E1 FF000000 and ecx, 0FF
20003A12 890D C08A0020 mov dword ptr [20008AC0], ecx
20003A18 C1E1 08 shl ecx, 8
导出的程序会出错,提示需要安装shockwave 8.0, 然后我安装了,又提示什么ini文件出错。
请高手看看我是不是哪里出错了,还是因为没有key的原因??
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)