我正在调整reko反编译器,以将Capstone用于其反汇编程序,而不是自己动手。我使用的是Capstone.NET提供的.NET绑定。策略是用Capstone拆装器替换旧的ARM拆装器,然后运行旧的单元测试以确保没有损坏。我现在大多数测试都通过了,但是操作码E1F322D1,旧的reko反汇编程序和ODA都会反汇编为:

 ldrsb r2, [r3, #33]!


但是,Capstone回应:

ldrsb r2,[r3,#&221]!


我没有其他方便的反汇编程序,所以我不确定该信任谁!

什么是正确的拆卸方法?

#1 楼

IDA同意第一个:

LDRSB R2, [R3,#33]!

Capstone可能试图显示类似#0x21之类的内容,这是等效的,但似乎出现了问题。 />

评论


确实,经过一些进一步的故障排除后,我将问题缩小到Capstone.NET并报告了。希望很快就会有修复程序。

– JohnKällén
15年8月11日在20:31



#2 楼

来自http://bear.ces.cwru.edu/eecs_382/ARM7-TDMI-manual-pt2.pdf:



E1F322D1等于二进制形式的11100001111100110010001011010001

您的问题是特定于偏移量的,因此我们可以根据上方屏幕快照中的分解规则来检查该二进制字符串的最后十二位:

... Offset 1 SH 1 Offset
...  0010  1 10 1  0001


因此,高半字节为0010,低半字节为0001。如果将它们组合在一起,我们将以二进制形式获得00100001,或者以十进制获得33

因此正确的反汇编是ldrsb r2, [r3, #33]!