游民星空 > 新闻中心 > 正文

如何破解XBOX游戏的存档检核机制

2006-09-26 00:32:03 来源:不详 作者:佚名 编辑:gamersky 浏览:loading
目标游戏: VEXX

工具: IDA.. (http://www.google.com)
cxbx (http://www.caustik.com/)
Xbox Flirt (http://www.geocities.com/smil0r26/misc/xflirt.zip)
把xflirt的sig文件放到IDA的SIG文件夹里
16进制工具 (Your Choice)

#################################################################################


介绍
============
微软在XBOX游戏存档中加入了数字签名技术用来防止修改,不过,既然是我们在玩游戏我们存档有什么理由不能修改呢?(这

个叫绵羊(sheep)的大哥其实很火暴啊)

以下的说明将为你解释如何修改XBOX存档,过程非常简单,使用这个方法人人都可以做出游戏的补丁文件(patchs)我们能随

意修改所有的游戏

PART 1
------

i) 把xbe文件转换成exe文件供IDA调试
ii) 用IDA加载刚才转换的exe文件
iii) 加载Xbox Flirt

PART 2
------

i) 开工
ii) 识别函数名
iii) XApi Code(xbox 应用程序接口代码?).
iv) 找出正确的程序
v) 制作补丁文件

============================================================================

PART 1
======

i) 把xbe文件转换成exe文件
-----------------------------
步骤

1) 启动cxbc

2) 在File/Open菜单

选择VEXX的default.xbe.

3) 在File/Export(输出)菜单

选择存储位置

4)关闭cxbx

ok了

ii) 用IDA加载刚才转换的exe文件

1) 打开IDA

2) File/Open File菜单

选择刚刚转换好的可执行文件(default.exe)

出现对话框

3) 点ok

4) 等一会,可能时间有点长

左下角的数停下来就表示好了

iii) 加载Xbox Flirt
---------------------------
(注:Xbox Flirt没下到,我猜测应该是IDA的一个插件类的东西吧 有明白的人能指导一下吗?)

1) 在File/Load File菜单(指得应该是IDA吧?)

2) 选择Flirt Signature File

3) 从下拉列表中选择Xbox Flirt file.

4) 等一会

PART 2
======

开工
-------------

准备就绪,开工
首先要处理的是存档中的数字签名,方法是在关联的任务中寻找相关的函数。所以我们要中断程序,查看函数。

1) VIEW/Open Subviews菜单

2) 在列表中选择第4个项目"FUNCTIONS"

现在我们就能看到所有的函数了

识别函数名
-------------------
在开始时加载Flirt是因为它可以识别许多函数,当然更多的函数可以被IDA识别。

下面3个函数是我们感兴趣的
XCalculateSignatureUpdate
XCalculateSignatureBegin
XCalculateSignatureEnd

很明显这几个函数把其他构成数字签名的程序关联起来,下面我们需要找出这些xapis(xbox 应用程序接口?)

1) 选择"FUNCTIONS"

2) 在菜单里选search(查找)命令

3) 输入"SIG"(不包括引号)点ok.

4) 如果找到其他xapi而非上面的那三个,那么按CTRL-T继续查找
直到你找到为止,然后双击进入该函数

XApi Code(xbox 应用程序接口代码?)
---------
你已经来到了应用程序内部
向下来 看到如下代码
**********************************************************************************

; Attributes: library function
.text:0011D084
.text:0011D084 ; __stdcall XCalculateSignatureUpdate(x,x,x)
.text:0011D084 _XCalculateSignatureUpdate@12 proc near ; CODE XREF: sub_5A2B0+15p
.text:0011D084 ; sub_5A2E0+18p



**********************************************************************************
在“_XCalculateSignatureUpdate@12”点鼠标右键,接着选"Jump to Xref to Operand.."
现在你可以得到2个参数
下面我们分析一下这两个参数是做什么的,我们知道游戏需要它们做两件事
1:在载入时校验数字签名
2: 在保存游戏时创建新的签名
那么也许这两个参数正是我们要寻找的

iv) 找出正确的程序
现在要找出哪一个是我们保存游戏时调用的参数,下面需要跟踪一下代码了

来到这里
************************************************************************************

.text:0005A2C4 push esi
.text:0005A2C5 call _XCalculateSignatureUpdate@12 ; XCalculateSignatureUpdate(x,x,x)
.text:0005A2CA mov edx, [esp+arg_4]
.text:0005A2CE add edx, 8
.text:0005A2D1 push edx
.text:0005A2D2 push esi
.text:0005A2D3 call _XCalculateSignatureEnd@8 ; XCalculateSignatureEnd(x,x)
.text:0005A2D8 pop esi
.text:0005A2D9 retn 10h
.text:0005A2D9 sub_5A2B0 endp
懂汇编语言的朋友自己分析一下吧
***********************************************************************************
现在已经进入了签名程序,可以看到我上面提及的2个API也在这里,看来我们离真相已经不远了

Hmm,你发现了没有,这段程序里没有任何比较或检验的命令(cmp or test 汇编指令)它看起来很普通……

因此我认为真正的检验关键不在这里,我们需要在外面寻找一些别的线索……

来到这里

***********************************************************************************

.text:0005A2B0 sub_5A2B0 proc near ; CODE XREF: sub_59B40+8Dp

***********************************************************************************

双击 sub_59B40+8D来到这里

***********************************************************************************

.text:00059BCD call sub_5A2B0 ; 从这进入
.text:00059BD2 mov eax, [edi+10Ch]
.text:00059BD8 push 1Ch
.text:00059BDA lea edx, [esp+28h+var_1C]
.text:00059BDE push edx
.text:00059BDF push eax
.text:00059BE0 call sub_DE3B0
.text:00059BE5 mov ecx, [esp+30h+var_1C]

***********************************************************************************
在这里你可以发现程序自自始至终都没有比较之类的命令,无论在SAVE GAME还是LOAD GAME的程序里。


***********************************************************************************
现在让我们从头开始,按“G”输入“11D082” 在“_XCalculateSignatureUpdate@12”处继续取得参数

这次双击最下面的参数 来到这里

***********************************************************************************

.text:0005A2F8 call _XCalculateSignatureUpdate@12 ; XCalculateSignatureUpdate(x,x,x)
.text:0005A2FD lea edx, [esp+20h+var_14]
.text:0005A301 push edx
.text:0005A302 push esi
.text:0005A303 call _XCalculateSignatureEnd@8 ; XCalculateSignatureEnd(x,x)
.text:0005A308 mov ecx, [esp+20h+arg_4]
.text:0005A30C lea edx, [esp+20h+var_14]
.text:0005A310 add ecx, 8
.text:0005A313 test dl, 3
.text:0005A316 lea eax, [esp+20h+var_14]
.text:0005A31A jnz short loc_5A350
.text:0005A31C test cl, 3
.text:0005A31F jnz short loc_5A350

***********************************************************************************
haha,这里可以看到好多比较命令test(比较)jnz(非零即跳转)
看来我们逼近终点了,继续看可以看到两个出口,这里大约有10条指令,你可以看到ecx被赋予eax的值这是执行比较命令之前

的一种常见做法,我认为eax将返回一个正确值或一个错误值,但是这看起来太简单了,只有一条比较指令就能返回值有些不太

可能,估计真正的检测应该在外面的某个地方。

来到这里

***********************************************************************************

.text:0005A2E0 sub_5A2E0 proc near ; CODE XREF: sub_5A260+2Fp

***********************************************************************************

双击 sub_5A260+2Fp and we should be here..

***********************************************************************************

.text:0005A28F call sub_5A2E0
.text:0005A294 test eax, eax
.text:0005A296 jnz short loc_5A29F
.text:0005A298
.text:0005A298 loc_5A298: ; CODE XREF: sub_5A260+22j
.text:0005A298 xor eax, eax
.text:0005A29A pop esi
.text:0005A29B add esp, 1Ch
.text:0005A29E retn
.text:0005A29F ; ------------------------------------------------------------------
.text:0005A29F
.text:0005A29F loc_5A29F: ; CODE XREF: sub_5A260+36j
.text:0005A29F mov eax, 1
.text:0005A2A4 pop esi
.text:0005A2A5 add esp, 1Ch
.text:0005A2A8 retn
.text:0005A2A8 sub_5A260 endp

***********************************************************************************
就在CALL sub_5a2e0这个调用外,比较EAX里的存储值
这里同样有两个出口,这些代码比上面的要清楚多了
在这里可以看到如果eax非0,那么被赋1并跳转到其他程序;如果eax=0那么来到判断命令
因此我想我找到了解决问题的关键,修改下面的代码
把“text:0005A296 jnz short loc_5A29F”的jnz命令改为jmp(无条件跳转)


创建补丁程序
------------------

需要一个16进制工具

1) 启动16进制工具

2)打开VEXX default.xbe

3) 寻找
把IDA的地址转换成静态地址通常要减去10000,即

.text:0005A296 - BASE IMAGE = 4A296

4) 在16进制工具里

5) 把机器码75即(jnz)命令改成EB即(jmp)命令

text:0005A296 jmp short loc_5A29F

6) 保存
游民星空APP
随时掌握游戏情报
code
休闲娱乐
综合热点资讯
单机游戏下载
好物推荐
游民星空联运游戏