现在我从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”。应该有一个工具来做到这一点。 任何人都可以给我一些建议吗?
答案 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
就是这样,我是这个领域的初学者,感谢所有帮助过我的人。如果您发现一些问题,请告诉我:))