| 硬件周边 | PS2硬件周边 | GBA硬件周边 | NDS硬件周边 | XBOX360硬件周边 | XBOX硬件周边 | WII硬件周边 | PS3硬件周边 | PSP硬件周边 |
如何破解XBOX游戏的存档检核机制
目标游戏: 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) 保存 |
>> 相关资讯:
上一篇:关于xbmc的升级,使用心得等 下一篇:Phoenix Bios Loader:从硬盘加载 BIOS相关文章

热门文章

推荐文章

