为什么 vtable 函数指针有 +1?

逆向工程 艾达 拆卸 手臂 虚表
2021-06-29 07:36:12

因此,这里是一个字节序列45 A6 F7vtable
它指向位于 的子程序F7A644
IDA 表示为“function_symbol +1
为什么加一呢?
为什么是它45 A6 F7而不是44 A6 F7

1个回答

如果是可能使用 THUMB 编码的 ARM 架构,则可能是以下问题的结果:

如果我没记错的话,可以使用类似于BLX间接跳转的汇编命令来执行对虚拟函数的调用,这允许在 ARM 和 THUMB 编码之间切换。在这种情况下,这+ 1意味着跳转的目标是用 THUMB 编码的。

有关此机制的更多信息,请参见此处

所有这些指令都会导致一个分支到标签或包含在 Rm 中的地址。此外:

  • BL 和 BLX 指令将下一条指令的地址复制到 lr(r14,链接寄存器)中。
  • BX 和 BLX 指令可以将处理器状态从 ARM 更改为 Thumb,或从 Thumb 更改为 ARM。BLX 标签总是改变状态。BX Rm 和 BLX Rm 从 Rm 的位 [0] 导出目标状态:
  • 如果 Rm 的位 [0] 为 0,则处理器更改为或保持在 ARM 状态
  • 如果 Rm 的位 [0] 为 1,则处理器更改为或保持在 Thumb 状态。