Comprobando fácilmente los códigos de operación de ensamblaje Intel en Linux
He estado buscando una herramienta práctica que imprima los códigos de operación de cualquier instrucción Intel de 64 bits o 32 bits en Linux, por ejemplo. algo comoHiew's
ensamblador en DOS. Un servicio basado en la web también sería una opción.
Como no pude encontrar ninguna, hice mi propiabash
El script, que crea un archivo fuente de ensamblaje a partir de los parámetros de la línea de comando (instrucciones [s] y <32/64>), lo compila, lo enlaza y lo desarma y muestra las filas correctas de desensamblaje. Pero ¿ya hay algún programa que mostrara?todos las posibles codificaciones para cualquier instrucción dada, ej. paramov eax,ebx
? Mi enfoque utilizandonasm
, ld
yndisasm
Obviamente solo da una posible codificación para cada instrucción.
Con este script puedo obtener las codificaciones utilizadas pornasm
para código de 64 y 32 bits, por ejemplo:
/home/user/code/asm$ showop 'nop;add eax,ebx;cpuid' 64
00000000 90 nop
00000001 01D8 add eax,ebx
00000003 0FA2 cpuid
Pero, ¿cómo podría obtener fácilmente todas las posibles codificaciones de opcode? ¿Ya hay algún programa disponible para eso?
Aquí está el 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