На каких данных основан FileCRC в NEWSUB_HEAD записи восстановления RAR? - PullRequest
0 голосов
/ 14 ноября 2011

Я пытаюсь выяснить, на каких данных основано поле 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.

1 Ответ

1 голос
/ 23 ноября 2011

Вместо использования начального числа по умолчанию (-0x1 или 0xFFFFFFFF):

crc = crc32(data)
crc = crc32(data, ~0xffffffff)

был сброшен F (-0x10000000):

crc = crc32(data, ~0x0fffffff)

Письмо автору было отправленосо следующим ответом:

Насколько я могу быстро увидеть код RAR, это CRC32 всех данных CRC16 и всех секторов четности записей восстановления («Все данные RR» в вашем списке).

Обратите внимание, что хотя RAR хранит эту контрольную сумму, он нигде не использует ее.Это не нужно при восстановлении.Даже если запись восстановления частично повреждена, ее действительные части все еще можно использовать для восстановления данных.Мы можем проверить успешность восстановления для каждого сектора, используя CRC16, поэтому один CRC32, охватывающий все данные, не требуется в процессе восстановления.

Eugene

Как и предполагалось, FILE_CRC объектаБлок основан на данных в теле.Похоже, что где-то в коде RAR есть опечатка.

XADRARParser.m из TheUnarchiver2.7.1_src имеет следующий закомментированный код:

    // Removed CRC checking because RAR uses it completely inconsitently
/*  if(block.crc!=0x6152||block.type!=0x72||block.flags!=0x1a21||block.headersize!=7)
...

Почти 3 года спустя я узналчто кто-то другой уже нашел решение этой проблемы ранее в этом году .

# Why is this odd CRC initialiser used?
crc = crc32(rr_crcs, 0xF0000000)
...