質問:
不明な解凍アルゴリズム
antoyo
2015-03-29 22:10:07 UTC
view on stackexchange narkive permalink

ChessBaseアーカイブ(.cbv)のリバースエンジニアリングに取り組んでいます。

ファイルの一般的な構造を見つけ、すでにいくつかのファイルを解凍できます。

ご覧ください。私の現在の作業はここです。

ただし、より大きな.cbvファイルの中には、2番目の圧縮アルゴリズムを使用しているようです。

最初の圧縮アルゴリズムを見つけることができました。 ChessBase Reader 2013ソフトウェアをデバッグすることによる圧縮アルゴリズムですが、2番目の圧縮アルゴリズムを理解できません。

signsrch などのツールを試してみました運が悪かったのにどのアルゴリズムが使用されたかを調べます。これはカスタムアルゴリズムのようです。

これがツールで部分的に解凍できるファイルです。 a>(不明な圧縮アルゴリズムが使用されたことを検出すると、ツールは What to do?を出力します。

使用されている圧縮アルゴリズムについて何かわかりますか?

そうでない場合は、圧縮ファイルを見てそれを見つける方法はありますか?

アーカイブを作成できるので、圧縮されているファイルと圧縮されていないファイルの両方:このような状況で圧縮パターンを見つける方法はないかと思います。

1 回答:
Guntram Blohm supports Monica
2015-03-30 19:10:51 UTC
view on stackexchange narkive permalink

ChessBase Readerをダウンロードし、ProcMonで少し遊んでアーカイブを読み取り、データファイルを書き込む関数を見つけた後、IDAにすべてをロードして分析しました。データはハフマン符号化されています。

各データブロックの構造は次のとおりです。ハフマン圧縮はバイトではなくビットで機能するため、次の表の各サイズもビット単位であることに注意してください。たとえば、ブロック長は16ビットまたは2バイトです。

  + ------------------------- --------------------- + | || 16ビット-非圧縮ブロック長(len)|| | + ----------- + ---------------------------------- + | | ||繰り返し| 4ビット-エントリの長さ(n)|| 256 | ||時間+ ---------------------------------- + | | || 1つのエントリ| nビット-ツリーの左/右||バイトごと|このバイトの情報||(0-255)| || | | + ----------- + ---------------------------------- + | ||ハフマンでエンコードされたビットシーケンス。 ||の数ビットはどこにも保存されませんが、数値||シーケンスの数、これは数に等しい||出力バイトの、はブロック長(len)です|| | + ---------------------------------------------- +  

このスキームで「foobar」という単語がコーディングされているとすると、次のようになります(文字のビット値を作成しました):

  + ---------------- + |||文字のハフマンコードは| + -------- + ------- + | | || o | 0 || f | 100 || b | 101 || a | 110 || r | 111 || | | + -------- + ------- +  

これにより、foobarという単語が次のようにコード化されます。 100 0 0 101110111 。長さは6バイト、つまり16ビットで 0000 0000 0000 0110 です。

上記の表にフォーマットされた foobar のビット配列は次のようになります

  0000 0000 0000 0110(16ビット出力長).....バイト '\ 0'の配列インデックス0 .....バイト '\ 1'の配列インデックス1 .. .. ..0011バイト「a」(3ビット)の110配列インデックス97 0011101バイト「b」(3ビット)の配列インデックス98 ..... 0011バイト「f」(3ビット)の100配列インデックス102。 .... 00010バイト 'o'(1ビット)のアレイインデックス111 ..... 0011101バイト 'r'(3ビット)のアレイインデックス114 .....残りのビットコンボ-2551000 0 101 110 111 foobar text  

実装は、コードテーブルからバイナリツリーを構築します。データを読み取るときは、ツリーのルートから開始します。各ビットは、次のビット値に応じて、ツリーを下って左または右に移動します。リーフに到達すると、対応するバイトが出力されます。これは、出力ストリームの長さに達するまで繰り返されます。

バイナリの関連関数は次のとおりです。

BECAA0 :アーカイブデータをデコードします。長さの16ビットを読み取ります。次に、デコーダークラス内のオフセット 080A (ビット)と 0E10 (ビット長)でエンコードテーブルを2つの配列に読み取ります。この後、 BEC930 を呼び出してデータバイトをデコードします。

BEBF30 :1つのパラメータ(ビット数)は、入力配列からこの数のビットを取得します。関数の最後に、オフセット 1014 の単語にこれらのビットがあります。

BEBAD0 080Aの配列からツリーを構築しますおよび 0E10

BEC930 BEBAD0 を呼び出してツリーを構築し、残りのビットを入力ストリーム。ビットごとにツリーを歩きます。リーフが見つかるとバイトを発行します。最後に、 BEBA90 を呼び出してツリーを破棄します。

BEBA90 :ノード自体である左右の子を削除して、ノードを再帰的に削除します。

必要に応じて、ライターのデバッグが簡単になるとは思いません。ファイルを読み取るため。圧縮には多くのロジックとデータ構造があり、「一方向」がどのように機能するかを知っていても、必ずしも逆方向に役立つとは限りません。この場合、幸いなことに、これはよく知られているアルゴリズムですが、アルゴリズムが不明な場合、解凍方法を知っているだけでは効果的に圧縮するのが非常に難しい場合があります。

データベースの暗号化は確かにオプションです。 http://www.chesscentral.com/basic_chess_database_a/300.htmを参照してください。そうすれば、それがあなたが見ているものである可能性があります。
@broadwayこれを指摘していただきありがとうございます。しかし、その間に、私はIDAをもう少しマッサージしました。私はまだすべてがうまくいったわけではありませんが、これはハフマン解凍アルゴリズムであると確信しています。
最後の数キロバイトを見ると、バイナリコードが散在している「通常のテキスト」フラグメントを見ることができます。間違いなくハフマンの変種です。
あなたの答えをありがとう:私はこれを見ます。 @Jongware:通常のテキストフラグメントを表示するときに使用される圧縮アルゴリズムはすでに知っています(githubのツールを参照してください)。私の問題は、テキストの断片がない場合です。ちなみに、そのようなアーカイブを作成するアプリケーション(ChessBase)をデバッグすることで、アルゴリズムを理解するのは簡単でしょうか?


このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
Loading...