过程臂拆卸帮助

逆向工程 拆卸 手臂
2021-06-19 11:43:15

我有一个 ARM 反汇编如下,如果你能帮助我理解它的作用,我会很高兴:

ldr R14 ,=0X1234
ldr r10 , [r14 , #0x555]
mov.w r15, #0x6666
add.w r10,r15,r10,lsl#15

我觉得:

  1. 在第一行r14 = 0X1234
  2. 在第二行r10 = r14+0x555
  3. 在第三行r15 = 0x6666

但是,我不明白第 4 行发生了什么。

1个回答

您对第 2 行的解释不正确。

ldr r10, [r14 , #0x555]

该指令将 0x555 和 r14 (0x1234) 的内容相加,得到值 0x1789(顺便说一下,没有存储回 r14)。然后将此值用作地址以从该地址的内存加载一个字(32 位)(请注意,这是某些 ARM 处理器可能不支持的未对齐访问)。因此,在执行第 2 行之后,r10 包含从内存地址 0x1789(在您的示例中未给出)加载的值。

add.w r10,r15,r10,lsl#15

然后,第 4 行获取 r10 中的值,将其向左移动 15 位(指令的 lsl #15 部分 - 这本质上是 ARM 上的自由操作,因为 ALU 在第二个 ALU 前面包含一个桶形移位器输入)并将此移位值添加到 r15 (0x6666) 中的值,将结果存储回 r10。

您可能想了解更多有关 ARM 寻址模式的详细信息,例如从这张幻灯片集

请注意,在 ARM 代码中使用 r14 非常不寻常,因为该寄存器通常用作链接寄存器 (LR),它存储子程序调用的返回地址。

使用 r15 问题更大,因为该寄存器用作程序计数器(我假设您的原始反汇编使用不同的寄存器)。如果你的代码真的使用了r15,第3行的指令

mov.w r15, #0x6666

似乎导致处理器继续在地址 0x6666 处执行(实际上是跳转),因此第 4 行根本不会执行。

但是,这会导致这里出现异常,因为要么 (1) 您在 ARM 中运行更多并且 32 位 ARM 指令必须坚持四字节对齐(0x6666 不能被 4 整除)或 (2) 您正在运行 THUMB代码。这允许两个字节对齐,因此 0x6666 将是一个有效的目标地址。唉,支持 THUMB 的 ARM CPU 使用要求设置目标地址中的位 0 来指示目标地址处的 THUMB 代码的约定,这里没有设置。所以无论如何,第 3 行都会导致异常。