Справочник по коду Intel x86? - PullRequest
32 голосов
/ 19 июня 2011

Что такое относительно быстрый и простой метод поиска значения произвольного кода операции (скажем, 0xC8) в x86?

Руководство по разработке программного обеспечения Intel не очень интересно для поиска ...

Ответы [ 7 ]

49 голосов
/ 19 июня 2011

Проверьте эту очень полную таблицу кодов x86 на x86asm.net .

Просто CTRL+F и все готово!Обязательно прочитайте правильную строку, хотя, например, C8 может появляться в нескольких местах.

16 голосов
/ 09 сентября 2015

Вот довольно симпатичный рисунок.Не вдаваясь в подробности, но если вам просто нужно быстро найти шестнадцатеричное значение, это должно быть сделано -

Opcode reference

Источник:http://pnx.tf/files/x86_opcode_structure_and_instruction_overview.png

13 голосов
/ 19 июня 2011

Хотя само руководство Intel для разработчиков программного обеспечения определенно не очень удобно для поиска, таблицы кодов операций в этом руководстве могут помочь.Взгляните на Приложение A «Карта кодов операций» в томе 2B руководства, это может быть полезно.

6 голосов
/ 20 июня 2011

Быстрый справочник по поиску кодов операций: песочница .Мне нужно два клика, чтобы узнать, что делает 0xc8 (это enter, кстати).

4 голосов
/ 05 сентября 2016

Существует также проект asmjit / asmdb , который предоставляет общедоступную базу данных X86 / X64 в формате, подобном JSON (на самом деле это модуль узла, просто требуется () его из узел или включить в браузере). Он предназначен для дополнительной обработки (например, для написания валидаторов, ассемблеров, дизассемблеров), но также очень просто просто открыть файл базы данных и изучить его.

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-mc из LLVM проекта:

$ 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]

Использование ndisasm из nasm проекта:

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

Существует также проект AsmGrid от того же автора, что и AsmDB. Это интерактивный проводник AsmDB, который использует цвета для визуализации различных свойств каждой инструкции.

2 голосов
/ 14 августа 2016

Песочница - это, вероятно, то, что вы ищете. Тем не менее, лучший способ взглянуть на кодировку x86 не в шестнадцатеричном, а в восьмеричном . Внезапно x86 не выглядит так ужасно, и в этом есть какой-то смысл. Классическое объяснение этому от Usenet alt.lang.asm около 1992 года:

http://reocities.com/SiliconValley/heights/7052/opcode.txt

2 голосов
/ 08 июня 2012

Другой способ - использовать отладчик (gdb, windbg, ollydbg, ...) или дизассемблер (IDA), а затем установить последовательности байтов в области памяти, доступной для записи.Наконец, разборка по начальному адресу последовательности байтов.
Это сложно, но полезно в некоторых ситуациях, когда вы взламываете / разворачиваетесь.

...