从 ELF ARM /bin 二进制文件中提取汇编指令

Extracting assembly instructions from ELF ARM /bin binaries

我是 运行 使用 QEMU 的 ARM 虚拟机,我想从一些标准 /bin 函数中反汇编字节码,例如 mountmkdir等等,以获取组装说明。

我所做的是首先进行对象复制: objcopy -O binary --only-section=.text mkdir mkdir.bin 然后拆解: objdump -m ARM -b binary -D mkdir.bin

但是,我得到的汇编代码是垃圾,有几个未定义的指令错误。 我也试过反汇编强制拇指模式: arm-linux-gnueabi-objdump -m ARM -b binary -D -Mforce-thumb mkdir.bin 又一次,说明似乎是垃圾。

我所说的垃圾是指尽管技术上正确但毫无意义的说明。

我不知道为什么会这样,我不确定问题出在哪里。是错误的命令吗?我不应该期望获得 ARM 汇编指令吗?

注意:这是我安装 QEMU 所遵循的教程 https://translatedcode.wordpress.com/2016/11/03/installing-debian-on-qemus-32-bit-arm-virt-board/

试试吧:

so.s

.globl _start
_start:
add r0,r1,r2
add r1,r2,r3
ldr r3,=skip
bx r3
.word 0x12345678
.hword 0xaaaa
.thumb
.thumb_func
skip:
add r0,r1,r2
add r1,r2,r3

并尝试一下:

arm-linux-gnueabi-as so.s -o so.o
arm-linux-gnueabi-objdump -D so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:   e0810002    add r0, r1, r2
   4:   e0821003    add r1, r2, r3
   8:   e59f300c    ldr r3, [pc, #12]   ; 1c <skip+0x6>
   c:   e12fff13    bx  r3
  10:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
  14:   1888aaaa    stmne   r8, {r1, r3, r5, r7, r9, fp, sp, pc}

00000016 <skip>:
  16:   1888        adds    r0, r1, r2
  18:   18d1        adds    r1, r2, r3
  1a:   00000000    andeq   r0, r0, r0
    ...

Disassembly of section .ARM.attributes:

00000000 <.ARM.attributes>:
   0:   00001541    andeq   r1, r0, r1, asr #10
   4:   61656100    cmnvs   r5, r0, lsl #2
   8:   01006962    tsteq   r0, r2, ror #18
   c:   0000000b    andeq   r0, r0, fp
  10:   01080206    tsteq   r8, r6, lsl #4
  14:   Address 0x0000000000000014 is out of bounds.

是的,objdump 反汇编了所有内容,包括数据和其他部分,但是哦,好吧。注意它是如何得到拇指和手臂的...

也可以是链接二进制文件。

arm-linux-gnueabi-ld -Ttext=0x8000 so.o -o so.elf
arm-linux-gnueabi-objdump -D so.elf

so.elf:     file format elf32-littlearm


Disassembly of section .text:

00008000 <_start>:
    8000:   e0810002    add r0, r1, r2
    8004:   e0821003    add r1, r2, r3
    8008:   e59f300c    ldr r3, [pc, #12]   ; 801c <skip+0x6>
    800c:   e12fff13    bx  r3
    8010:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
    8014:   1888aaaa    stmne   r8, {r1, r3, r5, r7, r9, fp, sp, pc}

00008016 <skip>:
    8016:   1888        adds    r0, r1, r2
    8018:   18d1        adds    r1, r2, r3
    801a:   80170000    andshi  r0, r7, r0
    ...

是的,总的来说这将是一团糟:

arm-linux-gnueabi-objcopy -O binary so.elf so.bin
arm-linux-gnueabi-objdump -m ARM -b binary -D so.bin

so.bin:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:   e0810002    add r0, r1, r2
   4:   e0821003    add r1, r2, r3
   8:   e59f300c    ldr r3, [pc, #12]   ; 0x1c
   c:   e12fff13    bx  r3
  10:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
  14:   1888aaaa    stmne   r8, {r1, r3, r5, r7, r9, fp, sp, pc}
  18:   000018d1    ldrdeq  r1, [r0], -r1   ; <UNPREDICTABLE>
  1c:   00008017    andeq   r8, r0, r7, lsl r0

它得到了正确的手臂但没有得到拇指,而且不会。让它只有拇指,它会得到拇指而不是手臂,永远不会。