查找使用哪个校验和

Joe*_*oey 11 c++ checksum crc

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

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

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

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

请参阅下面列表的一部分(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
Run Code Online (Sandbox Code Playgroud)

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

Rom*_*kov 7

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

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

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

校验和算法

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

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

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