查找使用哪个校验和

时间:2011-09-04 09:33:20

标签: c++ checksum crc

与其他一些人一起,我们正试图为游戏制作一个Savegameeditor,但我们遇到了一些问题。 savegame文件包含一种校验和,我们似乎无法找到使用哪个校验和。直到现在我们所知道的是:

  • 校验和为32位
  • 在9个不同的已保存游戏之间,除了5个字节(在文件中传播)之外,存档游戏数据完全相同,校验和被发现在1834565-1851372之间,当被解析为未指定长。请注意,每保存5个字节的每个保存都是增加的数字(大多数是大约+8),但校验和不是增加的线性空间。
  • 校验和似乎依赖于位置,因为游戏在切换2个字节时声明文件已损坏
  • 我尝试了一些校验和,并得出结论它似乎不是Sum32,addler32,DJB2和CRC32,因为它们似乎都没有接近保存游戏中包含的校验和。似乎最接近包含在savegames中的校验和的校验和似乎只是将所有字节添加到unsigned long,它返回一个大约~2507737的值。

我想知道是否有更好的方法来查找这些文件使用哪个校验和,或者是否有人知道找出使用哪个校验和的任何提示。我目前正在尝试一些我在C ++程序中的不同站点上找到的校验和。也许重要的是要知道游戏是从2004年开始,而在其他文件中它使用DJB2进行字符串哈希。根据其他人的说法,.exe似乎正在使用CRC32检查。

编辑1:一段时间后,我设法获得了同一文件的924个不同版本,除了2个字节,每个保存都有所不同,我还得到了这些文件的校验和,看看它是如何反应的在这些变化上,我列出了这个。 (请注意,我不能手动对文件进行更改,游戏只是对其进行校验和,每次我保存文件时它将+2添加到包含不同数字的无符号长整数,这就是我创建列表的方式。)< / p>

请参阅下面列表的一部分(924中的50条记录):

>         The bytes         Checksum (as Hex and unsigned long)
>         -----------------------------
>         0x 0 0x18 0x 0    0x13DFA 81402
>         0x 0 0x19 0x 0    0x13F76 81782
>         0x 0 0x1A 0x 0    0x1406D 82029
>         0x 0 0x1B 0x 0    0x14114 82196
>         0x 0 0x1C 0x 0    0x13EC5 81605
>         0x 0 0x1D 0x 0    0x13790 79760
>         0x 0 0x1E 0x 0    0x143C1 82881
>         0x 0 0x1F 0x 0    0x13ED0 81616
>         0x 2 0x18 0x 0    0x13D02 81154
>         0x 2 0x19 0x 0    0x13ABD 80573
>         0x 2 0x1A 0x 0    0x14271 82545
>         0x 2 0x1B 0x 0    0x13E39 81465
>         0x 2 0x1C 0x 0    0x140FC 82172
>         0x 2 0x1D 0x 0    0x13FFE 81918
>         0x 2 0x1E 0x 0    0x1413B 82235
>         0x 2 0x1F 0x 0    0x13A5F 80479
>         0x 4 0x18 0x 0    0x138F2 80114
>         0x 4 0x19 0x 0    0x141AE 82350
>         0x 4 0x1A 0x 0    0x13E91 81553
>         0x 4 0x1B 0x 0    0x13F67 81767
>         0x 4 0x1C 0x 0    0x13C6C 81004
>         0x 4 0x1D 0x 0    0x13F4E 81742
>         0x 4 0x1E 0x 0    0x13BB8 80824
>         0x 4 0x1F 0x 0    0x1398D 80269
>         0x 6 0x18 0x 0    0x146C0 83648
>         0x 6 0x19 0x 0    0x139B5 80309
>         0x 6 0x1A 0x 0    0x13FAC 81836
>         0x 6 0x1B 0x 0    0x13E71 81521
>         0x 6 0x1C 0x 0    0x14162 82274
>         0x 6 0x1D 0x 0    0x13D55 81237
>         0x 6 0x1E 0x 0    0x13BE8 80872
>         0x 6 0x1F 0x 0    0x13B72 80754
>         0x 8 0x18 0x 0    0x142FE 82686
>         0x 8 0x19 0x 0    0x13E07 81415
>         0x 8 0x1A 0x 0    0x14923 84259
>         0x 8 0x1C 0x 0    0x13D3E 81214
>         0x 8 0x1D 0x 0    0x14420 82976
>         0x 8 0x1E 0x 0    0x13BEE 80878
>         0x 8 0x1F 0x 0    0x145F5 83445
>         0x 8 0x1F 0x 0    0x145F5 83445
>         0x A 0x18 0x 0    0x13CB6 81078
>         0x A 0x19 0x 0    0x142FB 82683
>         0x A 0x1A 0x 0    0x13EB2 81586
>         0x A 0x1B 0x 0    0x13C14 80916
>         0x A 0x1C 0x 0    0x13915 80149
>         0x A 0x1D 0x 0    0x14100 82176
>         0x A 0x1E 0x 0    0x14310 82704
>         0x A 0x1F 0x 0    0x13B34 80692
>         0x C 0x18 0x 0    0x142AE 82606
>         0x C 0x19 0x 0    0x14091 82065

我仍然看不到那些变化的字节和校验和之间的模式,所以我想知道其他人是否可能在这些之间看到模式?或者也许是一种如何在它们之间找到模式的技术。如果有人可以帮我解决这个问题,我也可以发布完整列表的链接(如Microsoft Excel或TXT格式)

1 个答案:

答案 0 :(得分:7)

最简单的方法可能是获取OllyDbg之类的调试器,找到校验和代码并对其进行反向工程。不是说它是 easy ,因为它可能会相当困难。但是在我看来,通过查看数字来进行逆向工程甚至简单的校验和是接近于不可能性,除非你有一个具有超人能力的高功能自闭症朋友看到模式 - 也许甚至不是。

你当然可以幸运地拥有一个使用标准的,众所周知的校验和来检测腐败的游戏。但如果他们的目标是防止篡改(这很可能),那么如果他们有任何线索,他们就不会使用标准校验和。

这是一个来自crackme的校验和算法我正在娱乐自己:

checksum algorithm

我当然不能仅仅通过查看输出来猜测这段代码:

uint sum = 0;
for (uint i = 0; i < 478; i++)
    sum = rol((((buf[i + 22] | 0xFFFFFF00u) + i) ^ (478 - i)) - sum + 0x272E4745u, 3);

此代码中有一个单独的校验和算法,它使用符号扩展而不会使用or 0xFFFFFF00完全删除它 - 您是否在搜索中考虑过这样的操作?搜索空间太大了,无法猜测......