呼び出すことができるコンプレッサーの物語、しかし私はどのように覚えていない

あなたの注意は、おとぎ話、陰謀、探偵調査、追跡、裏切り、古代人の知恵、そしてハッピーエンドが存在する、まったく新しい年の話ではありません。 ネコの下には、ペレストロイカ時代のハブラの考古学的な場所とx86アセンブラーがあります。





ネクタイ



80年代後半から90年代前半にリリースされた古いコンピューターゲームをプレイするのが好きです。 彼らは言葉で表せないほどのオールドスクールな環境、ゲームの仕組みの優位性、表現力のある手段、そしてオールドスクールを愛する他のものを持っています。 高校生のときでさえ、パズル要素を備えた2DシューティングゲームであるGamos Skycatゲームに出会いました 。 私はそれを演奏することに興味がありましたが、私は最初のレベルを通過することさえできませんでした。 当時、私はすでにPascalでのプログラミングが好きで、 GRAPH.TPU



モジュールの限られたグラフィックス機能にGRAPH.TPU



たため、x86アセンブラーの世界にゆっくりと参加し始めました。 そして、ある日、彼らにIDAを見ました。 同志 Gilfanovと約15キロバイトのファイルSKYCAT.EXE



、私はSKYCAT.EXE



な決定を下しました。つまり、通過できないゲームの完全なリバースエンジニアリングを実行して、内部の内容を確認しました。 私はこの魅力的なプロセスを長年にわたって非常にゆったりとした方法で行ってきましたが、その後、結果をコミュニティと共有する予定です(長年ではなく、問題が最初よりも成功の​​終わりに近づいていることを願っています)。 しかし、この記事はそれについて完全にではありません。



2016年の年末年始に向けて、私はシドマイヤーの文明を最も難しいレベルでプレイして楽しもうと決めました。 すでに理解しているように、私はかなり曲がったゲーマーなので、いくつかのゲームが失敗した後、ゲームCIVHELP.EXE



でハッキングされたトレーナーCIVHELP.EXE



を探すことにしました。これは非常に単純なことを行いCIVHELP.EXE



-それはセーブゲームの年と宝庫を変えます。 9キロバイトのファイルサイズとSkyCatのリバース開発の適度に成功した経験を見た後、私は別の突発的な決断をしました-本当にそれを拾ってみませんか! IDAは、「ファイルが圧縮されている可能性があります。続行しますか?」というメッセージで警告しましたが、無駄です。 奇跡はボンネットの下で始まりました。



陰謀



ファイルを分析した後、IDAは期待はずれの画像を作成しました。ファイル内に300バイトの悲惨な命令のピンチが見つかり、それ以外はすべてパックデータとして検出されました。 まあ、それは問題ではありません-Turbo Debuggerにロードし、アンパックした直後にブレークポイントを設定し、開始し、メモリダンプを作成します。 そして...





解凍されたプログラムの代わりにゼロの束を取得しました。 これは、実行可能ファイルのデバッグに対する何らかの保護がある場合、またはプログラムの実行中にコードが上書きされる場合に発生します。 いずれの場合でも、ファイルを無料で解凍することはできません。少なくとも解凍プログラムのコードを確認する必要があります。



おそらく新年の休暇から少し注意が鈍った読者を飽きさせないために、これらの300スパルタンバイトで何が起こっているかを簡単に説明します。 最初に、アンパッカーコードが上位メモリアドレスに移動され(アンパック時に独自のコードが失われないようにします)、同じ場所で、パックされたデータセグメントがアンパックされ、制御が転送されます。 これらの操作は私には特に複雑ではないように見えましたが、アンパッカーのコードはおなじみのようでした。 同様のことが、SkyCatでオーディオファイルを解凍しました!





スプラッシュ画面のロボットの声は、パックされたファイルに保存されます



控えめに言っても、私は驚きました。 SkyCatのサウンドアンパッカーのアセンブラーコードとCIVHELPコードを確認すると便利でした。 それらはラベルの名前まで同一であることが判明しました。 結論は明らかでした。アンパッカーは、異なる作成者からの2つのプログラムに参加できるほど十分に知られている必要があります。 神秘的なアンパッカーの再来を待たずに、その機会のヒーローの名前を見つけることにしました。 しかし、大量のアセンブラコードを手元に置いてそれを行う方法は?



探偵調査



アンパッカーはそれほど複雑ではないことが判明したため、SkyCatを分析するときにコードを拾い、その動作原理を理解しました:入力ストリームから制御ワードを読み取り、このワードからビットごとの命令を読み取る-入力ストリームから出力にバイトをコピーするか、すでにデコードされたストリームの一部をコピーする休日に、コントロールワードを使い果たした後、入力ストリームからそれがなくなるまで再びスクープします。 読者がひどいアセンブリ言語x86の古代の予言を恐れないのであれば、 ここで得られたコードに慣れることができます 。 私の頭の残りの大学の知識は、 Lempel-Zivアルゴリズムとそのすべての子孫がそのようなアイデアに基づいていることを示唆しまし 。 したがって、私の検索範囲はLZファミリーに(わずかではありますが)狭まり、 HuffmanBarrows、WheelerFano、Shannonなどの素晴らしい人間のパレードが残されました。 LZファミリーの印象的なアルゴリズムのリストを調べたところ、私の不思議な圧縮解除プログラムのアプローチを使用した単一の実装は見つかりませんでした-辞書を解凍するときは使用せず、単一の文字やその他の微妙な点のコピーを示すために数ビットを浪費しないでください。



次のアイデア(実際には、まず賢明な人に思いついたはずのアイデア)は、署名分析です。 さまざまなプログラムでは、特定のバイトマーカーをファイルに残して、どのプログラムが特定のファイルを作成したか、および/またはどのプログラムがそれを読み取り/編集/起動できるかを理解します。 たとえば、DOS実行可能ファイルはMZ



文字で始まり、BMPイメージにはBM



ヘッダーが含まれます。 SkyCatについては、各バイトの目的を知っていると確信していたため、そこにマークを付けることはできませんでした。 CIVHELP.EXE



ファイルCIVHELP.EXE



は、圧縮解除コードの後に​​、5バイトのデータがあり、文字列に変換すると*FAB*



ように見えました。 簡単なグーグル検索で、このテキストではコンピューターが何も見つからないことがわかりました。 署名分析の試行は、開始する前に失敗しました。



興奮して、私はさまざまなサイトでLempelとZivの事件の後継者について読み始めました。それらのソースコードをじっと見つめ、作業の異なるロジックを研究しましたが、類似するものはありませんでした。 数時間の検索の後、ソースコード付きさまざまなコンプレッサーのコレクションに出会い、アーカイブを1つずつダウンロードし、展開し、ソースを表示し始めました...そして、突然、見慣れたアセンブラーコードに目が行きました!



チェイス



 ; "" - ,     , ;         ;  (C)  1991
      
      





FROG.ASM



ファイルにはこのような面白い説明が含まれており、その下にはそのコンプレッサーのコードがありました! 私の検索は終わったように思えますが、私はまだ多くの質問がありました。

コンプレッサーのあるフォルダーには、次のような文書がありました。

ユー・D・クラシルニコフ。 ファイル圧縮/解凍プログラムおよび.COMファイル圧縮プログラム。

これらのプログラムを書く動機は、以前にI.タラネンコが「SQUEEZEデータパッキング手順」によってSoftpanoramで公開した記事でした。 この手順では、LZEXEパッカーの動作原理を使用しました。 このアルゴリズムは、シンプルさ、効率性、非常に高速なデータ圧縮解除によって区別されます。



すでにここから、同志クラシルニコフはEXEファイルのパッケージ化を提供していませんでした。少なくとも同志タラネンコとユーティリティLZEXE



がこれを行うことができたからです。 詳細な説明では、 FROG.ASM



は一般に解凍用の補助ユーティリティであり、COMパッカーコードはCで記述されていると述べていますCIVHELP.EXE



とどのプログラムを誰がパックしCIVHELP.EXE



か? SkyCatのオーディオファイルが単純なデータとしてパックされたのはなぜですか?



私はLZEXEに向かって掘ることに決めました。 その作者であるFabrice Bellardは非常にクールなプログラマーであり、彼について何も知らなかったことを恥ずかしく思います。 不思議な線*FAB*



が私の頭をよぎり、これが著者の署名であることが明らかになりました。 しかし、ファブリスは素晴らしいコンプレッサーのソースコードを提供しませんでした。 いくつかの慰めは、栗園ミツグがUNLZEXEユーティリティを作成し、 LZEXE



の結果を元の状態に分離したことでした。 さて、これが必要なものです! コマンドラインで入力したDosBoxを発見しました
 UNLZEXE.EXE CIVHELP.EXE
      
      





そして、メッセージを受け取りました

 CIVHELP.EXE is not LZEXE file
      
      







偽り



「なんてこった!」 思った。 -この行*FAB*



、そのようなファイルに*FAB*



*FAB*



ません!



幸いなことに、非常に簡潔なソースコードを持つUNLZEXE.C



ファイルを自由にUNLZEXE.C



できました。 それから、オフセット1C



でEXEファイルを解凍するために、行"LZ91"



"LZ91"



必要があることが明らかになりました。 HEXエディターで4バイトを修正します-出来上がり! 8キロバイトから最大12を取得し、ファイルが起動され、IDAはコードの大きな山と人間が読める小さな行の山を示します。 どういう理由で陰湿なバイトがヘッダーに現れたのか、私にはわかりません。 Fabriceは、コンプレッサーの2つのバージョンのみをリリースしたと主張しており、両方に署名がありました。 私の推測では、これはコンプレッサー使用の痕跡を隠すために手動で行われたものです。 セーブ用の小さなトレーナーを作成するときにこれを行うのは別の謎です。



古代人の知恵



1つの質問が残っています-ゲームSkyCatのコンプレッサーの起源。 正確な答えはありませんが、予言があります。 上記のカエルプログラムは、1989年にニコライベズルコフによって設立されたプログラマ向けニュースレターであるSoftpanoramで公開されました。 Softpanoramaの主な目的は、ソースコードのプログラムの自由な交換とコンピューターウイルスに対する保護でした。 Fidonetが国内に広まる前にコミュニティが生まれたため、フロッピーディスクを送信してコピーすることで通信が行われました。 プログラミングに偏りがあり、別の重大な記事に値するような先史時代のHabrであることがわかります(そして、その当時の積極的な参加者の一人がそれを書くことが非常に望ましいです)。 Softpanoramaの問題の1つを読んだ後、国内企業Gamosの開発者は、国内のプログラマーKrasilnikovからオープンソースコードを借りることができそうです。



ハッピーエンド



神秘的なアルゴリズムの起源の検索が成功したため、落ち着いて満足しました。 そして、Softpanoramアーカイブに没頭することで忘れられない90年代のプログラミングニュースの世界に私を連れて行きました。 時代の精神に参加することをお勧めします。



All Articles