Реверс Инжиниринг CRC 32 в прошивке - PullRequest
0 голосов
/ 28 мая 2019

У меня есть p-вспышка (размер около 700 КБ), в этой вспышке есть CRC32.Я знаю, где он находится, и я знаю метод расчета CRC (полином, начальное значение, конечное значение Xor, отраженные входные и выходные данные), проблема в том, что только часть этих 700 КБ используется для вычисления CRC.И я не знаю, какая часть.Есть ли способ узнать входные данные для расчета?У меня есть 5 из этих 700kb файлов.Все файлы одинаковы, за исключением 4 разных байтов и 4 байтов crc.

1 Ответ

0 голосов
/ 29 мая 2019

Если вы можете получить файлы на ПК, это поможет.Вы можете xor любых двух файлов, чтобы получить файл, который имеет все нули, за исключением 4 разных байтов и 4 байтов CRC.Xor двух файлов также удалит любое начальное или конечное значение xor, как если бы начальное значение = 0, а конечное значение xor = 0. Затем проверьте файл с почти всеми нулями, чтобы увидеть, соответствует ли CRC тому, что вы ожидаете.Если он совпадает, то вы знаете, что CRC включает в себя 4 ненулевых байта и все последующие нулевые байты, но вы не знаете, как далеко до 4 ненулевых байтов, которые CRC включает в свой расчет, ноэто будет по крайней мере, начало.Если он совпадает, это уменьшило бы объем поиска того, что включено в вычисление CRC.

Предполагая, что часть, используемая для CRC, является смежной, вы можете выполнить поиск методом грубой силы, используя быстрый CRC32.На X86 с регистрами SSE2 (xmm) CRC32 на основе сборки может вычислять CRC32 для 700 000 байтов за 0,0002 секунды на процессоре Intel 3770K 3,5 ГГц 3-го поколения (теперь они быстрее) или чуть больше 70 секунд.чтобы попробовать длины от 8 до 700 000 байт.

Я преобразовал код из этого примера github в Visual Studio asm как для отраженного, так и неотраженного CRC, используя полиномы CRC32 и CRC32C, и я мог бы загрузить код, еслизаинтересован.

https://github.com/intel/isa-l/blob/master/crc/crc16_t10dif_01.asm

...