15

Macでx86_64のアセンブリコードを見ると、次の手順が表示されます。

48 c7 c0 01 00 00 00  movq    $0x1,%rax

しかし、オペコードを分解するリファレンスはどこにも見つかりません。48c7は移動命令、c0は%raxレジスタなどを定義しているようです。

それで、私にすべてを教えてくれるリファレンスをどこで見つけることができますか?

http://ref.x86asm.net/を知っていますが、48個のオペコードを見ると、動きに似たものは見当たりません。

4

2 に答える 2

21

実際、そこにmov0xc7があります。この場合、0x48はロングモードのREX.Wプレフィックスです。

コメントの質問にも答えます:0xc0はb11000000です。ここで、REX.B = 0(REXプレフィックスが0x48であるため、.Bビットが設定されていない)、0xc0は「RAXが最初のオペランド」(Intel構文mov rax, 1ではRAXが最初、またはmov出力オペランドの場合)を意味することがわかります。ModR/Mの読み方はこちらでご覧いただけます

于 2012-06-24T19:58:01.570 に答える
3

バイナリを見ると

 48 c7 c0 01 00 00 00

その意味を理解するためにそれを分解する必要があります。

逆アセンブルのアルゴリズムは難しくありませんが、複雑です。複数のテーブルを検索することを想定しています。

アルゴリズムについては、インテル開発者マニュアルの第2巻で説明されています。

Intel® 64 and IA-32 Architectures
Software Developer’s Manual
Volume 2 (2A, 2B & 2C):
Instruction Set Reference, A-Z

あなたはと呼ばれる章から読み始めますINSTRUCTION FORMAT

または、このトピックに関する章全体を取り上げた優れた本があります。

  X86 Instruction Set Architecture, Mindshare, by Tom  Shanley.

章全体がバイナリX86の分解に専念しています。

または、AMDが作成した同じ言語のマニュアルから一般的なアルゴリズムを読み始めることができます。

AMD64 Architecture
Programmer’s Manual
Volume 3:
General-Purpose and System Instructions

ここでは、この章で、Instruction Encodingこの命令言語を定義するオートマトンを見つけます。このグラフィカルスキームから、デコーダーを簡単に作成できます。

これを行った後、インテルのマニュアル、第2巻に戻って、参考書として使用できます。

また、http://opensecuritytraining.info/のリバースエンジニアリングクラスも役に立ちました。このサイトはCMUの博士課程の学生によって作成されており、そのほとんどはうまくいっていませんが、勉強して適用するには長い時間がかかります。

基本的なアイデアを理解したら、アルゴリズムを実装する無料のプロジェクトを調べることができます。私はdistormプロジェクトが役に立ちました。最初は、迷子になるのと同じコードで多くの言語のdissasemblerを実装しようとする抽象的なプロジェクト(qemuやobjdumpなど)を見ないことが重要です。 Distormx86のみに焦点を当て、正しく徹底的に実装します。これは正式な言語でX86言語の定義を伝えますが、IntelおよびAMDのマニュアルは自然言語を使用してX86言語を定義します。

うまく機能する他のプロジェクトはudis86です。

于 2016-08-11T12:55:59.343 に答える