開けなくなったLZHの解凍


データ復旧のプロが教えるデータ復元から消去までの豆知識:OntrackNow

================================================================================
 ■■      ■             ■      豆知識  Vol.02-05
■  ■     ■             ■ ■ 開けなくなったLZHの解凍
■  ■ ◆■■ ■■■ ■ ■ ■■◆ ■■ ■ ■  ■  ■
■  ■ ■ ■ ■  ■■ ■  ■ ■   ■■  ■■ ■ ■■ ■ ■ ■
■  ■ ■ ■ ■  ■  ■  ■ ■ ■ ■ ■  ■ ■■ ■ ■ ■■■■
 ■■  ■ ■ ■■ ■   ■■◆ ■■ ■ ■ ■  ■ ■■  ■ ■
=============================================================2004.05.20=========
◎ 開けなくなったLZH圧縮ファイルの修復法

 ZIP       Ontrack EasyRecovery/WINRAR
 RAR       WINRAR

 ZIP/RARについては上記のプログラムで修復が可能ですが、LZHについては
現在まで使って来たソフトにはこの機能はない様です。 CRCの取り直しと破損
ファイルをスキップして解凍する機能があるとよいのですが。

 資料が分散しない様にLZHやZIPといった圧縮ファイルを使って複数のファイルを
ひとつにまとめ管理するという方法は、ディスクスペース削減、管理単純化、ポカ防止、
機密保護等の目的でよく使われる方法です。

 さて、LZHについては統合アーカイバプロジェクトから提供されるDLLの添付資料
からそのファイル構造を知る事が出来ます。 この資料からLZHについては複数の
ファイルをLZHとして圧縮した場合、夫々のファイルが1圧縮単位としてファイルの
中に積み上げられている事が判ります。 とすれば、上書きなどで一部が破損した物でも
壊れていない部分については正常に回収出来るはずなのです。 処が一般の解凍ソフトは
壊れた箇所があるとその前迄しか解凍出来ないか、発狂してしまいます。

 そこでどうするか。 そう、壊れた箇所を削除してしまえば、ちゃんと解凍出来る様に
なってくれるのです。 その方法をご説明する事に致します。

統合アーカイバプロジェクト URL : http://www.csdinc.co.jp/archiver/

LZHヘッダ情報 : ダウンロードしたULHAnnnn.EXEを解凍しますと中に
           HEADER.TXTというファイルがあるはずです。
           この中に詳細が記載されていますのでこれをお読みください。

【LZH のヘッダ構成】

offset  Length   FieldName			Value
  0    2   Header Size		XXXX		ヘッダ領域のサイズ
  2    5   CompType			-lh5-		LZH圧縮の形式
  7    4   CompSize			XXXXXXXX	圧縮後のサイズ
  B    4   FileSize			XXXXXXXX	元のファイルの論理長
  F    4   UpdateTime		XXXXXXXX	処理した日時
 13    1   Reserve			XX		予備
 14    1   HeaderLevel		XX		自身のヘッダ形式
 15    2   CRC16			XXXX		圧縮部分のCRC値
 17    1   OS			XX		OSの種類
 18    2   Extended Header Size	XXXX		拡張ヘッダの長さ
 1A    1   Extent Signeture		XX		拡張ヘッダの種類
 1B    n   内容					通常ファイル名
    ・
    ・      以下圧縮データブロック
    ・

 ヘッダには幾つかのタイプがありますので、LZHアーカイバについているファイルを
参照し、そのタイプのヘッダ構造を調べて、対象となるファイルのヘッダ内容を分析して
みて下さい。(CompType=offset 2)

 模擬としてある程度ファイル数が入っているファイルで以下の操作を行ってみて頂くと
どういう構造か、どうすれば直せるかが理解して頂けるものと思います。

【内部に含まれる個別圧縮ファイルの位置の特定法】

1。 バイナリーエディタ“Stirling”を起動します。

2。 内容を確認したいLZH圧縮ファイルを“Stirling”のウインドウに
   ドラッグ&ドロップします。
   表示は左側の00-0Fで示される部分に16進表示、右側の0-Fで表示される
   部分にテキスト表示がされます。

3。 バイナリ表示されたファイルの先頭から2バイト目に“-lh5-”という文字列
   が右側のテキスト表示分に見えるはずです。

4。 双眼鏡マークのボタンを押すと、検索ダイアローグボックスが開きますので、
   データ種別を文字列に切り替え、“-lh5-”を入力し、次検索ボタンを
   押して下さい。

5。 0000-02からの5バイトが反転表示されるはずです。 ダイアローグはここで
   閉じて構いません。

6。 ボタンバーの右から5番目のマーク/アンマークボタンを押すとマークされます。
   再度押すとマークが消えます。 マークをしておきますと、その右の2つの
   ボタンで次の選択位置迄ジャンプする事が出来ます。

7。 次を探すには双眼鏡の右に下矢印が付いたボタンを押します。 6/7の操作を
   次に進まなくなるまで続けます。

8。 マークジャンプボタンを使って、夫々のヘッダを見てゆきます。 “-lh5-”
   からオフセット1Bhが示す位置にファイル名が入っているはずです。

“-lh5-”の前2バイトがこの圧縮単位のヘッダ部の大きさです。 簡単に言って
しまえば、2バイト前から、次の“-lh5-”の3バイト前迄が一つの圧縮単位で
この中にはオフセット1Bからで示されるファイル名のファイルが圧縮されている事が
判ります。

【破損部の削除】

1。 正常に解凍されたファイルの次が壊れている訳ですから、マークジャンプボタンで
   該当するファイルの次の“-lh5-”迄進めます。

2。 この前2バイトにこのブロックのヘッダの長さが入っています。
   またOffset-7からの4バイトに圧縮後のファイルサイズが入っています。
   このヘッダの先頭位置とこれらの値から次のヘッダ位置が計算されますので、
   次のマークされた位置とこの値を比較し、合致していればその位置以下にある
   ファイルが壊れている事になります。

   この計算には16進電卓を使ってください。 また、intel系は偶奇が逆転
   して記録される事に注意して下さい。

   2バイトフィールドで 47 01 と16進表示されていれば 147となり、
   4バイトフィールドで F1 08 01 00であれば 108F1となります。

   例えば、Offset 0 = 48 00
       Offset 7 = F1 08 00 00
       Offset 0 のアドレスが、0000093E であれば

       0000093E
      +      48
      +     8F1
       00001277 が次のヘッダの先頭となります。

3。 破損部分の削除はそのブロックのマーク位置-2 から 次のマーク位置-2と
   なりますので、この範囲を選択して反転させ、切り取り(はさみ)ボタンを押して
   この部分を消去します。

4。 これに新しいファイル名を付けて書き出せば、消去した部分を除く圧縮ファイルが
   出来た事になります。

5。 このファイルを解凍してみます。 うまく解凍出来ましたか?

 以上が部分的に破損したLZHファイルの修復法です。
 ZipはEasy Recovery ZipRepairがCRCの取り直し及び
 正常部分の抜き出しを行いますので、これをご利用頂ければと思います。
 (ERのTrial版ZipRepairは製品版と同じで使用制限はありません。)

 これがお役に立つようなシチュエーションにならない様お祈り致します。(^^)

================================================================================
   Ontrack Data Recovery Service--
======================================================豆知識===Vol.02-05=END====