llvm-mcとは #
LLVMプロジェクト(🔗https://llvm.org/)のcliツール。
多くの命令セットでアセンブル、逆アセンブルを行うことができる。
🔗https://llvm.org/docs/CommandGuide/llvm-mc.html
objdumpの代替になるかもしれない。
LLVMのインストール #
LLVMを導入すればついてくるはず。
LLVMは環境のパッケージマネージャーに入っているはず。
公式のaptリポジトリも提供されているので最新版を入れるときはそちらを利用すると便利。
🔗https://apt.llvm.org/
which llvm-mc
でインストールされているかどうか確認。
使用例 #
逆アセ #
opcodeを打ち込んで逆アセ #
echo '0x0f 0x1 0x9' | llvm-mc -disassemble --triple=x86_64-apple-darwin9
出力
.section __TEXT,__text,regular,pure_instructions
sidtq (%rcx)
hexdumpと組み合わせてバイナリのダンプを逆アセ #
hexdump -ve '1/1 "0x%.2x "' target_file | llvm-mc -disassemble --triple=armeb-pc-linux-gnu
警告が出ると長くて見にくいので ... > out.txt
とすれば出力だけ保存できる。
アセンブル #
アセンブリを渡すだけ。
echo 'movq %rcx, 0; xorq %rax, %rax; retq; ud2' | llvm-mc --assemble -show-encoding --triple=x86_64-pc-windows-msvc
.text
movq %rcx, 0 # encoding: [0x48,0x89,0x0c,0x25,0x00,0x00,0x00,0x00]
xorq %rax, %rax # encoding: [0x48,0x31,0xc0]
retq # encoding: [0xc3]
ud2 # encoding: [0x0f,0x0b]
-show-encoding
を指定するとopcodeを右側に表示してくれる。
命令セットの変更 #
--triple
を指定することによって様々な命令セットに対応できるのが強み。
利用可能なターゲットの一覧はllvm-mc -version
で確認できる。
一覧(参考)
LLVM version 14.0.6
Optimized build.
Default target: x86_64-pc-linux-gnu
Host CPU: skylake
Registered Targets:
aarch64 - AArch64 (little endian)
aarch64_32 - AArch64 (little endian ILP32)
aarch64_be - AArch64 (big endian)
amdgcn - AMD GCN GPUs
arm - ARM
arm64 - ARM64 (little endian)
arm64_32 - ARM64 (little endian ILP32)
armeb - ARM (big endian)
avr - Atmel AVR Microcontroller
bpf - BPF (host endian)
bpfeb - BPF (big endian)
bpfel - BPF (little endian)
hexagon - Hexagon
lanai - Lanai
m68k - Motorola 68000 family
mips - MIPS (32-bit big endian)
mips64 - MIPS (64-bit big endian)
mips64el - MIPS (64-bit little endian)
mipsel - MIPS (32-bit little endian)
msp430 - MSP430 [experimental]
nvptx - NVIDIA PTX 32-bit
nvptx64 - NVIDIA PTX 64-bit
ppc32 - PowerPC 32
ppc32le - PowerPC 32 LE
ppc64 - PowerPC 64
ppc64le - PowerPC 64 LE
r600 - AMD GPUs HD2XXX-HD6XXX
riscv32 - 32-bit RISC-V
riscv64 - 64-bit RISC-V
sparc - Sparc
sparcel - Sparc LE
sparcv9 - Sparc V9
systemz - SystemZ
thumb - Thumb
thumbeb - Thumb (big endian)
ve - VE
wasm32 - WebAssembly 32-bit
wasm64 - WebAssembly 64-bit
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
xcore - XCore