我用 IDA 反汇编了一个 android 库,并希望在其中一个函数的末尾做一些额外的步骤。目前,BD E8 F0 8F在拇指模式下,最后一个指令字节是,IDA 将其反汇编为POP.W {R4-R11,PC}。
所以我找到了一小块未使用的空间,用POP.W那里的一个分支替换了,写了我的扩展,记得在我的程序开头放了一个.thumband .arch armv7a,然后用它完成了我的代码POP.W {R4-R11,PC}。不幸的是,从 arm 工具链中使用 gnu,这会导致Error: bad instruction pop.w '{R4-R11,PC}'
好的,gnu 不喜欢 .w 后缀,所以我用 .w 替换了指令POP {R4-R11,PC}。这会将错误消息更改为 Error: invalid register list to push/pop 指令——pop {R4-R11,PC}
我知道一些较旧的 ARM 芯片对从 R8 开始的寄存器可以做什么有限制,因此,为了验证,我将指令替换为POP {R4-R7,PC}.事实上,正如组装得很好。
现在不知道怎么继续了?
- 也许我必须为 as 提供另一种架构选择。但是 .arch armv7a 似乎是最新的,它对 android armv7a 库有效。
- 也许我完全跑题了,pop 指令实际上是两个独立指令的宏,它们依次弹出高低寄存器。但是,将单独的两字节指令 (
BD E8,F0 8F) 输入在线反汇编程序的结果似乎与从堆栈中弹出无关。
我还尝试在 IDA 的处理器选项中禁用宏,但没有任何改变。所以我倾向于认为字节序列是一个真正的 4 字节拇指模式操作码。
我还需要在我的程序中指定什么才能使 gnu 识别指令?