指令反汇编程序ARM。 [ARM / Thumb模式]

时间:2014-07-29 14:00:16

标签: arm disassembly

我想问你如何确定指令编码的ISA(ARM / Thumb / Thumb-2)?

首先,我尝试按照instructions here(4.5.5节)进行操作。

但是,当我使用readelf -s ./arm_binary并且arm_binary是在发布模式下构建时,似乎二进制文件中没有.symtab。无论如何,我不明白如何使用此命令来查找说明的类型。

其次,我知道区分的另一种方法是查看ARM / Thumb指令的PC地址。如果它是偶数则它是Thumb指令,如果不是 - 那么ARM。但是如何在不将文件加载到内存的情况下执行此操作?当我解析文件的各个部分并找到执行部分时,我所拥有的只是文件中的起始(偏移)位置,文件偏移始终是偶数,并且它总是因为我们有大小相等的指令到2或4 ...

最后,检查的最后一种方法是检测BX Rm,从Rm中提取值,然后检查Rm中的地址是否均匀。但是,这可能很难,因为我需要模仿整个程序。

那么识别用于反汇编的ISA的正确方法是什么?

感谢您的关注,希望您能帮助我。

1 个答案:

答案 0 :(得分:2)

我不相信在混合模式二进制文件中可以不按照您的描述检查指令。

如果整个文件是一个ISA或另一个,那么你可以通过运行这个来确定入口点的ISA:

readelf -h ./arm_binary

检查入口点是偶数还是奇数。

然而,我要做的只是简单地将它拆开,看看看起来是对的。只要你在函数的开头(或任何4字节边界)开始反汇编,那么这将正常工作。当在错误的ISA中反汇编时,大多数代码都会产生废话。