Обратный инжиниринг параметров CRC32, имеющий доступ к нескольким примерам - PullRequest
0 голосов
/ 29 марта 2019

Я должен выяснить, как воспроизвести алгоритм CRC32, используемый в проприетарном файле базы данных, файл состоит из множества «кусочков» по ​​128 байт, каждый из которых является записью.Я знаю, что для каждой записи байты 1-4 являются контрольной суммой CRC32, и следующие 35 байтов, кажется, не имеют значения, так как я могу легко изменить их без приложения, сообщающего мне, что проверка CRC завершилась неудачно.Поэтому я хочу выяснить, какие полиномиальные и другие параметры используются для вычисления последних.Ниже приведен пример.

Real Example of a record Текстовая версия:

00 27 AE 3B 9F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 08 41 41 41 41 41 41 41 41 
19 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 
42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00

Если мы возьмем только те байты, которые мы не можем изменить, побив рекорд, мы получим следующее:

41 08 41 41 41 41 41 41 41 41 19 42 42 42 42 42 42 42 42 42 42 42 42 42 42 
42 42 42 42 42 42 42 42 42 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00

CRC32 для вышеприведенного: 27 AE 3B 9F

Пример реальной записи 1.1, отличающийся только на один байт от приведенного выше (CRC равен BC D4 84 FB ):

41 08 41 41 41 41 41 41 41 41 19 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 
42 42 42 42 42 42 42 42 42 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00

Пример реальной записи 2 (CRC вывода 3B 6A D1 AF ):

41 07 41 41 41 41 41 41 41 00 19 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 
42 42 42 42 42 42 42 42 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00

Пример реальной записи 3 (CRC вывода 0B 54 CC 09 ):

41 01 31 00 00 00 00 00 00 00 03 41 73 61 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00

Пример реальной записи 4 (Выходной CRC равен 12 91 EA 8E ):

41 B4 A8 D0 02 46 00 B4 A8 00 03 52 4D 31 03 53 54 50 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 25 00 00 00 00 00 00 00 
00 00 A3 05 00 00 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 
00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Пример реальной записи 5 (Выходной CRC равен 8A 68 00 3B ):

41 B4 A8 D0 02 46 00 B4 A8 01 03 52 4D 31 03 53 54 50 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 25 00 00 00 00 00 00 00 
00 00 A3 05 00 00 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 
00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 64 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Две последние записи отличаются только одним байтом.Используя указанный подход @rcgldr, я смог получить окончательное значение Xor 0x9902539d , и я мог успешно изменять данные без жалоб приложения.Я запустил некоторый код, чтобы найти эти окончательные значения xor для каждого права доступа / файла в приложении и был успешным для всех из них, но возможность найти один набор параметров crc была бы отличным дополнением.

РЕДАКТИРОВАТЬ:Добавлены еще две записи примеров

РЕДАКТИРОВАТЬ 2: Добавлен еще один пример, который отличается от одного байта только по сравнению с первым

РЕДАКТИРОВАТЬ 3: Добавлены еще два примера с другим размером, так как ихиз другого типа записи в приложении.Также удалена часть вопроса, так как она стала неактуальной

1 Ответ

0 голосов
/ 30 марта 2019

xor'ing 1.0 и 1.1 приводит к:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00

xor'ing двух crcs приводит к

9b 7a bf 64

Если предположить, что для сохраненной КРК используется «младший порядок», рассчитанная КРК составляет

0x64bf7a9b

Путем xor'ing двух записей начальное значение и окончательное значение xor отменяются из-за xor, что позволяет определять многочлен crc на основе одних только данных, предполагая, что начальное значение = 0 и что конечное значение xor = 0. Воспользовавшись этим, я попробовал некоторые общие полиномы crc и определил, что полином crc равен

0x104C11DB7 or ignoring the msb: 0x04C11DB7

Используя этот веб-сайт, который вы указали в своем комментарии:

http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

Параметры:

crc32
custom
input:  not reflected
result: not reflected
polynomial: 0x04C11DB7
initial value: 0x0
final xor value: 0x0

Если данные всегда имеют одинаковый размер, то для настройки CRC можно использовать либо начальное значение, либо конечное значение xor, либо их комбинацию, чтобы она соответствовала фактическим значениям CRC, показанным в примерах, но это проще всего. использовать конечный xor для сопоставления с примерами, так как для этого просто требуется вычислить crc с одним из примеров, предполагая, что начальное значение = 0, а конечное значение xor = 0, а затем xor'ing вычисленного crc с фактическим crc из примера crc. вычислить окончательное значение xor для определенной длины данных.

Таким образом, для размера данных в первых примерах конечное значение xor 0x189B52BC будет давать значения crc, соответствующие примерам. Это параметры для калькулятора CRC.

crc32
custom
input:  not reflected
result: not reflected
polynomial: 0x04C11DB7
initial value: 0x0
final xor value: 0x189B52BC

Эти параметры соответствуют всем первым опубликованным вами примерам. Опять же, обратите внимание, что CRC хранятся в «младшем порядке», в первую очередь старший байт.

Если размер данных является переменным, то требуется начальное значение (и возможно, что используются как начальное значение, так и конечное значение xor). Как только полином известен, можно выполнить «обратный» CRC, чтобы найти начальное значение, или можно использовать поиск методом грубой силы. Я произвел поиск начального значения методом грубой силы с помощью быстрого калькулятора crc (поскольку у меня еще нет «обратной» программы CRC), и оказалось, что он будет работать при любом размере данных, по крайней мере, на основе новых примеров. Вы добавили. Эти параметры работают со всеми приведенными выше примерами, включая новые, которые вы добавили:

crc32
custom
input:  not reflected
result: not reflected
polynomial: 0x04C11DB7
initial value: 0xc704dd7b
final xor value: 0x0

Начальное значение 0xc704dd7b - это crc, сгенерированный с шаблоном данных {ff ff ff ff}, с начальным значением = 0 и конечным значением xor = 0. Это то же самое, что префикс данных с {ff ff ff ФФ}.

...