Board logo

标题: [模拟相关] 教程:MD游戏怎样通过修改ROM解除区码限制(进度45%) [打印本页]

作者: SONIC3D    时间: 2013-4-4 21:31     标题: 教程:MD游戏怎样通过修改ROM解除区码限制(进度45%)

因为前一阵另一片帖子写道测试烧录卡的MegaKey有部分不兼容,外加有人QQ上美味的机器猫(我也不知道他TG id)询问我有没有详细的改区码的教程,所以抽空简单写一篇,给有能力有时间的技术宅们自己把玩用。
因为时间有限,边想边写,不能一次写完,写完了会特别标注。

一、MD的区码限制原理
  MD主机内有一个特别的内存地址用于存放当前主机的区码状态,这个地址在主机的内存地址映射范围内,不属于卡带ROM的范围,并且所有MD机型共通,用于所有卡带游戏的区码检测,包括MD和32X游戏,但不包括MDCD游戏。
  游戏卡带中ROM的程序中,会有代码读取这个地址中的数据,并根据读取到的值判断当前到底是工作在50Hz还是60Hz下(PAL还是NTSC),是(日本)海外版还是(日本)国内版。根据这2个属性,可以组合出4种组合,也就是亚、日、美、欧四种MD版本。游戏软件通过这种方式就确定了主机的版本,就可以进一步作区码限制,比如对特定版本的主机显示特定的提示信息,告知用户这个游戏不能工作在当前主机上。
  所以,一切检测的逻辑都在游戏卡内,这个和MegaCD、Saturn、Playstation的区码检测机制就有所不同了,也就决定了要在不改动主机情况下解除区码,只在游戏ROM上下手。

二、用MegaKey来实现全区的工作原理和优劣
  了解了MD的区码检测原理,那么再来看看硬件MegaKey和类似的制转卡如何工作。
  MegaKey的工作分为2步,一个是了解当前游戏兼容于哪些区码的主机,二是实施欺骗手段,使卡带的程序认为当前运行在拥有兼容区码的主机版本上。
  第一步有两种做法,一种是要用户自己输入,早期有些制转卡背后有一个dip开关,卡带正面有各个dip开关对应的区码,实际就是要用户自己把dip拨到一个卡带可以对应的区码,只是前面贴纸上印的区码对应dip的关系往往都不是很明确,让不了解的玩家有时候只有穷举尝试。另一种做法是通过读取游戏ROM的0x01F0H也就是第496个字节开始的区码字串,这个字串Sega规定的一个游戏ROM应当在ROM头部标明的支持区码,这个区码可以和实际的区码判定逻辑没有直接对应关系,只是给人工阅读或编目工作提供方便用的,MegaKey通过读取这里的值就可以知道这个游戏声称自己应当支持哪些区码的主机。
  第二步是MegaKey实际实施区码欺骗。这个是硬件问题了,我不了解,但是在老外写的一篇文章中我记得说是通过对地址总线监测和对数据总线进行挑战干扰的方式来使ROM中的程序在读取主机区码信息的地址时永远得到MegaKey欺骗它的值,这个请有数字电路设计经验的人来谈,超出本文的讨论范围了。
  通过MegaKey来全区,优点是步骤简单,不用动脑子,不用改主机,不用改ROM,但缺点是兼容性并非100%,并且一旦不兼容,也没有任何变通方法,因为一般不兼容的根源都来自于第二步。

三、修改ROM来实现全区的工作原理和优劣
  因为之前已经说过,判断区码的逻辑都在卡带ROM里,所以要通过修改卡带ROM来实现全区需要:
  1.定位程序在哪里读取主机的区码信息。
  2.定位程序在哪里利用读取到的区码信息来使游戏走向不同的判定分支(正常运行/显示禁止运行的提示)。
  3.通过修改代码,强行将第2步中的判定改到永远走正常运行的判定分支。
  4.重新计算ROM的校验和,并写入ROM头部的校验和位置,防止因为ROM校验失败而红屏。(也可以干脆把ROM校验和计算的程序也强制改为永远判定为正确)
  5.总结3、4两步的修改点和修改内容,并转换为金手指代码(Game Genie Code),方便使用和共享。
修改ROM来实现全区优点是在区码解锁方面成功率100%(少部分游戏对时序有特别要求,不能在50Hz和60Hz下都正常工作,但这个与区码解锁失败是两回事,这点请注意,本文不考虑游戏解除区码限制后可能出现的运行异常情况,只讨论区码解锁技术本身)。缺点是解锁步骤麻烦,需要少量汇编阅读知识和程序分析能力,并且对各种工具有综合应用能力。

四、工具准备
  这里列出本文所需要的工具和对应下载地址,为了使分析和修改步骤尽可能做到简化,所以工具可能有些多有些复杂。对于熟练的修改者,可以自己总结更好更适用于自己的工具组,具体请自行探索,本文只作抛砖引玉。
  1.Regen。(http://aamirm.hacking-cult.org/www/regen.html)
     MD的动态调试器。这个用来完成第1步(定位程序在哪里读取主机的区码信息)。
  2.Hex-Rays IDA(https://www.hex-rays.com/index.shtml)。
     68000的静态汇编分析工具。注意,其官网的免费版本不支持68000必须用零售版。
  3.MIDA。(http://gendev.spritesmind.net/page-mida.html)
     这是给IDA用的方便分析MD ROM的脚本,会自动标示出MD ROM头部各个位置对应的意义,还有特定的内存地址中各个bit的意义,比如我们需要的主机信息地址。
  4.68000的指令集参考文档(完整的可以到freescale的网站)
  5.16进制编辑器,WinHex、UltraEdit、HxD等均可
  6.一个MD金手指和地址/值转换器(http://games.technoplaza.net/ggencoder/java/applet/)
     这个用于把找到的地址转换为金手指码,这个网址需要浏览器支持java  7.一个MD ROM的校验和计算器或修正器。
  所有需要的工具和文档资源,我已经整理在以下网盘:
  http://pan.baidu.com/share/link?shareid=481614&uk=2149746980


五、实际入手
  以上说了很多,但不操作就脱离实际了。接下来以魂斗罗欧版(Probotector)这个游戏为例,介绍分析和解除区码的具体流程。
  之所以选择魂斗罗欧版,一是因为这个游戏有锁区,只能在欧版机上运行,在其他区域主机上均只会出现静止的Konami Logo,二是因为它有ROM完整性校验,随意修改ROM后不修正校验会红屏。所以这个ROM可以同时对解除区码锁定和修正校验这两点进行实践。  本章的最终目标就是把它变为可以在任何区码的主机上运行,并且将最终修改法总结为2条金手指代码。

  1.定位程序在哪里读取主机的区码信息。
    之前提到任何游戏的代码都是通过读取主机内一个固定的地址来获取主机的区码,这个地址就是$00A10001(其中$表示后面的数字为16进制,有时候也用字母H结尾来表示H之前的数字是16进制。
    所以首先我们要找到游戏代码在哪里读取了这个地址。最方便的方法就是使用Regen这个带调试功能的模拟器,在00A10001处下一个读取断点,这样一旦有代码访问到该地址,Regen就会让程序停止在该代码执行完毕处,也就是下一句代码之前。
    解压并运行Regen,可以到System菜单->Redefine keys下定义好手柄键位。File菜单->Load Genesis ROM加载Probotector_(E)_[!].bin,点击Tools菜单->68000 Debugger,打开68000调试器。
    在68000调试器的左下方Address Breakpoint中,最多一次可以设置5个断点,我们只需要1个即可完成目的。在其中第一行填入A10001,钩上Read,再钩上最前面的勾表示启用该断点,Write、PC、Trace不用勾。
    [attach]522194[/attach]
    填完后,先不要关68000调试器,按一下右侧的Reset按钮,重置游戏,因为当我们载入ROM的时候游戏就开始运行了,可能已经过了区码检测点。
    接下来按一次OK,68000调试器会关闭,游戏开始运行,一旦到了符合断点条件的代码,68000调试器就又会弹出,调试器左上方PC那一列的第一行就是符合断点条件代码的下一行。
    对于初学者建议记录下所有中断时的PC值,以便进一步分析,每次记录好后按OK继续运行,直到游戏开始正常出现画面,基本上已经可以确定之后对该地址的读取已经与区码检测无关,再停止记录。
    对于Probotector这个游戏,我们可以记录到中断于以下几个点:$000220,$000FB0,$0003B4,$005EAE。下图为一个示例:
    [attach]522195[/attach]
    至此,你已经找到了欧版魂斗罗这个游戏所有可能读取区码的代码点,这其中的一个或多个点可能参与了区码的检测,而另外一些点则用于其他判断,下一节我们要对这几个点略加甄别然后分析其中真正的区码检测逻辑。

  2.分析区码检验逻辑到底发生在哪里,以及如何完成检验
    上一小节已经得到了4个可能用于区码检测的代码点,但一般来说游戏的区码检测会在游戏初期就进行检测,并且一般只会检测一次,之所以$00A10001这个地址被读取多次是因为还可以用这个地址中存储的值来做其他事,比如判定MD主机的发行先后版本。    所以我们要在有了候选的地址后要尽可能多地排除掉与区码检测功能无关的。
    首先排除的是第4个$005EAE,因为在第1步中的游戏开始后,几乎每一贞,断点都会停在此处,显然区码检测不必如此频繁,所以排除。
    然后剩下的3个地址我们暂时无法很好确定,因为Regen作为动态调试器,并不能很方便地在断点前后阅读代码。所以要搬出更好的代码阅读和分析工具,也就是静态调试器IDA。

    到第四章最后的网盘下载到IDA 6.1,然后解压即可使用,其中可执行文件众多,对于MD的ROM分析,我们需要运行其中的idag.exe或者idaq.exe。
    另外为了改善代码的可读性,到网盘下载mida,这个脚本会帮助在IDA中添加MD相关的特殊地址的功能注释,用法我下面讲。

    运行idag.exe,按OK,在欢迎界面选第二个按钮Go,这样会开出一个新的工作区。
    将Probotector_(E)[!].bin这个ROM文件拖到这个工作区中央或者通过菜单File->Open打开这个ROM文件。
    [attach]523051[/attach]
    在弹出的Load a new file对话框中,Processor Type下拉列表中选择Motorola series:68000,选好后一定要记得按一下右边的Set。
    [attach]523052[/attach]
    按OK后弹出Disassembly memory organization对话框,这里的内容无所谓,稍后mida会帮我们填好,但要注意的是第2行RAM size要填一个非0值,否则会无法继续,可以填上0x00000001以便继续下去。
    [attach]523053[/attach]
    按OK后,会弹出一个Information对话框,仅仅是告诉你,载入的是一个不知道代码入口地址(第1行代码的位置)的文件,无法进一步分析。没有关系,不用理会,mida接下去会帮我们指定,直接按OK关闭这个对话框就完成了ROM的加载了。
    接下来要加载mida。把mida_02.zip中的mida.idc文件解压到任意目录,推荐解压到IDA安装目录下的idc目录,这是惯例,但不是必须的。然后到刚才载入过ROM的IDA工作区上,点菜单File->Script File...,浏览到mida.idc文件,打开,之后就会发觉IDA代码区的内容有了很多变化,原先纯粹的16进制数据一部分已经变为代码和注释。
    [attach]523054[/attach]

    我们要分析的3个代码点分别为$000220,$000FB0,$0003B4,如果用滚轮滚动代码有时候不是很方便,这时后可以按键盘g,在弹出的Jump to address对话框输入220直接跳转到$000220,依此类推,更多IDA快捷键可以见附录。
    [attach]523055[/attach]


    {未完成,占位文字}
  3.修改检验逻辑,使其能够全区码
    {未完成,占位文字}
  4.修改校验和
    {未完成,占位文字}
  5.转换修改的内容为金手指
    {未完成,占位文字}
  6.回家作业:自己将魂斗罗日版转换为全区。


六、触类旁通
  触类旁通这章不再赘述第五章中的1、2、4、5、6具体步骤,仅针对另外几个锁区游戏进行第3步分析和修改过程的分析。
  1.幽游白书魔强统一战
    {未完成,占位文字}
  2.Sunset Rider美版
    {未完成,占位文字}


七、附录
  1.IDA常用快捷键功能介绍
    {未完成,占位文字}


未完待续,时间有限,缓慢文字、截图推进中

[ 本帖最后由 SONIC3D 于 2013-4-9 23:02 编辑 ]
作者: SONIC3D    时间: 2013-4-4 21:31

不拉屎,纯占个坑
作者: segachzh    时间: 2013-4-4 21:47

好厉害  围观
作者: alexey    时间: 2013-4-4 21:53

技术帖帮顶:D
作者: hujie    时间: 2013-4-5 17:08

:D   拍手鼓掌!
作者: nvnv-sunny    时间: 2013-4-5 17:20     标题: 回复 1# 的帖子

sonic兄,俺就是那机器猫,进来学习了,先谢谢了
作者: zhqing    时间: 2013-4-5 22:10

加油啊,3D君。
作者: chenyudill    时间: 2013-4-6 10:41

加油啊,主要关心光明力量2古代封印中文版在美版机上有区域提示没法游戏,希望能解决!
作者: ahliang    时间: 2013-4-6 15:30

引用:
原帖由 chenyudill 于 2013-4-6 10:41 发表
加油啊,主要关心光明力量2古代封印中文版在美版机上有区域提示没法游戏,希望能解决!
这个不是早就回贴告诉你用金手指码解决了吗
作者: snk1985    时间: 2013-4-6 19:55

想下载没有区域限制的ROM
作者: chenyudill    时间: 2013-4-7 08:47     标题: 回复 9# 的帖子

用哪个金手指解决?没看到啊。
作者: ahliang    时间: 2013-4-7 12:52

引用:
原帖由 chenyudill 于 2013-4-7 08:47 发表
用哪个金手指解决?没看到啊。
这个贴子里给你的回复……http://club.tgfcer.com/thread-6636738-2-1.html
作者: chenyudill    时间: 2013-4-8 08:47

引用:
原帖由 ahliang 于 2013-4-7 12:52 发表


这个贴子里给你的回复……http://club.tgfcer.com/thread-6636738-2-1.html
好的,我试下,谢谢!以后有机会自己研究一下把区域限制给去了。
作者: hujie    时间: 2013-4-8 22:56

引用:
原帖由 chenyudill 于 2013-4-8 08:47 发表

好的,我试下,谢谢!以后有机会自己研究一下把区域限制给去了。
MD的REGION LOCK ROUTINE位于卡带ROM中,原理上应该都可以去除。
但是如果是PAL(50Hz)的ROM,可能在NTSC(60Hz)模式中存在垂直回扫时序不匹配的问题。
作者: karlmao    时间: 2013-4-9 08:34

posted by wap, platform: UC

太有文化了,看不懂,但觉厉
作者: nvnv-sunny    时间: 2013-4-19 12:07

继续等待SONIC3D兄更新,万分期待。
作者: SONIC3D    时间: 2013-4-19 12:50

引用:
原帖由 nvnv-sunny 于 2013-4-19 12:07 发表
继续等待SONIC3D兄更新,万分期待。
这两天私人事务和公司工作挤破头了,等假期的时候来写完.不会烂尾:D




欢迎光临 TGFC Lifestyle (http://tgfcer.com/) Powered by Discuz! 6.0.0