【发布时间】:2020-04-25 14:40:30
【问题描述】:
我正在使用 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/ 所遵循的教程
【问题讨论】:
-
尝试
objdump -d binary,其中binary是您拥有的二进制文件。objdump理解 ELF 二进制文件。无需先将它们转换为不同的格式。 -
请注意,ARM 二进制文件通常包含散布着代码的文字池。如果缺少适当的元数据(例如,如果二进制文件被剥离),则 objdump 无法将它们与指令区分开来,并会尝试反汇编它们,从而导致无意义的结果。您需要手动猜测什么是文字池,什么不是。
-
@old_timer 你确定吗?根据我对 ELF 的理解,它遵循带有部分的结构。该命令的目的是提取应该是代码的 .text 部分(例如,参见 ELF wiki 页面:en.wikipedia.org/wiki/Executable_and_Linkable_Format#/media/…)。 /bin 中的大多数文件实际上不是二进制文件,而是 ELF
-
@Dominus 这通常很容易看到,因为出来的说明通常相当荒谬。
-
@Dominus
objdump理解 ELF。使用选项-d它只反汇编那些通常包含代码的部分。无需先提取部分。