我想问你如何确定指令编码的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的正确方法是什么?
感谢您的关注,希望您能帮助我。
答案 0 :(得分:2)
我不相信在混合模式二进制文件中可以不按照您的描述检查指令。
如果整个文件是一个ISA或另一个,那么你可以通过运行这个来确定入口点的ISA:
readelf -h ./arm_binary
检查入口点是偶数还是奇数。
然而,我要做的只是简单地将它拆开,看看看起来是对的。只要你在函数的开头(或任何4字节边界)开始反汇编,那么这将正常工作。当在错误的ISA中反汇编时,大多数代码都会产生废话。