ZIP書庫ファイルを解凍する為のDLLです。対応アプリケーションから呼び出されます。
庄田さん作のUnZip32.DLL Version 5.40が公開されてから5年以上の歳月が流れ、その間に元となったInfo-ZIP版UnZip32.DLLも Version 5.52になりました。
最新のInfo-ZIP版UnZip32.DLLには、Deflate64形式で圧縮されたZipファイルの解凍のサポートがありますが、庄田さん製UnZip32.DLL Version 5.40には残念ながら、その機能がありません。
また、ZIP32(J).DLL経由で圧縮したのではないZIPファイルの解凍をするとファイルのタイムスタンプが9時間ずれるという残念な点があります。
秋田 稔さん作の7-zip32.dllには、ZIPファイルの圧縮・解凍の機能もあり、Deflate64形式が扱えるばかりか、ファイルのタイムスタンプが9時間ずれる事もありません。
また、いわゆる「ディレクトリを跨いでファイルが展開される問題」も最新の7-zip32.dllは解決しているので、庄田さん製UnZip32.DLLの「ディレクトリ跨ぎで展開される脆弱性」を利用するワームに、もしかしたら有効かもしれません。
そういう訳で、7-zip32.dllを使って、ZIPファイルを解凍すれば、問題無いのですが、7-zip32.dllでZIPファイルを解凍できるツールはあまり無い(今はそこそこ存在しますが...。)ので、内部で7-zip32.dllのAPIを呼び出す「偽UnZip32.DLL」を作成してみました。
UnZip()で渡すコマンドラインは、7-zip32.dllのSevenZip()で渡すコマンドに変換されて渡されるので、「偽UnZip32.DLL」を使えば、アプリケーション側は庄田さん製のUnZip32.DLLを使っていると勘違いして動作してしまうはずです。
つまり、この偽UnZip32.DLLは、Info-ZIP版UnZip32.DLL Version 5.52に、統合アーカイバDLL関連APIを実装した物ですが、統合アーカイバDLL関連APIは、7-zip32.dllに丸投げで実装した、実に他力本願なDLLです。
もしかすると、庄田さん製UnZip32.DLL 6.0(?)が公開されるまでの代替になるかもしれません。
このドキュメントでは、庄田さん製のUnZip32.DLL Version 5.40 を「オリジナル版」、Info-ZIP製UnZip32.DLLを「Info-ZIP版」、このUnZip32.DLLを「偽UnZip32.DLL」と呼ぶ事にします。
オリジナル版は、フリーソフトと言いながら、企業や営利目的で使用する場合は、ライセンスが必要である事が記述されていますが、偽UnZip32.DLLでは、ライセンスフリーなフリーソフトであると、宣言させて頂きます。
フリーソフトはライセンスフリーなのでは?というツッコミはしないように...。
オリジナル版のUnZip32.DLLに上書き。は、あんまりなので、オリジナル版をUnZip32.DLL.ORGとかにリネームするなどのバックアップを行った後、偽UnZip32.DLLをオリジナル版のあった場所に配置してください。
一つのアプリケーションだけを騙すのであれば、アプリケーションの実行ファイルのディレクトリに置くとか、「Side-by-Side Component Sharing in Applications」な技術を使えば良いでしょう?
じゃぁ、それをどうやってするのか?と言う事を私に聞かないで〜!
偽UnZip32.DLLを削除し、バックアップしていたオリジナル版を元に戻してください。
偽UnZip32.DLLをメモリにロードしているアプリケーションが起動したままだと削除できないので、事前に使用していたアプリケーションを終了させる必要があります。
オリジナル版を使用するアプリケーションを使ってみてください。うまくいけば、「偽UnZip32.DLL」にまんまと騙されたアプリケーションが動作するかもしれません。
| アプリ | 作者 | 動作状況 |
|---|---|---|
| VB De FilMtn | 新山(へろぱ) | 騙せます。 |
| LHMelt | Micco氏 | |
| LHUT32 | 大竹和則氏 | 騙せます。 |
| Explzh | 鬼束 裕之氏 | 騙せます。 |
| DYNA | Hx2氏 | 「Get new version or use AXZIP.SPI」なメッセージが表示され騙せません。(SUSIEは騙せているようなんだけど...。) |
| Deaces(Ver 0.0948) | NAO氏 | 騙せます。(Free BBSにて通りすがり氏からの報告。ありがとうございます。) |
| まめFile4 | AMA Soft氏 | 騙せます。(Free BBSにてMasa氏からの報告。ありがとうございます。) |
| GV(画像ビュアー) | とびた氏 | 騙せません...。(Free BBSにてお弟子殿からの報告。ありがとうございます。) |
| 卓駆★ | 株式会社 コム | 騙せます。(Free BBSにてアドニス・リラ氏からの報告。ありがとうございます。) |
| WinLM32 | 柳 直樹氏 | 騙せます。(Free BBSにてアドニス・リラ氏からの報告。ありがとうございます。) |
| DF | びい氏 | 騙せます。(Kyouichi SHIKUYAさん、ありがとうございます。) |
他にも動作確認をされた方は、教えていただけると助かります。
オリジナル版のAPIやコマンドを完全に実装しているわけではないので、オリジナル版の機能をフルに使うようなアプリケーションでは動かないかもしれません。
UnZipGetVersion()は、SevenZipGetVersion()の値を返す為、オリジナル版のバージョンを期待して動作するアプリケーションでは、バージョンが古いから動かないよ。とか言われるかもしれません。
と言う事にしていましたが、UnZipGetVersion()は、552を返すようにしたので、バージョンをチェックして、最新のDLLにしようとするプログラムもまんまと騙されるかもしれません。
偽UnZip32.DLLは鮮度が命です。開封後は、お早めにお使いください。万一残った場合は、空気に触れないように密閉し、冷暗所で保存してください。
ごく稀に沈殿物が見られる事がありますが、品質には支障ありません。
幼児の手の届かない場所に保存してください。
合成着色料、合成保存料の類は一切使用しておりません。
たまに沈澱物が見られることがありますが、異常ではありません。
| 日付 | 項目 |
|---|---|
| 2004/07/29 | 最初のバージョン。オリジナル版のバージョンアップが待ちきれなくて。そして、思いついたアイデアを実体化しておく為に。(ジョークソフトのノリで...。) |
| 2004/08/09 | UnZipGetVersion()は、SevenZipGetVersion()ではなく、Info-ZIP製のバージョンを返すようにした。(つまり551) UnZipGetSubVersion()は、今回からリリース回数を返すようにした。(つまり2) というのは、〜GetVersionをみて、古いバージョンだと認識し、インターネットからオリジナル版を上書きでインストールするアプリケーションをも騙す為。 |
| 2004/08/10 | UnZipOpenArchive()に渡すファイル名に「"」を付けるアプリケーション(LHUT32とか)に対応。SevenZipOpenArchive()は、「"」付きのファイル名だと失敗するので。 UnZipGetSubVersion()は、3を返します。 |
| 2004/08/11 | UnZip()のファイルパスのデミリタに「/」を渡すアプリケーション(LHMeltとか)に対応。SevenZip()は「/」をパスのデミリタと認識しないので。 LHUT32は、うまく騙せないようです...。 UnZipGetSubVersion()は、4を返します。 |
| 2004/08/12 | UnZip(), UnZipFindFirst()で渡されるワイルドカードが「*.*」の場合は、「*」に変換して渡すようにした。 オプション「--j」に対応。(Explzh対応) UnZipGetSubVersion()は、5を返します。 |
| 2004/08/31 | UnZipFindFirst(), UnZipFindNext()での_lpSubInfo->wRatioの値がオリジナル版と7-zip32.dllでは反転しているのでオリジナル版と同じ値を返すように修正。 UnZipGetArcRatio(), UnZipGetRatio()の値もオリジナル版と7-zip32.dllでは反転しているのでオリジナル版と同じ値を返すように修正。この辺は、特に要望は無かったのですが、LHMeltのHISTORY.TXTに書かれているのに気がついた以上は直さなければ...。 コマンドラインの区切りが半角スペースまたはタブ文字がなく、「"」で囲った文字列だけで区切りとしているアプリケーション対応。(LHMelt 1.36bβとか)恐るべし!オリジナル版。 UnZipGetSubVersion()は、6を返します。 |
| 2004/09/07 | UnZip()でのコマンドラインで、ファイル名に[]があるファイル名の場合、オリジナル版では、正規表現として評価される為、アプリケーション側で対策をしているが、7-zip32.dllは正規表現を実装していない為、エラーとなる問題の修正。 UnZipGetSubVersion()は、7を返します。 |
| 2004/10/10 | UnZipGetRatio()やINDIVIDUALINFOのwRatioの計算式が間違っていたのを修正。ごめんなさい。 UnZipGetSubVersion()は、8を返します。 |
| 2004/10/11 | SevenZipGetOriginalSize()よりもSevenZipGetCompressedSize()の値が大きい場合、UnZipGetRatio()が不正な値を返すのを0で返すように修正。 ちなみに、7-zip32.dllは、ファイルサイズに対する圧縮率を返しますので、上記の場合100%を超える値を返しますが、オリジナル版は「圧縮されたサイズに対する圧縮率」を返すので、マイナス値となる可能性があった。UnZipGetRatio()はWORD値を返すので、マイナスはありえない...。 UnZipGetSubVersion()は、9を返します。 |
| 2004/10/12 |
UnZipGetRatio()について、オリジナル版の作者の庄田さんにオリジナル版はどうやっているかを聞く。(一時の恥) Info-ZIP版ソース中のlist.cにratio()がある事を教えてもらい、そのロジックを使うと、オリジナル版と同じ値を返すようになった。めでたし。 UnZipGetSubVersion()は、10を返します。 |
| 2004/11/04 |
ソースを整理整頓。ソース添付。(って事は、もう弄らないって事か?) コンパイル時のワーニング表示を出ないようにしてリコンパイル。10と比べてファイルのサイズが大きくなった...って事は、前のバージョンはどうして動いていたのだろう...。 UnZipGetSubVersion()は、11を返します。 |
| 2005/04/06 |
7-zip32.dllをダイナミックリンクするように改善。 Info-ZIP製UnZipのソースを5.52ベースを使用するようにした。5.51までのバグをフィックスしたバージョンらしいですが偽UnZip32.DLLは、7-zip32.dllに依存しているので、ほとんど関係ありません。Info-ZIP版ネイティブAPIを使用しているアプリケーションには恩恵があるかもしれません。 UnZipGetVersion()は、552を返します。 UnZipGetSubVersion()は、1を返します。 |
| 2005/07/29 | UnZipGetFileCount()の引数に「"」付きで書庫ファイル名を渡してくるアプリケーションに対応。7-zip32.dllは「"」付きで渡されるファイル名を書庫とみなさないので、「"」を取り除くロジックを追加。見事LHUT32を騙す事ができました。 UnZipGetSubVersion()は、2を返します。 |
| 2006/07/24 | CStringを使いたいが為に、MFCをスタティックリンクしていたが、ATLを利用するとファイルのサイズが小さく出来ることを知ったので、ATLを利用するコードに置き換えてみた。 Visual Studio C/C++ .net 2003でビルド。(2005でビルドするのにはかなりのInfo-Zip側ソースの修正が必要なので...。) オリジナル版の5.42で追加された「-qUdee」「-qr0」「-qUded」「-qr1」オプションを実装。 7-zip32.dllを必要とするAPI使用時には必ずLoadLibraryのチェックをするようにしてみた。 UnZipGetSubVersion()は、3を返します。 |
| 2009/08/09 | メモリリークを修正。 Visual Studio C/C++ 2005でビルド。 UnZipGetSubVersion()は、4を返します。 |
| funzip32_552_4.zipのダウンロード (148KB) |
ソースのInfo-ZIP版からの差分も同梱しています。