我如何让 gnu 识别所有 ARMV7 指令?

逆向工程 手臂 操作码
2021-06-21 02:35:54

我用 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 识别指令?

1个回答

默认情况下,as, 对 arm 和 thumb 指令使用旧的“divided”语法。因此,它无法识别您的pop.w指令。

要使其工作,请.syntax unified在程序开头添加这告诉它使用新的统一语法,你会发现它组装pop.w成功。

有关更多详细信息,请参阅https://sourceware.org/binutils/docs-2.24/as/ARM_002dInstruction_002dSet.html