Нахождение какой контрольной суммы используется - PullRequest
11 голосов
/ 04 сентября 2011

Вместе с некоторыми другими людьми мы пытаемся сделать Savegameeditor для игры, но мы столкнулись с некоторыми проблемами. Файлы savegame содержат своего рода контрольную сумму, из которой мы не можем найти, какая контрольная сумма используется для этого. До сих пор мы знаем только:

  • Контрольная сумма 32 бит
  • Между 9 различными сохраненными играми, в которых данные сохраненных игр в точности совпадают, за исключением 5 байтов (которые распределены по файлу), контрольная сумма оказалась между 1834565 - 1851372, когда анализируется как неисследованный длинный. Обратите внимание, что при каждом сохранении этих 5 байтов каждое сохранение является увеличенным числом (в основном примерно на +8), но контрольная сумма не увеличивается.
  • Контрольная сумма, кажется, зависит от позиции, так как игра объявляет файл поврежденным при переключении 2 байтов
  • Я попробовал несколько контрольных сумм и пришел к выводу, что это не Sum32, addler32, DJB2 и CRC32, потому что ни одна из них, похоже, не приблизилась к контрольным суммам, включенным в savegames. Похоже, что контрольная сумма, которая ближе всего подходит к контрольной сумме, включенной в сохраненные игры, похоже, просто добавляет все байты к длинному без знака, что возвращает значение около ~ 2507737.

Мне было интересно, есть ли лучший способ узнать, какая контрольная сумма используется для этих файлов, или кто-то знает какие-либо советы, чтобы узнать, какая контрольная сумма используется. В настоящее время я просто пробую некоторые контрольные суммы, которые я нашел на разных сайтах в программе на C ++. Возможно также важно знать, что игра с 2004 года, и в других файлах она использовала DJB2 для строковых хэшей. По мнению других людей, .exe, похоже, использует проверку CRC32.

Редактировать 1: Через некоторое время мне удалось получить 924 разных версий одного и того же файла, за исключением 2 байтов, которые меняются при каждом сохранении, и я также получил контрольные суммы этих файлов, чтобы увидеть, как он реагировал на эти изменения, и я составил список об этом. (Обратите внимание, что я не могу вручную вносить изменения в файл, и игра просто создает для него контрольную сумму, каждый раз, когда я сохранял добавленный файл +2 к длинной без знака, содержащей переменное число, так я и создал список.)

См. Часть списка ниже (50 записей из 924):

>         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 Ответ

7 голосов
/ 08 сентября 2011

Действительно, самый простой способ - это получить отладчик, такой как OllyDbg , найти код контрольной суммы и выполнить его обратный инжиниринг. Не сказать, что это просто , потому что это, вероятно, будет довольно сложно. Но, по моему мнению, обратная инженерия даже простых контрольных сумм, просто смотря на цифры, граничит с невозможностью, если только у вас нет высокофункционального друга-аутиста со сверхчеловеческими способностями видеть шаблоны - ndash; возможно, даже тогда.

Конечно, вам может повезти иметь игру, которая использует стандартную, хорошо известную контрольную сумму для выявления коррупции. Но если бы их целью было предотвратить вмешательство (и это вполне вероятно), то они бы не использовали стандартную контрольную сумму, если бы имели какое-либо представление.

Вот алгоритм контрольной суммы от 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 - вы бы рассмотрели такую ​​операцию в своем поиске? Пространство поиска слишком велико, чтобы его угадать ...

...