一直在尝试解决这一问题,并永远感谢拥有更多校验和算法经验的人。现在有2个游戏很久了。但是,此保存受到似乎是三重双向校验和的保护。

如果您好奇的话,该游戏是Fire Pro Wrestling Return。幸运的是,我已经绘制了相当数量的保存数据,并且其中很多是玩家可以轻松影响自己的东西(因为其中很多是用户创建的角色),这大有帮助。 />我已经有了以下数据: br />
紧接着这888 kb,总共有4580字节的校验和,分为三个块。保存文件后,表明校验和的工作方式如下:

第一个块是3552字节,由888个4字节的校验和组成,每个校验和为888 KB的保存数据。已通过更改单个字节对此进行了测试和验证。似乎它们彼此之间并不是互相配合的-到最后有几个块,我能够使两个块彼此相同,并且它们具有相同的校验和。因此,希望这意味着每个块都是在真空中计算的,而不是取决于以前的结果。

第二个块是1024字节,似乎是主保存数据的横向校验和(因此,此校验和的第一个字节是每个888个“ 1 kb块”保存数据的第一个字节的校验和)。我已经通过在各个位置更改单个字节来测试并看似验证了这一理论,并且能够完全预测结果将更改哪些校验和字节。

第三块是另一个4字节校验和。由于第一校验和块是将1024字节的数据转换为4字节校验和的校验和,而第二校验和的整个第二块都是1024字节,因此我在这里猜测这是通过对第二个校验和块,使用的算法与块1相同。第二个是我的输入受限的地方,因为并非所有保存文件都易于操作,并且要取用它的所有部分。块1:

BB 6B 82 F3 = all zeroes  
68 8D C8 0C = 01 followed by all zeroes  
B4 D9 DC B4 = 02 followed by all zeroes  
DF 5F 6E 0D = all zeroes with 01 at 0x60  
78 DF C3 08 = all zeroes ending with 01 


我的问题是,以二进制,十六进制或十进制形式查看它,我只是找不到任何可识别的模式。我已经开始尝试对它的汇编程序进行逆向工程,看看我是否可以那样找到算法,但是考虑到软件的大小(以及PS2多核体系结构可能或可能会

我在映射第二个校验和方面做的工作较少,但是我尝试通过加或减一个来更改其中的一个字节,在大多数情况下,校验和仅改变了一个步骤(尽管方向不同),但是现在我专注于第一个算法,因为那是那种感觉就像更大的头部抓痒器的算法。

如果提供更多实验数据有帮助,我可以很乐意这样做。 =)

虽然最终结果肯定是我着手进行此工作的原因,但我主要不是对解决方案感兴趣,而是对了解实现方法的兴趣。 br /> UPDATE:
感谢一些非常有用的评论,尽管我不确定自己找到了正确的代码,但我已经进行了一些调试设置...我在保存游戏时记录了所有内容(因为它d需要构建校验和以便在加载时进行比较),并使用子例程查找重复的代码块。我正在尝试学习如何解决这个问题。例如,在我的日志中此块重复了104次(这是部分负载,而不是全部,因为我没有今天早上上班前没有很多时间),尽管我需要将其翻译成伪代码以查看它是否相关:

再次编辑:

当我得到一个计划时是时候坐下来了,希望今晚可以拿一个我知道可以用的保存文件,然后在第一个块的第三个校验和中引入一个错误,然后用调试器再次运行加载序列以查看失败的地方看看是否可以缩小第一个校验和块以及所涉及的例程。

评论

我会尝试逆转游戏本身。

我已经给出了一个粗略的尝试来分解它,但是可悲的是,这并不是我的经验,所以我一直无法找到有用的信息,例如保存内存寄存器的日志等,这可能是找出哪些步骤的必要条件。它在计算/确认校验和时进行。如果这可能是较轻松的操作方法,那么我很乐意提供有关如何以合理有效的方式进行操作的建议。
看起来只有1个Playstation 2调试器可能会在romhacking.net/utilities/617上给它一个镜头,一旦您看到英语的组合件:P确定校验和将是小菜一碟。它带有R5900调试器,可以很好地找到校验和并使用汇编代码编辑您的问题。

感谢您的带头。我将深入研究它,然后看看我能想到什么。 =)

添加了一些额外的信息。从今天早上开始,我有几MB的MIPS日志,但是我需要对其进行深入研究,以学习过滤与此相关的内容...

#1 楼

像其他人一样,我建议尝试获取用于计算校验和的汇编代码。如果您发现其余的内容很容易。

但是有时候很难做到,因此这里是一些无需任何代码即可对工程校验和进行反向工程的技巧。 br />
请记住,校验和算法是工程师的设计选择,因此请考虑可能导致此选择的约束条件和实践。


硬件,因此效率可能是一个问题-没有人愿意等待2分钟来保存/加载游戏。这意味着比复杂的分支,乘法,除法或涉及浮点数的任何事物,移位,XOR和查找表的可能性要大得多。该算法也很可能对数据进行一次遍历。
该算法可能与同一工作室或同一程序员在其他游戏中的校验和算法相同或不同。
可能是一种现成的算法(例如MD5,它是1991年设计的,因此早于游戏)
该算法可能基于Sony发行或在游戏设计书中出版的校验和准则
显然,游戏的发行日期对于调查该领域至关重要。



熟悉最重要的校验和/哈希算法,尤其是流行的算法


严格来说,该算法是一个哈希函数,因为纯文本中的微小更改会完全更改哈希值。
请尝试使用在您的数据上创建游戏的时间(例如MD5),并查看是否匹配。执行此操作时请小心代码中的错误(例如,将诸如字符串'\ x00'发送到哈希函数而不是NUL字节的愚蠢错误)
了解通用哈希函数的工作原理有助于您猜测未知哈希函数的工作原理。如果此算法是内部开发的,则可能会比当今的主要哈希函数更简单-或者它可能与MD5完全相同,但使用不同的常量。逆向工程非常困难,尤其是如果您无法自动运行数百万个测试用例时。
许多哈希算法(包括MD5和SHA-1)仅对数据进行一次传递。 MD5和SHA-1均以64字节的块处理消息。
对于我们正在反转的算法,这是正确的,这意味着对消息的最后两个块的更改可能会产生最多的信息,早期块更改的影响可能很快就会“乱码”。例如,您可能想在消息的最后一块进行1位更改,并查看其异或,然后对消息的倒数第二块进行1位更改,然后再次对消息进行第二位更改。在最后一块中进行相同的1位更改,并查看其异或。或者,您可以对最后一块进行很多1位更改,然后查看是否有任何模式。请注意,MD5和SHA-1都在消息末尾附加了一个额外的位,在这种情况下,这将在末尾添加整个额外的块,这会使事情变得复杂。



也许有人已经做到了?


谷歌搜索您提供的全0哈希值,我发现了这一点:http://www.fireproclub.com/forum/viewtopic.php ?f = 12&t = 1860

看起来好像不是他们想出来的,但也许其他人有(并可能将其放入开源工具中),或者您可以与游戏中的程序员联系团队,问他们等等。



倒车愉快!

评论


除了破解游戏可执行文件外,最简单的开始可能是找到给出错误校验和错误消息的代码,然后向后调用该代码。然后,您可以修补代码,使其不再因该错误而终止。

– Paddywhacker
2014-09-26 8:51