0

RAR回復レコードのヘッダーにある crc32 フィールドがどのデータに基づいているかを調べようとしています。以前の RAR ボリュームと抽出した内容に基づいて RAR ボリュームを再作成しようとしています。正しい/元のボリュームとは 12 バイトしか違わないところまで来ています。

名前はunrar ソース コード(arcread.cpp) またはRAR 技術情報に基づいています。

RAR ファイルはブロックで構成されています。ヘッダーと本文があります。

[header][body]

ヘッダーには、本文を説明するメタデータが含まれています。これらのブロックの 1 つが HEAD_TYPE=0x74ファイル ヘッダー(アーカイブ内のファイル) です。

[header:a...FILE_CRC...z][body]

フィールド FILE_CRC (4 バイト) は、保存または圧縮されたファイルである [本体] で使用可能なすべてのデータで計算されます。

Recovery Recordのブロック(HEAD_TYPE=0x7a サブブロック) はファイル ブロックに非常に似ていますが、ヘッダーに 3 つの追加フィールドが含まれています。

[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ファイルで可能なすべての範囲をブルートフォースしました。
4

1 に答える 1

1

デフォルトのシード (-0x1 または 0xFFFFFFFF) を使用する代わりに:

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

F が削除されました (-0x10000000):

crc = crc32(data, ~0x0fffffff)

著者に電子メールが送信され、次の応答がありました。

RARコードをすばやく調べた限り、これはすべてのCRC16データとすべての回復記録パリティセクターのCRC32です(リストの「すべてのRRデータ」)。

RAR はこのチェックサムを保存しますが、どこにも使用しないことに注意してください。リカバリ時は不要です。リカバリ レコードが部分的に破損している場合でも、その有効な部分を使用してデータをリカバリできます。CRC16 を使用してセクターごとに修復の成功を確認できるため、回復プロセスですべてのデータをカバーする 1 つの CRC32 は必要ありません。

ユージーン

最初に考えたように、ブロックの FILE_CRC は本体のデータに基づいています。RAR コードのどこかにタイプミスがあるようです。

TheUnarchiver2.7.1_src の XADRARParser.m には、次のコメント付きコードがあります。

    // 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)
于 2011-11-23T01:34:17.210 に答える