「UNLHA32.DLL その他で作成した (と思われる) 書庫を Lhaplus で展開できない」といった質問を意外に多く受けますので, このページで Lhaplus 1.56 での制限等について簡単に記述しておきます。
●Lhaplus が作成する書庫について
Lhaplus が作成する書庫については以下の制限が存在します:
- 作成される書庫は h0 形式ヘッダーです。 従って, パスを含んだメンバー名については, 基本的に (オリジナルの仕様としては) 64 バイトまでが有効となります。
- 基本は上記のとおりなのですが, 基本ヘッダーのファイル名項目 (のみ) で表現可能な 255 バイトまで作成を行ってしまうため, 自身を含めて取り扱い不可能な書庫が作成されてしまいます。 ヘッダー読み込み時のリカバリーは行われませんので, 当該箇所以降の全てのメンバーは無視されます。
- h0 形式ヘッダーであることから, タイムスタンプについては全て ftime 形式 (2 秒単位) の切り捨てで扱われます。
●属性について
属性ヘッダー (識別子 0x40) には対応していますので, h1/h2 形式ヘッダーについても属性が復元されます。
●タイムスタンプについて
内部データーが ftime 形式によっているため, h2 形式ヘッダーであっても ftime 形式 (2 秒単位) でタイムスタンプが扱われますので, 切り捨てとなる点に注意の必要となる場合があります。 更新日時以外は扱われません。
●lhd 形式 (ディレクトリー) メンバーについて
正常に扱われますが, タイムスタンプは多くのアプリと同様に復元されません。
●圧縮形式について
lh0 / lh4~lh7 形式が扱えます。 その他の形式については, 扱うことができません。
メソッド ID と実際のメソッドが異なるメンバー (lh6 と lh7 形式メソッドの区別されていなかった時期が存在するため, そのような書庫が存在します。) の主なものについては, 以下のとおりです:
メソッド (ヘッダー/実際)
|
結果
|
コメント
|
lh4/lh5
|
×
|
|
lh5/lh4
|
○
|
|
lh5/lh6
|
×
|
普通は展開できない。
|
lh6/lh5
|
×
|
普通は展開できない。
|
lh6/lh7
|
×
|
DJLHA を始めとした一時期のツールで作成される。
|
lh7/lh6
|
○
|
|
●書庫形式について
●h2 ヘッダー形式書庫について
h2 ヘッダー形式書庫の取り扱いについては以下の制限が存在します:
- 内部ルーチンが h0 形式を基本としているため, ヘッダーサイズが正常に取り扱われません。 従って, パスが長い場合などヘッダー全体が 255 バイトを超えたものについては扱えず, リカバリーも行われないため, 以降のメンバーが全て無視されます。
- Lhaplus はヘッダー CRC に対応していないため, ヘッダー改竄・破損の確認が行われません。 攻撃書庫の多くはヘッダー改竄を伴っていますので, そういった意味では危険性が高いと言えます。
- 上述されているように, 内部データーが ftime 形式となっているため, 常に 2 秒単位 (切り捨て) でタイムスタンプが扱われます。
●ヘッダー CRC チェックについて
Lhaplus では基本ヘッダーの SUM チェックしか行われず, ヘッダー CRC については作成も読込も行われません。 従って, h2 形式の全て, 多くの h1 形式, そして (Linux 上などで作成された) h0 形式の書庫については, ヘッダー改竄・破損の確認が行われません。 攻撃書庫の多くはヘッダー改竄を伴っていますので, そういった意味では危険性が高いと言えます。
●「指定外の場所へファイルが展開されてしまう脆弱性」の問題について
指定したディレクトリー配下へ展開が行われるような調整は行われず, エラーとして扱われます。
●「バッファーオーバーフロー」の問題について
1000 文字といった長い名前をもったメンバー等の存在する書庫については, 展開されない (エラーログが出力される。) ようになっています。
これらの不正なパス情報等をもったファイルについては以下のとおりです:
不正内容
|
結果
|
絶対パス (/WORK/Test.TXT)
|
冒頭の "/" を無視して, 展開先の配下へ展開する。
|
不正パス 1 (../../WORK/Test.TXT)
|
エラー扱いとなる。
|
不正パス 2 (D/../../D/Test.TXT)
|
エラー扱いとなる。
|
不正パス 3 (D/.../Test.TXT)
|
そのまま展開しようとして失敗。 プラットフォームによっては ".." のパス情報として扱われてしまうので注意。
|
オーバーフロー (Long~700字~.txt)
|
エラー扱いとなる。
|
拡張子偽造 (Test.c ←40字→ .exe)
|
実行されることがないため, そのまま展開される。
|