メインコンテンツへスキップ

多くの命令セットに対応したllvm-mcを利用してシェル上でアセンブル、逆アセンブルする方法

··844 文字·2 分·
プログラミング ソフトウェア llvm-mc LLVM cli アセンブリ 逆アセ
著者
Admin
目次

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)

🔗https://blog.llvm.org/2010/01/x86-disassembler.html

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

Related

デバッグ時によく使うGDBコマンドメモ
··684 文字·2 分
ソフトウェア プログラミング GDB
[Linux] mmvで複数ファイルをパターンで一括でリネーム、コピー、移動する方法
··455 文字·1 分
Linux ソフトウェア mmv Linux
まったく、mmvは最高だぜ!!
VSCodeのCMakeToolsのUIからCMakeプロジェクトをconfigure&ビルドする際にパラメーター、設定をプロジェクト別に設定する
··844 文字·2 分
プログラミング VSCode CMakeTools
僕はCMakeを書き続けるべきだったんだ。誰のためでもなく、彼女のために