解码从ARM内存转储的数据的问题

时间:2013-01-25 00:34:50

标签: memory arm decode objdump

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

E.g。

  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”。应该有一个工具来做到这一点。 任何人都可以给我一些建议吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

objdump -D -b binary -marm <binary_file>

但是,对于指令编码也要小心,如果为arm编码选择thumb,结果会大不相同。请参阅objdump manual部分关于--disassembler-options=force-thumb

答案 2 :(得分: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

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