Intel X86 opcode Reference?

Co to jest stosunkowo szybka i łatwa metoda sprawdzania, co oznacza dowolny kod opcode (powiedzmy, 0xC8) w x86?

Podręcznik programisty Intela nie jest zbyt przyjemny do przeszukiwania...

Author: Mehrdad, 2011-06-19

7 answers

Sprawdź tę bardzo kompletną tabelę opcodów x86 na x86asm.net .

Po prostu CTRL+F i gotowe! Pamiętaj, aby przeczytać poprawną linię tho, ponieważ C8 na przykład może pojawić się w kilku miejscach.

 48
Author: user703016,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-19 09:32:18

Chociaż sam Podręcznik programisty Intela nie jest zbyt wygodny do przeszukiwania, tabele kodów opcode w tym podręczniku mogą pomóc. Spójrz na dodatek a "Mapa kodów Opcode" w tomie 2B podręcznika, może się przydać.

 13
Author: Eugene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-19 09:52:11

Tu jest całkiem ładny obraz. Nie wchodzi w szczegóły, ale jeśli chcesz szybko sprawdzić wartość szesnastkową, powinno to zrobić-

Opcode reference

Źródło: http://pnx.tf/files/x86_opcode_structure_and_instruction_overview.png

 13
Author: iliketocode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-31 08:15:27

Szybkie odniesienie do wyszukiwania kodów opcodes to sandpile . Potrzebuję dwóch kliknięć, aby dowiedzieć się, co robi 0xc8 (to enter, btw).

 6
Author: Gunther Piez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-20 09:30:50

Istnieje również projekt asmjit / asmdb , który dostarcza domenę publicznąx86/x64 bazy danych w formacie podobnym do JSON (jest to moduł węzła, wystarczy wymagać() go z węzła lub dołączyć w przeglądarce). Jest przeznaczony do dodatkowego przetwarzania (na przykład do zapisu walidatorów, asemblerów, disassemblerów), ale również bardzo łatwo jest po prostu otworzyć plik bazy danych i zbadać go.

AsmDB jest wyposażony w narzędzie o nazwie x86util.js, które mogą indeksować bazę danych x86 w znacznie bardziej przyjazny reprezentacja, która może być użyta do zrobienia czegoś z nią. Napiszmy proste narzędzie w node.js, który wyświetla wszystkie instrukcje, które mają ten sam bajt kodu opcode, jaki podałeś:

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]);

Spróbuj:

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

Dodatkowo, istnieją narzędzia wiersza poleceń, które mogą być używane do szybkiego i brudnego demontażu, ale wymagają one całej instrukcji( w przeciwieństwie do posiadania tylko bajtu opcode), oto kilka wskazówek:

Użycie llvm-mc z LLVM projekt:

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

Użycie ndisasm z nasm projekt:

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

Istnieje również asmgrid projekt tego samego autora co AsmDB. To work-in-progress online asmdb explorer, który używa kolorów do wizualizacji różnych właściwości każdej instrukcji.

 3
Author: Petr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 20:31:40

Inny sposób, używając debuggera (gdb, windbg, ollydbg, ...) lub disassembler (IDA), a następnie ustawia sekwencje bajtów w zapisywalnym regionie pamięci. Na koniec, demontaż pod adresem początkowym sekwencji bajtów.
Jest skomplikowany, ale przydatny w niektórych sytuacjach podczas pękania/cofania.

 2
Author: oDisPo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-07 20:13:34

Sandpile jest prawdopodobnie tym, czego szukasz. Mimo to, najlepszym sposobem patrzenia na kodowanie x86 nie jest szesnastkowe, lecz ósemkowe . Nagle x86 nie wygląda tak brzydko i ma jakiś sens. Klasyczne wyjaśnienie tego pochodzi z Usenetu alt.lang.asm circa 1992:

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

 2
Author: Olsonist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-13 21:43:52