assembly - 从 ELF ARM /bin 二进制文件中提取汇编指令
问题描述
我正在使用 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/
解决方案
就试一试吧:
所以.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
它得到了正确的手臂,但不是拇指,而且不会。只做拇指,它会得到拇指,但不会得到手臂,永远不会。
推荐阅读
- reactjs - React Native - @emotion/native - TextInput 占位符文本颜色属性
- python - Altair:使用双轴和日期时间 x 轴制作区间选择线图
- node.js - 防止节点在 600 MB 内存限制的 docker build 中耗尽内存
- rabbitmq - Rabbitmq 消息过期
- html - 使用 css 将 MDL 复选框居中
- java - 将字符串与文件中的另一个字符串进行比较
- r - 基于R中的第二个变量删除具有非唯一值的行?
- javascript - 如何让具有多个值的子组件更新父数据
- python - 使用 Python 的 matplotlib 在 x 轴上绘制时间
- javascript - 如何取消文档方法的关闭事件 - addEventListener('close')