Verificando opcodes de montagem Intel facilmente no Linux
Eu tenho procurado por uma ferramenta prática que imprima os códigos operacionais de qualquer instrução Intel de 64 bits ou 32 bits no Linux, por exemplo. algo comoHiew's
assembler no DOS. Um serviço baseado na web também seria uma opção.
Como não consegui encontrar nenhum, fiz o meu própriobash
script, que cria um arquivo de origem de montagem a partir de parâmetros de linha de comando (instrução [s] e <32/64>), compila, liga e desmonta e mostra as linhas corretas de desmontagem. Mas já existe algum programa que mostrariatodos as codificações possíveis para qualquer instrução dada, por exemplo. paramov eax,ebx
? Minha abordagem usandonasm
, ld
endisasm
obviamente só dá uma codificação possível para cada instrução.
Com este script eu posso obter as codificações usadas pornasm
para código de 64 e 32 bits, por exemplo:
/home/user/code/asm$ showop 'nop;add eax,ebx;cpuid' 64
00000000 90 nop
00000001 01D8 add eax,ebx
00000003 0FA2 cpuid
Mas como eu poderia obter facilmente todas as codificações opcode possíveis? Já existe algum programa disponível para isso?
Aqui está o código:
#!/bin/bash
# usage: showop instructions bits
asminstr=$1
bits=$2
# asminstr="nop;nop;nop;nop;add eax,ebx;nop;nop;nop"
# bits=64
numberofinstr=`echo $asminstr | grep -o ";" | wc -l`
((numberofinstr++))
if [ -f tempasmfile.asm ]
then
rm tempasmfile.asm
fi
if [ -f tempobjfile.o ]
then
rm tempobjfile.o
fi
if [ -f tempexefile ]
then
rm tempexefile
fi
printf "[bits $bits]\nsection .text\nglobal _start\n\n_start:\n`echo $asminstr | sed 's/;/\\n/g'`\n" >tempasmfile.asm
nasm -f elf$bits tempasmfile.asm -o tempobjfile.o
ld tempobjfile.o -o tempexefile
if [ $bits -eq 32 ]
then
ndisasm -b $bits -e 0x60 tempexefile | head -n $numberofinstr
elif [ $bits -eq 64 ]
then
ndisasm -b $bits -e 0x80 tempexefile | head -n $numberofinstr
fi
rm tempasmfile.asm
rm tempobjfile.o
rm tempexefile