objdump按照指定架构反汇编 裸二进制文件

objdump按照指定架构反汇编 裸二进制文件

因为某些特殊原因,不会把汇编代码直接编译成一个完整的可执行文件,直接编译成纯二进制的文件,以便读到内存中,供其他程序执行使用。例如:

/prj1$ cat bin.S
.globl _start
    .code16
_start:
    mov $0x3f8, %dx
    add %bl, %al
    add $'0', %al
    out %al, (%dx)
    mov $'\n', %al
    out %al, (%dx)

使用如下命令,编译成相应架构下的字节文件:

as -32 bin.S -o bin.o
ld -m elf_i386 --oformat binary -N -e _start -Ttext 0x10000 -o Bin.bin bin.o

如果这个文件是别人发送个你的,你想知道这个文件具体是在做什么话,可以写一个程序,把这个文件读内存中,gdb调试一下,就知道这个文件中的代码是干啥的。有时候,这样也不是很方便,我们可以采用objdump直接反汇编。由于bin.bin并没有编程成相应的可执行文件格式,所以objdump -S bin.bin是会失败的,如下所示:

/prj1$ objdump -S  bin.bin 
objdump: bin.bin: 不可识别的文件格式

我们查一下,本机的objdump支持哪些指令架构,直接objdump --help就可以看到:

objdump:支持的目标: elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 plugin srec symbolsrec verilog tekhex binary ihex
objdump:支持的体系结构: i386 i386:x86-64 i386:x64-32 i8086 i386:intel i386:x86-64:intel i386:x64-32:intel i386:nacl i386:x86-64:nacl i386:x64-32:nacl iamcu iamcu:intel l1om l1om:intel k1om k1om:intel plugin

下列 i386/x86-64 特定的反汇编器选项在使用 -M 开关时可用(使用逗号分隔多个选项):
  x86-64      Disassemble in 64bit mode
  i386        Disassemble in 32bit mode
  i8086       在 16 位模式下反汇编
  att         用 AT&T 语法显示指令
  intel       用 Intel 语法显示指令
  att-mnemonic
              Display instruction in AT&T mnemonic
  intel-mnemonic
              Display instruction in Intel mnemonic
  addr64      假定 64 位地址大小
  addr32      假定 32 位地址大小
  addr16      假定 16 位地址大小
  data32      假定 32 位数据大小
  data16      假定 16 位数据大小
  suffix      在 AT&T 语法中始终显示指令后缀
  amd64       Display instruction in AMD64 ISA
  intel64     Display instruction in Intel64 ISA

因为我们知道,这个文件是按照 i386汇编搞的,所以我们直接如下操作就行了:

/prj1$ objdump -m att  -b binary -D bin.bin 

bin.bin:     文件格式 binary

objdump: can't use supplied machine att
/prj1$ objdump -m i386  -b binary -D bin.bin 

bin.bin:     文件格式 binary


Disassembly of section .data:

00000000 <.data>:
   0:	ba f8 03 00 d8       	mov    $0xd80003f8,%edx
   5:	04 30                	add    $0x30,%al
   7:	ee                   	out    %al,(%dx)
   8:	b0 0a                	mov    $0xa,%al
   a:	ee                   	out    %al,(%dx)

att 方式是不对,反汇编失败
按照i386强行反汇编二进制文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值