2

现在我从 ARM 机器的内存中转储了一些内容。问题实际上是它们是 ARM 指令,但我不知道如何将这些十六进制数字转换为 ARM 指令。我现在拥有的是“arm-elf-objdump”可以读取.bin文件并反汇编.bin文件中的内容。但我只有与二进制文件不同的十六进制数字文本。我该怎么做这个解码?

例如

  800104:       e3a00000        mov     r0, #0  ; 0x0
  800108:       e59f104c        ldr     r1, [pc, #76]   ; 80015c <_jump_main+0x4>
  80010c:       e59f204c        ldr     r2, [pc, #76]   ; 800160 <_jump_main+0x8>

实际上“e3a00000”的意思是“mov r0,#0”。应该有一个工具来做到这一点。任何人都可以给我一些建议吗?

4

3 回答 3

1

您正在寻找的工具称为“反汇编程序”。如您所见,一个常见的是 GNU objdump。我不确定它是否可以处理文本输入,但如果需要,您可以编写一个简单的程序将其转换回二进制文件。

于 2013-01-25T00:37:21.897 回答
1

将您的文本文件转换为二进制文件,即使您必须自己编写脚本/应用程序然后使用 objdump 进行反汇编,这也应该是微不足道的。

objdump -D -b binary -marm <binary_file>

arm但是也要注意指令编码,如果你选择编码,你会得到截然不同的结果thumb。请参阅objdump 手册部分关于--disassembler-options=force-thumb.

于 2013-01-25T08:16:59.953 回答
0

好的,因为我已经完成了这项任务,我会回答我自己的问题,所以也许有人可以从我的回答中得到帮助。

我的问题由两部分组成:第一部分是我不清楚“arm-elf-objdump”是如何工作的。就我而言,我使用

arm-elf-objdump -D -b binary -marm binaryfile.dat

如果 binaryfile.dat 正确,这将有助于反汇编 ARM 代码。

第二个问题是如何使 binaryfile.dat 正确。例如,

800104:       e3a00000        mov     r0, #0  ; 0x0

当我从 RAM 中转储十六进制数 e3a00000 时,实际上我几乎得到了指令。然后我用

const uint8_t num=0xe3a00000;
fp = fopen("binaryfile.dat", "wb+");
fwrite(&num, sizeof(const uint8_t), 1, fp);

这将在 binaryfile.dat 中写入“e3a00000”,这是一个二进制文件(在 Linux 中)。然后我用

hexer binaryfile.dat 

检查并发现它是正确的,然后使用

arm-elf-objdump -D -b binary -marm binaryfile.dat

我得到的是

> arm-elf-objdump -D -b binary -marm binaryfile.dat
binaryfile.dat:     file format binary

Disassembly of section .data:

0000000000000000 <.data>:
0:  e3a00000    mov r0, #0  ; 0x0

就是这样,我是这个领域的初学者,感谢所有帮助过我的人。如果您发现一些问题,请告诉我:)

于 2013-01-29T00:14:02.390 回答