» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[专题讨论] 问sonic3D老大一个关于MDrom的问题

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了,没有二话了,史上最强反汇编器了。。。。

希望长文对你有用


本帖最近评分记录
  • yzb 激骚 +6 精品文章 2012-4-26 00:41

TOP

引用:
原帖由 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 编辑 ]



本帖最近评分记录
  • zhaolinjia 激骚 +1 最骚 Rated by wap 2012-4-26 11:44

TOP

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

http://www.zophar.net/fileuploads/2/10614uauyw/Genesis_ROM_Format.txt
这份文档我以前做过一份译本,一直扔在google docs里,墙着不方便,放附件里了
附件: 您所在的用户组无法下载或查看附件


TOP

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

TOP

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

TOP

发新话题
     
官方公众号及微博