主题 : 【分享】关于机战镜像隔断码的一些研究(附带机战F完结篇的静态修改探讨)
级别: 模拟名流
UID: 76310
精华: 10
发帖: 337
威望: 16 星
金钱: 4779 浮游币
贡献值: 0 点
好评度: 1042 点
人气: 0 点
在线时间: 168(时)
注册时间: 2005-11-02
最后登录: 2009-04-26
楼主  发表于: 2006-12-27 00:04

【分享】关于机战镜像隔断码的一些研究(附带机战F完结篇的静态修改探讨)

  近期看了一篇关于汉化PS游戏的教程,其中讲到关于PS镜像的隔断码的问题。现在我把它总结一下,希望对于制造修改器的人有些帮助。
  PS的镜像文件跟我们一般的CD文件有些不同,它除了有要使用的文件数据之外,还有很多的隔断码。如果我们用一款叫CDRWin的刻录软件来复制PS光碟的时候,就会发现PS光碟的扇区格式是Mode Form1 (Data)、Mode Form2 (Audio)、Mode Form2 (Empty)三种。对于Mode Form1 (Data),它是一种纠正能力很强的格式,其中包括了错误修正码ECC和错误侦测码EDC。每个扇区存放2048Byte的数据。而Mode Form2 则是一种纠错能力没有那么强的格式,这种格式只包含了EDC码而没有ECC码。这样一来,一个扇区就不仅仅是放2048个字节了。那它是怎么分布的呢?
  对于Mode2 Form1来说,每个扇区有2353个字节,其中同步字节12个、扇区标题4个、扇区子标题8个、用户数据2048个、EDC4个、ECC276个。因此细心的人会发现,机战的人物数据中会每隔一定字节数目就会出现一断的隔断码,其实那些隔断码就是“前一个扇区的EDC+前一个扇区的ECC+本扇区的同步字节+本扇区的标题+本扇区的子标题”,一共是304个字节。然后有2048字节的用户数据,之后有是304个字节的隔断码……如此类推。
  对于Mode2 Form2来说,每个扇区有2353个字节,其中同步字节12个、扇区标题4个、扇区子标题8个、用户数据2324个、EDC4个。其他说明跟Mode2 Form1类似。
  若这些隔断码被改动的话,对于VGS这些不能直接读取镜像文件的模拟器来说,就会因为数据校验不过而死机,而对于EPS这些可以直接读取镜像文件的模拟器来说,它本身会自动跳过那些隔断码,因此不会造成死机,但是如果把这个镜像文件刻录成碟拿到PS机上玩的话很可能会死机。因此也就是为什么我们建议打了补丁之后要用ECCregen来校验的原因了。
  鉴于以上的说明,我们做修改器的时候就有了一种新的思想。因为用虚拟光驱打开镜像文件然后把里面的文件复制出来的时候,是没有这些ECC、EDC之类的隔断码的,所以数据排列是非常整齐的,这对于制造修改器来说,就可以利用整齐这一点来制造。当文件被修改了之后再直接写入镜像文件中。写入的方法就是避开那些隔断码。刚才说过了,对于Mode2 Form1的用户数据是2048Byte,隔断码是304byte,因此我们写镜像文件的时候可以先找到文件的起始偏移地址,然后写入前2048个字节。之后在镜像文件中直接跳过304个字节,然后又写入2048个字节的数据,如此类推,直到写完。如果想直接从镜像文件中提取没有这些隔断码的数据,也可以先找到起始的偏移地址,然后提取2048个字节,之后偏移304个字节,然后再读取304个字节……

  我这几天发布的α和α外传的人物查看器就是用这种方法实现的。接下来我会继续研究写入的程序。
  以上的方法对于那些有大段隔断码的文件修改非常适用。至于对于那些仅仅有一个字节隔断码的,例如机体数据,暂时还没有找到解决的方法,但用上面的方法,却是可以提取到不含ECC和EDC大段隔断码的机体数据,比起以前来说应该修改更加方便。

  若有什么不明白可以跟帖,一起讨论。
[ 此贴被Triple-E在2006-12-27 15:36重新编辑 ]
本帖最近评分记录:
  • 金钱:10(Triple-E)
  • 金钱:10(Triple-E)
  • 金钱:10(Triple-E)
  • hyz
    级别: 模拟小生
    UID: 100148
    精华: 0
    发帖: 146
    威望: 0 星
    金钱: 149 浮游币
    贡献值: 18 点
    好评度: 428 点
    人气: 0 点
    在线时间: 90(时)
    注册时间: 2006-01-28
    最后登录: 2014-01-11
    沙发  发表于: 2006-12-29 12:22

    谢了,下来看看