14

私はコンパイラの魔法についてよく知りません。人間が読めるコード (または実際には読めないアセンブリ命令) を機械コードに変換する行為は、私にとっては魔法と組み合わされたロケット科学です。

この質問の対象を Win32 実行可能ファイル (.exe) に絞り込みます。これらのファイルを専用のビューアーで開くと、さまざまな場所に文字列 (通常は 1 文字あたり 16b) が散らばっていますが、残りはただのゴミです。読めない部分(大部分)はマシンコード(または画像などのリソースかもしれません...)だと思います。

マシンコードを読み取る簡単な方法はありますか? exe をファイル ストリームとして開き、バイト単位で読み取る場合、これらの個々のバイトをアセンブリに変換するにはどうすればよいでしょうか? これらの命令バイトとアセンブリ命令の間の直接的なマッピングはありますか?

.exeはどのように書かれていますか? 命令ごとに 4 バイト?もっと?以下?一部のアプリケーションが実行可能ファイルをこのように作成できることに気付きました。たとえば、ACD See では、一連の画像をスライドショーにエクスポートできます。ただし、これは必ずしも SWF スライドショーである必要はありません。ACD See は実行可能なプレゼンテーションを作成することもできます。それはどのように行われますか?

EXE ファイル内で何が行われているかを理解するにはどうすればよいですか?

4

13 に答える 13

15

OllyDbgは、EXE を読み取り可能な命令に分解し、命令を 1 つずつ実行できる素晴らしいツールです。また、プログラムが使用する API 関数と、可能であればプログラムが提供する引数 (引数がスタック上にある限り) も示します。

一般的に言えば、CPU 命令は可変長で、1 バイトのものもあれば、2 バイト、3 バイト、4 バイトのものもあります。ほとんどの場合、命令が期待するデータの種類によって異なります。CPUレジスタからメモリ内の場所に、またはその逆にデータを移動するようにCPUに指示する「mov」など、一部の命令は一般化されています。実際には、8 ビット、16 ビット、32 ビットのデータを処理する命令、さまざまなレジスタからデータを移動する命令など、さまざまな「mov」命令が存在します。

Dr. Paul Carter のPC Assembly Language Tutorialを手に入れることができます。これは、アセンブリと Intel 386 CPU の動作について説明している入門レベルの無料の本です。そのほとんどは、現代の消費者向け Intel CPU にも適用できます。

EXE 形式は Windows に固有です。エントリ ポイント (つまり、最初の実行可能命令) は通常、EXE ファイル内の同じ場所にあります。一度にすべてを説明するのは難しいですが、私が提供したリソースは、少なくともあなたの好奇心の一部を癒すのに役立つはずです! :)

于 2009-04-16T14:33:34.937 に答える
6

マシンコードをアセンブリ言語に変換する逆アセンブラが必要です。このウィキペディアのリンクでは、プロセスについて説明し、無料の逆アセンブラーへのリンクを提供しています。もちろん、アセンブリ言語を理解していないとおっしゃっているように、これはあまり参考にならないかもしれません。ここで正確に何をしようとしているのですか?

于 2009-04-16T14:30:57.890 に答える
5

表示される実行可能ファイルは、Microsoft の PE (Portable Executable) 形式です。これは基本的にコンテナであり、プログラムに関するオペレーティング システム固有のデータを保持し、プログラム データ自体をいくつかのセクションに分割します。たとえば、コード、リソース、静的データは別々のセクションに格納されます。

セクションの形式は、その内容によって異なります。コード セクションは、実行可能なターゲット アーキテクチャに従ってマシン コードを保持します。最も一般的なケースでは、これは Microsoft PE バイナリの Intel x86 または AMD-64 (EM64T と同じ) です。マシン コードの形式は CISC であり、元は 8086 以前にさかのぼります。CISC の重要な側面は、その命令サイズが一定ではないことです。価値のあるものを得るには、適切な場所から読み取りを開始する必要があります。Intel は、x86/x64 命令セットに関する優れたマニュアルを公開しています。

逆アセンブラを使用して、マシン コードを直接表示できます。マニュアルと組み合わせると、ほとんどの場合、ソース コードを推測できます。

そして、MSIL EXE があります。Microsoft の中間言語を保持する .NET 実行可能ファイルです。これらにはマシン固有のコードではなく、.NET CIL コードが含まれています。その仕様は ECMA でオンラインで入手できます。

これらは Reflector などのツールで表示できます。

于 2009-04-16T14:36:02.153 に答える
5

EXE ファイルの内容はPortable Executableに記載されています。ファイルのロード方法に関するコード、データ、および OS への指示が含まれています。

マシン コードとアセンブリの間には 1:1 のマッピングがあります。逆アセンブラ プログラムは逆の操作を実行します。

i386 では、命令ごとの固定バイト数はありません。1 バイトのものもあれば、もっと長いものもあります。

于 2009-04-16T14:38:33.037 に答える
4

コマンド ラインから debug を使用できますが、それは困難です。

C:\WINDOWS>debug taskman.exe
-u
0D69:0000 0E            PUSH    CS
0D69:0001 1F            POP     DS
0D69:0002 BA0E00        MOV     DX,000E
0D69:0005 B409          MOV     AH,09
0D69:0007 CD21          INT     21
0D69:0009 B8014C        MOV     AX,4C01
0D69:000C CD21          INT     21
0D69:000E 54            PUSH    SP
0D69:000F 68            DB      68
0D69:0010 69            DB      69
0D69:0011 7320          JNB     0033
0D69:0013 7072          JO      0087
0D69:0015 6F            DB      6F
0D69:0016 67            DB      67
0D69:0017 7261          JB      007A
0D69:0019 6D            DB      6D
0D69:001A 206361        AND     [BP+DI+61],AH
0D69:001D 6E            DB      6E
0D69:001E 6E            DB      6E
0D69:001F 6F            DB      6F
于 2009-04-16T14:29:23.137 に答える
2

この質問に関連して、CD 21 のようなものをまだ読んでいる人はいますか?

ある番組で Sandra Bullock を思い出しました。実際に 16 進数を画面一杯に読んで、プログラムが何をするかを理解していました。マトリックスコードを読む現在のバージョンのようなものです。

CD 21 のようなものを読む場合、さまざまな組み合わせをどのように覚えていますか?

于 2009-04-16T16:53:56.257 に答える
2

アイデアを得るには、興味深いコードにブレークポイントを設定してから、CPU ウィンドウに移動します。

さらに興味がある場合は、-al パラメーターを使用して Free Pascal で短いフラグメントをコンパイルする方が簡単です。

FPC では、 -A パラメータを使用して、生成されたアセンブラを多数のアセンブラ形式 (TASM、MASM、GAS) で出力できます。相互参照を容易にするために、元のパスカル コードをコメント (およびその他) にインターリーブすることができます。

逆アセンブルされた .exe からのアセンブラとは対照的に、これはコンパイラによって生成されたアセンブラであるため、よりシンボリックで従うのが簡単です。

于 2009-05-08T13:58:32.807 に答える
2

MSDN のWin32 exe 形式

Windows C のソース コードを少し取り、Visual Studio でビルドしてデバッグを開始することをお勧めします。逆アセンブリ ビューに切り替えて、コマンドをステップ オーバーします。C コードがどのようにマシン コードにコンパイルされたかを確認し、ステップごとに実行する様子を見ることができます。

于 2009-04-16T14:35:59.360 に答える
2

低レベルのアセンブリ (「マクロ」やその雄牛ではなく、低レベルのアセンブリを意味します) に精通していることは、おそらく必須です。生のマシンコード自体を本当に直接読みたい場合は、通常、16 進エディターを使用します。ただし、命令の機能を理解するために、ほとんどの人は逆アセンブラを使用して、それを適切なアセンブリ命令に変換します。あなたが機械語自体を理解したいと思っている少数派の 1 人なら、インテル® 64 および IA-32 アーキテクチャーのソフトウェア開発者向けマニュアルが必要になると思います。第 2 巻では、命令セットについて具体的に説明します。これは、マシン コード自体の読み取り方法とアセンブリとの関係についての質問に関連しています。

于 2009-09-25T05:15:38.370 に答える
2

それがあなたにとってそれほどなじみのないものである場合、デバッガーや逆アセンブラーが役立つとは思いません。最初にアセンブラー プログラミングを学ぶ必要があります。プロセッサのアーキテクチャを調べてください (Intel からダウンロード可能なドキュメントがたくさんあります)。そして、ほとんどのマシン コードはコンパイラによって生成されるため、コンパイラがコードを生成する方法を理解する必要があります。これは、多数の小さなプログラムを作成し、それらを逆アセンブルして、C/C++ がどのように変換されるかを確認する最も簡単な方法です。

あなたが理解するのに役立ついくつかの本: -

于 2009-04-16T14:50:56.533 に答える
1

ACD Seeはおそらく、.EXEファイルがファイルの長さやファイルの予想される部分の長さを超えるものをエラーチェックしないという事実を利用しています。このため、自分自身を開き、指定されたポイントを超えるすべてのものをデータとしてロードする.EXEファイルを作成できます。これは、適切に記述された.EXEの末尾にデータを追加するだけで、特定のデータセットで機能する.EXEを作成できるため便利です。

(ACD Seeが正確に何であるかはわかりませんが、大粒の塩でそれを取りますが、いくつかのプログラムがそのように生成されることは知っています。)

于 2009-04-17T18:55:34.083 に答える
1

あなたの好奇心と理解のレベルは、まさに私がかつていた場所です。Code: The Hidden Language of Computer Hardware and Software強くお勧めします。これは、あなたがここで尋ねるすべての質問に答えるわけではありませんが、コンピューターの完全に黒魔術的な側面のいくつかに光を当てます. 分厚い本ですが、とても読みやすいです。

于 2009-04-16T17:59:37.613 に答える