目次
7zip アーカイブのリカバリー
破損した7zアーカイブを回復する方法
7-Zipの最新バージョンを試す
7-Zipの最新バージョンが7zアーカイブの問題を解決できる可能性があります。7-Zipの最新版をダウンロードして、その新しいバージョンを使用するようにしてください。最新のアルファ版またはベータ版も試すことができます。新しいバージョンでも解決しない場合は、このマニュアルを読んでください。
必要なソフトウェア
- 7-Zip(最新版、安定版、アルファ版またはベータ版)
- FARマネージャなど、16進ビューアまたはエディタを含むプログラム。
7zアーカイブ構造
7zアーカイブは、4つの主なデータブロックで構成されています。
- 開始ヘッダ(32バイト):署名と終了ヘッダへのリンクが含まれています。
- ファイルの圧縮データ
- ファイル用の圧縮メタデータブロック:圧縮データへのリンク、圧縮方法に関する情報、CRC、ファイル名、サイズ、タイムスタンプなどが含まれています。
- 終了ヘッダ:それは圧縮メタデータブロックへのリンクを含む。
注:7zアーカイブに暗号化なしのファイルが1つしか含まれていない場合、7-Zipはそのファイルのメタデータを非圧縮形式でEnd Headerに格納します。その場合、メインブロックは3つだけです。
アーカイブ例
アーカイブ例:LZMA方式で圧縮された5つのファイルを含むa.7z(3740バイト)。
アーカイブの開始
0000000000: 37 7A BC AF 27 1C 00 04 5B 38 BE F9 59 0E 00 00 0000000010: 00 00 00 00 23 00 00 00 00 00 00 00 7A 63 68 FD 0000000020: 00 21 16 89 6C 71 3D AB 7D 89 E6 3C 2E BE 60 24
00: 6 バイト: 37 7A BC AF 27 1C - 署名 06: 2 バイト: 00 04 - フォーマットバージョン 08: 4 バイト: 5B 38 BE F9 - 次の12バイトのCRC 0C: 8 バイト: 59 0E 00 00 00 00 00 00 - エンドヘッダの相対オフセット 14: 8 バイト: 23 00 00 00 00 00 00 00 - エンドヘッダの長さ 1C: 4 バイト: 7A 63 68 FD - エンドヘッダのCRC
終了ヘッダの相対オフセットは、開始ヘッダの末尾からの相対オフセットです。
それはオフセット0x20(10進数で32)です。
サンプルアーカイブのエンドヘッダーの実オフセット= 0x20 + 0x0E59 = 0x0E79
20:00 21 16 89 ... - 圧縮データの開始
注:ファイルがLZMA方式で圧縮されている場合、最初のバイト
最初のバイトが00でなければ、archiveは
別の方法(LZMA2またはAESによる暗号化データ)
アーカイブの終わり
終了ヘッダ(オフセット= 0x0E59、長さ= 0x23)
0000000E70: 17 06 8D AD 01 09 80 0000000E80: AC 00 07 0B 01 00 01 23 03 01 01 05 5D 00 10 00 0000000E90: 00 0C 81 1A 0A 01 3C 70 52 F7 00 00
終了ヘッダの最初のバイトに可能な値:
17 - End HeaderにMetadata Blockへのリンクが含まれています。 01 - メタデータブロックはEnd Headerに格納されます。
破損の種類
アーカイブが破損している場合が考えられます。
アーカイブを開くことができ、ファイルのリストを見ることができますが、ExtractまたはTestコマンドを押すと、いくつかのエラーがあります。データエラーまたはCRCエラー。
アーカイブを開くと、「ファイル 'a.7z'をアーカイブとして開くことができません」というメッセージが表示されます。
パソコン・スマホ・タブレット設定・IoT家電のお困りごとを解決!全国対応 G・O・G
破損事例:アーカイブ内のファイルのデータエラーまたはCRCエラー
ここでは、あなたがアーカイブを開くことができ、ファイルのリストを見ることができる場合について説明しますが、あなたが抽出またはテストコマンドを押すと、いくつかのエラーがあります:データエラーまたはCRCエラー。
その場合、データを回復することはかなり困難です。
アーカイブが「ソリッド」モードで圧縮されていて、アーカイブからいくつかのファイルの正確なコピーがある場合は、同じ設定で同じ順序で正しいコピーのファイルを使用して類似のアーカイブを作成します。別のgood.7zからの「良い」部分。あなたは悪いアーカイブと良いアーカイブのファイルのリスト、 “test”コマンドのログを見て、悪い部分を置き換える方法を考えなければなりません。
その汚職事件に関するここでの指示はこれ以上ありません。
破損事例:ファイル 'a.7z'をアーカイブとして開くことができません。
アーカイブを開いたり解凍しようとしたときに「ファイル 'a.7z'をアーカイブとして開くことができません」というメッセージが表示された場合は、7-Zipがアーカイブの最初または最後からヘッダーを開けないことを意味します。
その場合は、アーカイブを16進エディタで開き、開始ヘッダと終了ヘッダを確認する必要があります。
考えられるケース
- ケース:アーカイブの開始が破損している場合は、End Headerへのリンクがありません。しかし、End HeaderがOKで、アーカイブのサイズも正しい場合は、16進エディタのStart Headerのデータを次の値に置き換えることができます。
0000000000: 37 7A BC AF 27 1C 00 04 00 00 00 00 00 00 00 00 0000000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
それからあなたが開くことができて、あなたがファイルのリストを見るならば、アーカイブを開くことを試みなさい、テストまたは抽出コマンドを試みなさい。このページの「データエラーまたはCRCエラー」も参照してください。
- ケース:開始ヘッダーと終了ヘッダーは問題ありませんが、アーカイブの合計サイズは問題ありません。開始ヘッダーの値から正しいアーカイブサイズを計算できます。それから正しいサイズを回復する必要があります。アーカイブのどこかにデータを挿入したり、データを削除したりすることができます(例えば、アーカイブの終了前に数MBのオフセットがある場合)。
たとえば、マルチボリュームアーカイブがある場合:a.7z.001、…、a.7z.009が、a.7z.008の一部が欠けている場合は、a.7z.007をファイルa.7zにコピーするだけです。 .008と7-Zipは正しいサイズのアーカイブを見るでしょう。または、一部が縮小されている場合は、別の部分のサイズを見て元の(正しい)サイズの「不良」部分を復元すると、合計サイズが再び正しくなり、7-zipでヘッダーを開くことができます。
- ケース:アーカイブの終わりが破損しているか欠落しています。次のテキストはそのケースを説明します。
アーカイブの終わりに正しいEnd Headerがありません
7-Zipは、アーカイブ作成操作の最後にのみ完全な開始ヘッダーを書き込みます。
あなたは開始ヘッダを見ることができます。別のフィールドにバージョンとゼロの署名が表示されている場合
0000000000: 37 7A BC AF 27 1C 00 04 00 00 00 00 00 00 00 00 0000000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
それからアーカイブ作成操作はおそらく何らかの理由で中断されました。そしてその場合、おそらくアーカイブの最後にMetadata BlockとEnd Headerがありません。
注:アーカイブがマルチボリュームの場合、アーカイブの終わり(最後のボリューム)が書き込まれる前に最初のボリュームがコピーされた場合、未完了の開始ヘッダーも可能です。その場合、アーカイブは破損していません。合計サイズが正しく、正しいEnd Headerがある場合、7-Zipはそのようなアーカイブを解凍できます。
[開始ヘッダ]が[OK]の場合は、正しいアーカイブサイズを計算し、自分が持っているアーカイブのサイズと比較できます。
End Headerがない場合は、ファイル名、タイムスタンプ、その他のメタデータを復元することはできませんが、一部のデータをrawファイルとして復元し、その後、一部のパーサーを使用してrawファイルからデータを復元することは可能です。
例を挙げてすべてのステップを説明します:
- 良い7zアーカイブを作成する
- 破損したアーカイブ
- 破損したアーカイブからファイルを回復する
良いアーカイブを作成する
良いアーカイブを作ります。サンプルファイルとしてreadme.txt(1565バイト)フォーム7-Zip 9.20を使用します。
readme.txtからreadme.txt.bz2、readme.zip、readme.txt.gzip、およびreadme.txt.xzアーカイブを作成します。
すべてのファイルを含むLZMAメソッドでa.7zを作成します:
readme.txt.bz2 readme.txt.gz readme.zip readme.txt readme.txt.xz
a.7z(3740バイト)があります。あなたはそのファイルを16進エディタで見ることができます。上記の7zファイルの構造に似た構造を持っている必要があります。
破損したアーカイブ
今、私たちはa.7zアーカイブを壊しています。アーカイブを2つの部分に分けたいです。
- a.7z.001: 開始ヘッダ、圧縮データの一部
- a.7z.002: 圧縮データ、メタデータ、エンドヘッダの一部
End Header付きのメタデータブロックは、テストアーカイブには大きくありません(300バイト未満)。
7-Zipファイルマネージャで “Split file …“コマンドを呼び出し、[Split to volumes、bytes:]フィールドに「3000 100G」と入力します(100Gは2番目の部分が100GBを超えることはできないことを意味します)。
a.7z.001(3000バイト) と a.7z.002(740バイト) の2つの部分があります。それから a.7z.001 を bad.7z にコピーして bad.7z を開こうとします。そして、”ファイル 'bad.7z' をアーカイブとして開くことができません” というメッセージを受け取るので、アーカイブが破損しています。
アーカイブを回復
hex エディタで bad.7z を開きます
0000000000: 37 7A BC AF 27 1C 00 04 5B 38 BE F9 59 0E 00 00 0000000010: 00 00 00 00 23 00 00 00 00 00 00 00 7A 63 68 FD 0000000020: 00 21 16 89 6C 71 3D AB 7D 89 E6 3C 2E BE 60 24
開始ヘッダーが問題ないことがわかります。
開始ヘッダーフィールドの値から正しいアーカイブサイズを計算します。
0x0E59 + 0x20 + 0x23 = 0x0E9C = 3740
正しいサイズは3740バイトですが、私たちの “bad.7z”はたった3000バイトです。
アーカイブの終わりを見ます:
0000000B60: 55 73 EA 87 45 18 FC AD 67 0D 40 EF F4 41 49 63 0000000B70: 6A 87 54 70 32 6C B0 8F 76 2A 63 BF 12 5D 88 CD 0000000B80: 22 76 9F 97 05 3B 37 BE 49 CD F8 0A CC 67 FB FE 0000000B90: 17 2E 16 D5 1F 8C 5A 30 08 7F C6 E9 98 9F 00 F1 0000000BA0: A6 99 F9 ED 01 62 84 48 77 69 C7 65 21 21 42 66 0000000BB0: 48 F1 FE 79 06 08 25 68
そしてアーカイブの最後にEnd Headerが表示されません。
結論:アーカイブはおそらく切り捨てられました。
今度は、良い開始ヘッダー、終了ヘッダーを含む別の「良い」7zアーカイブを作成します。そして、私たちはその新しい “良い”アーカイブの中にbad.7zからのCompressed Dataブロックを置きたいです。
最初に、bad.7zでCompressed Dataブロックの開始点を調べます。
0000000020: 00 21 16 89 6C 71 3D AB 7D 89 E6 3C 2E BE 60 24
LZMA方式を使用した場合、圧縮データの最初のバイトは常に0で、2番目のバイトの上位ビットも0になります。したがって、最初のバイトに00、2番目のバイトに00から7Fが表示される場合、LZMA方式が使用されます。
圧縮データの最初のバイトが0でない場合、または2番目のバイトの値が7Fより大きい場合、それはLZMAストリームではありません。LZMA2(またはAES暗号化ストリーム)にすることができます。
bad.7zと同じ方法で新しい「良い」7zアーカイブを作成しなければならず、新しいアーカイブはbad.7zよりはるかに大きくなければなりません。
そのため、その新しいアーカイブ用に大きなファイルを選択します。場合によっては、その大きなファイルとしてbad.7zさえ使用できます。しかし、7-zip.chmを使用しています。7-zip.chm(91020バイト)をファイルraw.datに名前変更し、大きな辞書サイズ値を持つLZMAメソッドを使用してraw.datをraw.7zに圧縮します。辞書サイズはbad.7zの辞書サイズ以上でなければなりません。
raw.7zは(84898バイト)で、必要に応じてbad.7zよりはるかに大きくなります。raw.7zが “bad.7z”よりも小さい場合は、より大きな別のraw.datを使用して別のraw.7zを作成する必要があります。
bad.7zの場合は「ファイルの分割…」関数を呼び出し、「ボリューム、バイト数の分割」フィールドに「32 100G」と入力します。
それは2つの部分を作ります:
- bad.7z.001: 32バイト: 開始ヘッダ
- bad.7z.002: 2968バイト: 圧縮データの先頭
raw.7zの場合は「ファイルの分割…」関数を呼び出し、「ボリューム、バイト数の分割」フィールドに「32 2968 100G」と入力します。値2968が「bad.7z.002」のサイズと等しいことに注意してください。あなたが本当のアーカイブを回復するとき、あなたはあなたのbad.7z.002の正確なサイズを使わなければなりません。
それは3つの部分を作ります:
- raw.7z.001: 32バイト: 開始ヘッダ
- raw.7z.002: 2968バイト: 圧縮データの先頭
- raw.7z.003: 81898バイト: 圧縮データの終わり、メタデータブロック、ヘッダの終わり
それから、bad.7z.002ファイルをraw.7z.002に名前変更します。
マルチボリュームの “raw.7z。*”アーカイブには、raw.7zからの適切なヘッダーと “bad.7z”からの圧縮データが含まれています。
raw.7z.001ファイルには「Extact」と押します。raw.datファイルを解凍し、おそらく “Data Error”メッセージを表示します。
これで、bad.7zから回復したストリームを含むraw.datファイルができました。
7zアーカイブの大部分は堅実です。bad.7zアーカイブが安定していた場合、復元されたストリームは連結されたオリジナルファイルから構成されます。
bad.7zアーカイブが安定していない場合は、リカバリされたストリームに1つのファイルのデータが含まれています。最後にガベージデータを含めることもできます。
回復された固体アーカイブのための生ストリームの解析
いいえ、raw.datを検索し、ファイルシグネチャを検索し、そのファイルからファイルを抽出するパーサーソフトウェアを使用する必要はありません。
あなたは7-Zipからパーサを使うことを試みることができます。
7-Zip 9.34 alpha以降のバージョンが必要です。
raw.datを選択して、コンテキストメニューコマンド “7-Zip> Open Archive>#”を呼び出します。
それが示している:
1.bz2 2.readme.txt.gz 3.zip 4 5.xz
これらのファイルを抽出するには、[抽出]コマンドを押します。
それで我々はオリジナルのファイルのいくつかを回復しました、しかしオリジナルの名前なしで。
7-Zipパーサーは生ファイルでアーカイブを見つけることができます。しかし、それはxml、html、jpg、pngファイルなどのような他のファイルを認識しません。そのため、おそらく生ファイルからファイルを抽出するために別のパーサーソフトウェアが必要です。
非ソリッドアーカイブおよび複数のソリッドブロックを含むアーカイブのリカバリ
7zアーカイブに複数のソリッドブロックがある場合は、ソリッドブロックの正確な終わりと次のソリッドブロックの始まりを検出する必要があります。
その場合の復旧手順については、今後説明します。