使用objdump反汇编平面二进制文件

Mul*_*ike 30 reverse-engineering objdump disassembly

我可以使用objdump反汇编平面二进制文件吗?

我熟悉使用以下方法反汇编结构化二进制可执行文件,例如ELF文件:

objdump -d file.elf
Run Code Online (Sandbox Code Playgroud)

但是,如果我有一个我知道应该加载的平面二进制文件,例如地址0xabcd1000,我可以请求objdump反汇编吗?我尝试提供诸如'--start-address = 0xabcd1000'之类的选项,但是objdump只是声明它不能识别格式.

我有关于如何反汇编文件的其他想法,但我想知道objdump是否可以提供一个简单的解决方案.

Mul*_*ike 36

我在另一个论坛上找到了我自己的问题的解决方案.它看起来像这样:

objdump -b binary --adjust-vma=0xabcd1000 -D file.bin
Run Code Online (Sandbox Code Playgroud)

我已经测试了这个并且它有效.

  • 返回不能拆解建筑未知!好像你在我的情况下错过了机器选项`-m i386` (13认同)
  • 对于x86-64,需要将架构指定为-m i386:x86-64 (4认同)
  • 你可以省略--adjust-vma = 0xabcd1000 (2认同)
  • 当您想要考虑内存中已编译的代码段的不同起始地址时,“--adjust-vma=..”非常有用。否则,它将反汇编它,就好像它是从内存地址 0 开始加载的一样,但情况可能并非如此。还可以使用“--start-address=..”从二进制文件中的不同起始偏移量进行反汇编。 (2认同)

mir*_*los 19

starbluehlovdal都具有典型的答案的一部分.如果你想反汇编原始的i8086代码,你通常也需要英特尔语法,而不是AT&T语法,所以使用:

objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin    # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin  # for 64-bit code
Run Code Online (Sandbox Code Playgroud)

如果您的代码是ELF(或a.out(或(E)COFF)),您可以使用简短形式:

objdump -D -Mintel,i8086 a.out  # disassembles the entire file
objdump -d -Mintel,i8086 a.out  # disassembles only code sections
Run Code Online (Sandbox Code Playgroud)

对于32位或64位代码,省略,8086; ELF标头已包含此信息.

ndisasm,正如jameslin所建议的,也是一个不错的选择,但objdump通常附带操作系统,可以处理GNU binutils支持的所有架构(GCC支持的超集),其输出通常可以输入GNU as(ndisasm通常可以nasm但是当然要被喂入.

彼得·科德斯暗示" Agner Fog的objconv非常好.它将标签放在分支目标上,使得更容易弄清楚代码的作用.它可以反汇编成NASM,YASM,MASM或AT&T(GNU)语法."

多媒体迈克已经发现了--adjust-vma; 在ndisasm相当于是-o选项.

要反汇编sh4代码(我使用Debian中的一个二进制文件进行测试),请将其与GNU binutils一起使用(几乎所有其他反汇编程序仅限于一个平台,例如带有ndisasm和的x86 objconv):

objdump -D -b binary -m sh -EL x
Run Code Online (Sandbox Code Playgroud)

-m是机器,-EL意味着Little Endian(代替sh4eb使用-EB),它与任何字节序中存在的体系结构相关.