我一直在寻找一种实用的工具,可以在 Linux 中打印任何英特尔 64 位或 32 位指令的操作码,例如。类似于Hiew's
DOS 中的汇编程序。基于网络的服务也是一种选择。
由于找不到任何内容,我制作了自己的bash
脚本,从命令行参数(指令 [s] 和 <32/64>)创建汇编源文件,编译、链接和反汇编它并显示正确的行的拆卸。但是是否已经有一些程序可以显示任何给定指令的所有可能编码,例如。为mov eax,ebx
?我使用nasm
,ld
的方法ndisasm
显然只为每条指令提供了一种可能的编码。
使用此脚本,我可以获得nasm
64 位和 32 位代码使用的编码,例如:
/home/user/code/asm$ showop 'nop;add eax,ebx;cpuid' 64
00000000 90 nop
00000001 01D8 add eax,ebx
00000003 0FA2 cpuid
但是我怎样才能轻松获得所有可能的操作码编码呢?是否已经有一些可用的程序?
这是代码:
#!/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