Board logo

标题: [专题讨论] 问sonic3D老大一个关于MDrom的问题 [打印本页]

作者: zhqing    时间: 2012-4-25 15:39     标题: 问sonic3D老大一个关于MDrom的问题

老大你好,我看过你之前的一个关于md区码的帖子,是通过winHEX来操作的,但那个方法只适合那个帖子里的rom对于其他的rom似乎无效,我最近在研究“澎湃的电风”这个游戏,这个游戏的汉化版本是日版的只能在日版主机上运行,我希望能在美版主机上运行,你的方法无法修改,我在goodgen里看到有可以在美版主机上运行的日语rom,我萌生了自己修改rom的想法,本人程序员出身,对c语言也颇有心得,你在其他帖子里说可以通过分析代码的方法找出区域判断算法,但如何分析mdrom的代码呢?在那个AeroAcrobat2的帖子里,你是如何知道查找地址0x0000042A的呢?俗话说授人与鱼不如授人与渔,如果你有跟踪代码的资料还请多多指导,谢谢。
作者: ly63    时间: 2012-4-25 16:29

你的C语言经验在HACK ROM方面几乎无用武之地,MD的主CPU是M68000,指令集可不是Intel X86,还是BigEndian字节顺序。你需要掌握68K汇编语言、CPU寻址方式、Memory map方式等基础知识,以及合适的Debugger。
MD模拟器带Debugger的我不熟,FC、SFC的都很好用。

更改区域代码可参考国外先驱写的MDROM Format 文档,
区域代码在0x1F0处,日版为J,美版为U,欧版为E。
注意地址是无Header ROM(bin格式)的地址,.SMD格式有512字节的Header,而且还是Interleaved的ROM,所以修改之前最好先用Ucon64把ROM转换成bin格式再修改。
修改后也许需要修正ROM CRC,自己试验一下吧。

MD ROM Format文档:

http://www.zophar.net/fileuploads/2/10614uauyw/Genesis_ROM_Format.txt

[ 本帖最后由 ly63 于 2012-4-25 16:31 编辑 ]
作者: zhqing    时间: 2012-4-25 17:04

好的,我先看看,汇编我到也会一些,不过不常用估计已经忘光了。
作者: zhqing    时间: 2012-4-25 17:36

区域代码不是简单修改0x1F0就可以解决的,一些游戏是用程序校验的,要看懂代码才行,得找个好用的debugger
作者: Soviet所谓爱    时间: 2012-4-25 18:27

SONIC3D讲过澎湃的电风一事,一般游戏的区域检测码只需要三行,而这个写了五百行,你怎么能破解?

出于友情原因,SONIC3D特意在去年为我破解了此ROM,我电脑里好像还存着,如果你需要我发给你
作者: zhqing    时间: 2012-4-25 18:28

引用:
原帖由 Soviet所谓爱 于 2012-4-25 18:27 发表
SONIC3D讲过澎湃的电风一事,一般游戏的区域检测码只需要三行,而这个写了五百行,你怎么能破解?

出于友情原因,SONIC3D特意在去年为我破解了此ROM,我电脑里好像还存着,如果你需要我发给你
sozq@sohu.com
先发给我吧,我慢慢研究。
作者: zhqing    时间: 2012-4-25 18:30

能在美版主机上运行的日版rom我可以在goodgen里找到,但那个汉化版不行,如果你有能在美版主机的汉化版就发一个给我吧,谢谢
作者: Soviet所谓爱    时间: 2012-4-25 18:40

引用:
原帖由 zhqing 于 2012-4-25 18:30 发表
能在美版主机上运行的日版rom我可以在goodgen里找到,但那个汉化版不行,如果你有能在美版主机的汉化版就发一个给我吧,谢谢
已经给你了
作者: yangjuniori    时间: 2012-4-25 19:25

posted by wap, platform: SAMSUNG (Galaxy S II)

先把区域hack跟原版做个补丁  再把补丁打到汉化上?
作者: SONIC3D    时间: 2012-4-25 20:15

LD不是随便叫的....尽快改掉....以免我惹麻烦....  (- -

澎湃的电风,GoodGens里那个f1版的全区改法是错的,虽然不会导致问题,但是跳过了一大段初始化。
实际只要把0x00065331处的C0改为00就是全区了,这个字节的值供这个游戏判别允许运行的主机区码
整个流程比较晦涩:
ROM:77FA ; ---------------------------------------------------------------------------
ROM:77FA                 movea.l (a5),a0                  ;这里a5地址里的值为0x00A10001,是用来检测主机区码的I/O地址
ROM:77FC                 moveq   #0,d0
ROM:77FE                 move.b  (a0),d0                  ;从0x00A10001中取出主机区码到d0,取出的是一个字节
;                                         ;最高bit位用来区分海外/国内,次高bit位用来区分
ROM:7800                 rts                                          ;返回,到ROM:884C
ROM:7800 ; ---------------------------------------------------------------------------
为简化说明,省略部分代码,省略内容中,有一步是把d0寄存器复制到d7,也就是说接下来的代码中d7里是主机的区码制式值
ROM:8CEA ; ---------------------------------------------------------------------------
ROM:8CEA                 bsr.s   sub_8D04              ;跳到ROM:8D04处执行子过程,这个子过程实际就是把ROM:65331处的0xC0存到d0
ROM:8CEC                 and.l   d0,d7                       ;把d0中的值(不允许的区码掩码)同d7中的主机区码作位与操作,结果覆盖存入d7
;                                                                                  ;比如日版机,那么d7=0x20,和0xC0作与操作,那么就是这条指令后d7=0x00
;                                                                                  ;换成美版机,那么d7=0xA0,和0xC0作与操作,d7=0x80
;                                                                                  ;换成欧版机,那么d7=0xE0,和0xC0作与操作,d7=0xC0
;                                                                                  ;换成美版机,那么d7=0x60,和0xC0作与操作,d7=0x40
ROM:8CEE                 rts                     ; return to 81F4
ROM:8CF0 ; ---------------------------------------------------------------------------
最后在ROM:8CDE处,会比较d7是否为0,如果不是,那么接下去就认为区码错误,如果是0,那就认为跑在日版机上了,可以继续进入游戏主逻辑。

区码破解的经验:
区码破解的关键是找到游戏从0x00A10001这个I/O地址获取信息的代码点,因为获取的这个信息就是用来判断主机区码和主机版本(是否有TMSS BIOS)的依据。接下去就是纯粹68000的汇编代码阅读问题了。

通常游戏中,从0x00A10001获取数据,一般是写了硬编码的00A10001作为地址,用16进制编辑软件直接在ROM中找就很容易定位到,而且紧跟着的代码就可以看到明显的判断区码的分支,很容易就能修改,基本可以做到不需要动态调试器调试,只用查看静态反汇编就可以破解。包括上两周修改的那两个游戏也是如此,难点顶多就是要攻克一下68k的汇编。

不过澎湃的电风比较特殊,不适合用来练习这种破解,它一是没有用硬编码,而使用了很猥琐的步骤拼出了00A10001这个地址,放到寄存器中再间接寻址获取。第二是比较区码的时候没有直接对刚才获取出来的值作直接的区码判断制式判断,而是和一个事先指定的掩码作了位于,位于结果又在很远处才使用。使得整个破解过程必须借助动态调试器实时调试才能很好理解。
整个区码判断过程可以看出是日本程序员惯用的taskproc任务调度+状态机方式解决的,所以代码比一般游戏的区码判断来得繁琐。

区码破解的工具:
  动态调试器早期我喜欢用TommyXie写的Debugger,可以说是非常好用的Debugger,但是对于像澎湃的电风这样的特殊的就不太好处理了,因为它不能下任意地址的内存断点,这种情况下,我在去年下旬找到了另一个调试器,Regen 0.97D版,就很好,直接下一个00A10001的内存读取断点,然后让程序运行,很快就能定位到区码读取的位置,接下去再作进一步静态代码分析即可,但是这个调试器很不稳定,bug众多,在调试游戏逻辑方面要和TommyXie的结合使用比较好。
  静态调试器么就IDA了,没有二话了,史上最强反汇编器了。。。。

希望长文对你有用
作者: ly63    时间: 2012-4-25 21:35

刚刚我也正在找MD的Debugger,找到了Gens32、Regen 0.97D。
Gens32我一进Debugger功能就Crash,shit!
Regen的Debugger Build功能不错,只是它的Debugger窗口竟是个模式对话框,蛋疼......
还有不能临时取消断点,取消之后再进就消失........反汇编窗口不能上下滚动代码,非常不便。其它BUG还没有深入使用,还未发现。MD咋就没个像Fceux那么强大的Debugger呢,太郁闷了,真是难为那些搞汉化的HACKer了。

WII/NGC模拟器Dolphin的debug模式也非常蛋疼,拿它HACK游戏简直急死人,1FPS......还不支持内存断点
PSX的经常Crash;
SFC的还可以,但是没有Fceux的功能强大
作者: SONIC3D    时间: 2012-4-25 22:40

引用:
原帖由 ly63 于 2012-4-25 21:35 发表
刚刚我也正在找MD的Debugger,找到了Gens32、Regen 0.97D。
Gens32我一进Debugger功能就Crash,shit!
Regen的Debugger Build功能不错,只是它的Debugger窗口竟是个模式对话框,蛋疼......
还有不能临时取消断点, ...
Gens本身的Debugger功能就很好用,只是不能很方便下断点,这其实是因为gens的68000模拟底层starscream的一些实现问题造成的。而Gens后期放出的源代码中,却故意把Debugger功能阉割了一部分,导致直接编译程序不会出错但是没有调试功能,而强行开启后,程序运行经常非法操作。

不过有一些基于Gens的改版支持一些强化的Debug功能,比如Gens Kmod
但是总的来说都有很多不足。

最好的调试器应该数Kega Fusion的,但是早年泄露的一个可调试版本现在已经不知道在哪块硬盘里了,后来写信给作者snake,死活不给。。。也没办法

另外很多hack的用Mame改版或用现成的HazeMD进行调试也是有的。

就看怎么用顺手了。

[ 本帖最后由 SONIC3D 于 2012-4-25 22:44 编辑 ]
作者: SONIC3D    时间: 2012-4-25 23:09

引用:
原帖由 ly63 于 2012-4-25 16:29 发表
MD ROM Format文档:

http://www.zophar.net/fileuploads/2/10614uauyw/Genesis_ROM_Format.txt
这份文档我以前做过一份译本,一直扔在google docs里,墙着不方便,放附件里了
作者: zhqing    时间: 2012-4-25 23:12

多谢各位前辈,我这帖发的真值,又得游戏又长知识,sonic3D兄不厌其烦的讲解另人感动。soviet兄也多谢你了。我会多多钻研的。
作者: yzb    时间: 2012-4-26 00:39

O(∩_∩)O哈哈哈~
SONIC3D大大对MD软硬件是极其熟悉啊,又涨经验了...
作者: SONIC3D    时间: 2012-4-26 01:09

引用:
原帖由 yzb 于 2012-4-26 00:39 发表
O(∩_∩)O哈哈哈~
SONIC3D大大对MD软硬件是极其熟悉啊,又涨经验了...
O(∩_∩)O~
硬件完全不了解,软件纯凑合,68000的汇编还是比较好读的,寄存器少,指令少:D
作者: pig345    时间: 2012-4-28 10:57

打扰各位大牛,这里搭车问一下,MD的模拟器里面,有没有带 分层批量截图 功能的?能给推荐下?(网上不少游戏人物的gif动画,应该都是这样搞的吧。)
或者有什么debug工具能简单做到这一点的,麻烦能给说说,谢谢了。

[ 本帖最后由 pig345 于 2012-4-28 11:01 编辑 ]
作者: SONIC3D    时间: 2012-4-28 22:28

引用:
原帖由 pig345 于 2012-4-28 10:57 发表
打扰各位大牛,这里搭车问一下,MD的模拟器里面,有没有带 分层批量截图 功能的?能给推荐下?(网上不少游戏人物的gif动画,应该都是这样搞的吧。)
或者有什么debug工具能简单做到这一点的,麻烦能给说说,谢谢了 ...
以前dgen还有nemesis好像可以暂停模拟状态关闭特定Layer和Window,但是很久不用了。。。。
作者: pig345    时间: 2012-5-2 11:29

感谢楼上,我去看看
作者: finalarm    时间: 2012-5-3 13:17

高端。。。。吾辈路过而已




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