Я пытаюсь выяснить, на каких данных основано поле crc32 в заголовке RAR Запись восстановления . Я пытаюсь воссоздать том RAR на основе предыдущего тома RAR и извлеченного содержимого. Я дошел до того, что только 12 байтов отличаются от правильного / исходного объема.
Имена основаны на исходном коде unrar (arcread.cpp) или RAR technote .
Файл RAR состоит из блоков. У них есть заголовок и тело:
[header][body]
Заголовок содержит метаданные, которые описывают тело. Одним из этих блоков является HEAD_TYPE = 0x74 Заголовок файла (Файл в архиве).
[header:a...FILE_CRC...z][body]
Поле FILE_CRC (4 байта) рассчитывается для всех данных, доступных в [body], который является сохраненным или сжатым файлом.
Блок Recovery Record (HEAD_TYPE = 0x7a подблок) очень похож на файловый блок, но содержит три дополнительных поля в заголовке:
[header:a...FILE_CRC...z, "Protect+", rsc, dsc][body]
rsc: recovery sector count (4 bytes)
dsc: data sector count (8 bytes)
assert dsc*2 + rsc*512 == size([body])
Можно подумать, что FILE_CRC этого блока основана на данных в теле, как и блок файла, но это не так. (проверено независимо другим лицом)
Итак, мой вопрос, какие данные используются для расчета этого crc32?
Некоторые вещи, которые я уже пробовал:
- начиная с Protect + ect. затем тело
- все до начала субблока RR
- Я перебрал все возможные диапазоны в небольшом файле RAR.