39

x86で任意のオペコード(たとえば)が何を意味するかを調べるための比較的迅速で簡単な方法は何ですか?0xC8

インテルソフトウェア開発者用マニュアルは、検索するのが面白くありません...

4

7 に答える 7

54

x86asm.netでx86オペコードのこの非常に完全な表を確認してください。

これCTRL+Fで完了です。C8たとえば、いくつかの場所に表示される可能性があるため、必ず正しい行を読んでください。

于 2011-06-19T09:32:18.083 に答える
25

これはかなりいいビジュアルです。詳細については説明しませんが、16進値をすばやく検索する必要がある場合は、これで十分です-

オペコードリファレンス

ソース: http: //pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf

于 2015-09-09T19:25:54.193 に答える
15

Intel Software Developer's Manual自体は検索するのに非常に便利ではありませんが、このマニュアルのオペコード表が役立つ場合があります。マニュアルのボリューム2A、2B、2C、および2Dの付録A「オペコードマップ」を参照してください。役立つ場合があります。

付録Aオペコードマップ目次

于 2011-06-19T09:52:11.527 に答える
8

asmjit / asmdbプロジェクトもあります。これは、パブリックドメインX86 / X64データベースをJSONのような形式で提供します(実際にはノードモジュールであり、ノードからrequire()するか、ブラウザーに含めます)。追加の処理(たとえば、バリデーター、アセンブラー、逆アセンブラーの作成)用に設計されていますが、データベースファイルを開いて探索することも非常に簡単です。

AsmDBには、x86util.jsというツールが付属しています。このツールを使用すると、x86データベースをより使いやすい表現にインデックス付けして、実際に何かを実行することができます。あなたが提供したものと同じオペコードバイトを持つすべての命令を出力する簡単なツールをnode.jsに書いてみましょう:

const asmdb = require("asmdb");
const x86isa = new asmdb.x86.ISA();

function printByOpCode(opcode) {
  x86isa.instructions.forEach(function(inst) {
    if (inst.opcodeHex === opcode) {
      const ops = inst.operands.map(function(op) { return op.data; });
      console.log(`INSTRUCTION '${inst.name} ${ops.join(", ")}' -> '${inst.opcodeString}'`);
    }
  });
}

if (process.argv.length < 3)
  console.log("USAGE: node x86search.js XX (opcode)")
else
  printByOpCode(process.argv[2]);

それを試してみてください:

$ node x86search.js A9
INSTRUCTION 'pop gs' -> '0F A9'
INSTRUCTION 'test ax, iw' -> '66 A9 iw'
INSTRUCTION 'test eax, id' -> 'A9 id'
INSTRUCTION 'test rax, id' -> 'REX.W A9 id'
INSTRUCTION 'vfmadd213sd xmm, xmm, xmm/m64' -> 'VEX.DDS.LIG.66.0F38.W1 A9 /r'
INSTRUCTION 'vfmadd213sd xmm, xmm, xmm/m64' -> 'EVEX.DDS.LIG.66.0F38.W1 A9 /r'
INSTRUCTION 'vfmadd213ss xmm, xmm, xmm/m32' -> 'VEX.DDS.LIG.66.0F38.W0 A9 /r'
INSTRUCTION 'vfmadd213ss xmm, xmm, xmm/m32' -> 'EVEX.DDS.LIG.66.0F38.W0 A9 /r'

$ node x86search.js FF
INSTRUCTION 'call r32/m32' -> 'FF /2'
INSTRUCTION 'call r64/m64' -> 'FF /2'
INSTRUCTION 'dec r16/m16' -> '66 FF /1'
INSTRUCTION 'dec r32/m32' -> 'FF /1'
INSTRUCTION 'dec r64/m64' -> 'REX.W FF /1'
INSTRUCTION 'fcos ' -> 'D9 FF'
INSTRUCTION 'inc r16/m16' -> '66 FF /0'
INSTRUCTION 'inc r32/m32' -> 'FF /0'
INSTRUCTION 'inc r64/m64' -> 'REX.W FF /0'
INSTRUCTION 'jmp r32/m32' -> 'FF /4'
INSTRUCTION 'jmp r64/m64' -> 'FF /4'
INSTRUCTION 'push r16/m16' -> '66 FF /6'
INSTRUCTION 'push r32/m32' -> 'FF /6'
INSTRUCTION 'push r64/m64' -> 'FF /6'

さらに、すばやくダーティな逆アセンブルに使用できるコマンドラインツールがありますが、これらには(オペコードバイトだけを持つのとは対照的に)命令全体が必要です。ここにいくつかのヒントがあります。

LLVMプロジェクトからのllvm-mcの使用:

$ echo "0x0f 0x28 0x44 0xd8 0x10" | llvm-mc -disassemble -triple=x86_64 -output-asm-variant=1
.text
movaps xmm0, xmmword ptr [rax + 8*rbx + 16]

nasmプロジェクトのndisasmを使用する:

$ echo -n -e '\x0f\x28\x44\xd8\x10' | ndisasm -b64 -
00000000 0F2844D810 movaps xmm0,oword [rax+rbx*8+0x10]

AsmDBと同じ作者によるAsmGridプロジェクトもあります。これは、進行中のオンラインAsmDBエクスプローラーであり、色を使用して各命令のさまざまなプロパティを視覚化します。

于 2016-09-05T17:41:50.900 に答える
7

オペコードを検索するための高速リファレンスはsandpileです。0xc8が何をするかを知るために2回クリックする必要があります(それはenter、ところで)。

于 2011-06-20T09:30:50.803 に答える
4

サンドパイルはおそらくあなたが探しているものです。それでも、x86エンコーディングを確認する最良の方法は、16進数ではなく、8進数です。突然、x86はそれほど醜く見えなくなり、ある程度意味があります。

これに関する古典的な説明は、1992年頃のUsenet alt.lang.asmで入手できましたが、今日はgithubで入手できます。

于 2016-08-13T21:43:52.987 に答える
3

別の方法として、デバッガー(gdb、windbg、ollydbg、...)または逆アセンブラー(IDA)を使用して、書き込み可能なメモリ領域にバイトシーケンスを設定します。最後に、そのバイトシーケンスの開始アドレスで分解します。
継ぎ目は複雑ですが、クラッキング/反転する場合に役立ちます。

于 2012-06-07T20:13:34.753 に答える