首页
社区
课程
招聘
[求助]我脱一个arm 3.5壳的详细步骤,请高手看看在哪里出错了??
发表于: 2007-3-29 09:03 6845

[求助]我脱一个arm 3.5壳的详细步骤,请高手看看在哪里出错了??

2007-3-29 09:03
6845
这段时间一直在研究这个,但是到已经好几天没有进展了,所以发个详细步骤上来让高手帮忙看看。

这是一个外国的保龄球小游戏,在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期)

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
有可能是自校验。

magic jump的地方,执行后,建议改过的地方还原,以防Arm校验。
路过magic jump后,你可以Alt+M,在.text下内存断点,也可中断到OEP。
2007-3-29 09:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢kanxue老大,我本来也想发在这的,但是发帖数还不够。

按照老大的提醒,我没有将je改为jmp,运行到那句magic jump时候,修改了z标志位,让它实现跳转,然后用Alt+M,在text段下内存访问断点,确实也到oep了。但是这个时候取消断点,然后继续用F9运行,就弹出错误对话框,然后退出,进入不了游戏,跟我上面的情况一样,真的是很怪,我什么都没改动啊。

PS:这个游戏的下载页面为:http://www.newhua.com/soft/26558.htm,是个10M的小游戏。
2007-3-29 10:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
又试了一个下午,发现在magic jump那个地方,如果不改,让它步过,然后用Alt+M对text段下内存访问断点,进入oep,这样继续按F9,可以进入游戏。难道是magic jump找错了??

可是如果不改magic jump,在oep处用importIRC会得到很多无效指针,而改了magic jump,只会得到3个无效指针,所以看来magic jump那里应该是找对了的啊。难道是我删除这三个无效指针的原因吗?
2007-3-29 17:24
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
magic jmp 当然要改,无效指针不能一味的删掉,删之前看看,那些指针是否真的无效(也就是看它所指的是否是有效的代码),会不会是LoadLibraryA,GetProcAddress之类的指针?
2007-3-29 19:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
该怎么看呢,我用importIRC中那三个修复方法都不行,不知道怎么办了。我看很多帖子都说只有几个不对的就直接删除了。。。。。。。。。

怎么知道指针所指的是不是有效代码呢??
2007-3-29 20:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哪位高手再指点一下啊,我用很多方法都试过了,脱壳后还是不能运行啊,问题都一样,弹出两个错误窗口,然后退出了。
有没有可能是存在暗桩 或者 stolen code 啊。。。。。。。。。。。。。
头都大了
2007-4-3 10:56
0
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
帮你顶,菜鸟学习来了
2007-4-3 14:57
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
顶下 技术不错
2007-4-3 23:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
顶一下,菜鸟学习
2007-4-4 00:38
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
我刚才下过来看了下子
楼主前面的所有处理都没有错误
脱完的程序不能运行可能是自校验的缘故(原来的程序有附加数据,看看是不是没有补上附加数据)
我没时间跟进了
2007-4-4 10:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
附加数据是有的,但是该怎么加呢?
而且我用bp SetFilePoint 下断, 发现脱壳后的程序 与 没有用magic jump直接到oep的原程序在这个断点上有很大不同。就是它们出现的位置和调用方法都不一样。难道是magic jump改变了code的解码么?
2007-4-4 11:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我用UltrEdit打开,发现附加数据段全部都是0。我将其复制到脱壳后的文件最后。但是还是不行。
我用setFilePoint下断,发现有从File_begin定位的都没有用到附加数据段。
2007-4-4 11:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主:
Armadillo的壳好像很难破呀,Sayatoo 卡拉字幕不知你破了没有,期待早日完成

是不是需要手动脱壳呀?这个软件保护的太厉害了。还有十行限制,其实最主要的是能去掉十行限制,至于时间限制无所谓
2007-5-24 07:55
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
15
应该不是自校验和附加数据的问题。把附加数据段删除了也可以正常运行。
2007-5-24 19:11
0
游客
登录 | 注册 方可回帖
返回
//