泥臭い方法だけど、特に何も追加インストールする必要なくお手軽。
assembly -> opcode
アセンブルしてディスアセンブルする。otool
の -j
オプションで opcode も表示できる
opcode.rb
#!/usr/bin/env ruby
require 'tmpdir'
asm = ARGV.join(" ")
Dir.mktmpdir do |dir|
File.write("#{dir}/tmp.S", asm)
system("as #{dir}/tmp.S -o #{dir}/tmp.o")
system("otool -tvj #{dir}/tmp.o")
end
実行例
$ opcode.rb 'nop; mov $0x2,%rax'
/var/folders/.../tmp.o:
(__TEXT,__text) section
0000000000000000 90 nop
0000000000000001 48 c7 c0 02 00 00 00 movq $0x2, %rax
opcode -> assembly
.byte
で詰め込んでアセンブルしてディスアセンブルする。
disas.rb
#!/usr/bin/env ruby
require 'tmpdir'
asm = ".byte 0x" + ARGV.join.scan(/[0-9a-fA-F]{2}/).join(",0x")
Dir.mktmpdir do |dir|
File.write("#{dir}/tmp.S", asm)
system("as #{dir}/tmp.S -o #{dir}/tmp.o")
system("otool -tvj #{dir}/tmp.o")
end
実行例
$ disas.rb 48c7c00200000090
/var/folders/.../tmp.o:
(__TEXT,__text) section
0000000000000000 48 c7 c0 02 00 00 00 movq $0x2, %rax
0000000000000007 90 nop