从 ELF ARM /bin 二进制文件中提取汇编指令
Extracting assembly instructions from ELF ARM /bin binaries
我是 运行 使用 QEMU 的 ARM 虚拟机,我想从一些标准 /bin
函数中反汇编字节码,例如 mount
、mkdir
等等,以获取组装说明。
我所做的是首先进行对象复制:
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
它得到了正确的手臂但没有得到拇指,而且不会。让它只有拇指,它会得到拇指而不是手臂,永远不会。
我是 运行 使用 QEMU 的 ARM 虚拟机,我想从一些标准 /bin
函数中反汇编字节码,例如 mount
、mkdir
等等,以获取组装说明。
我所做的是首先进行对象复制:
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
它得到了正确的手臂但没有得到拇指,而且不会。让它只有拇指,它会得到拇指而不是手臂,永远不会。