ARM程序集 - 向SP(堆栈指针)添加内容是什么意思?

时间:2014-07-24 10:52:27

标签: assembly arm reverse-engineering cracking

基本上我试图反击一个drone hack,它为我的游戏中的黑客提供了一些优势。在其中有一个injectHack函数,它在开始时执行此操作:

//This is the function: injectHack(char*, int, char*, int)
push {r4, r5, r6, r7, lr} //Pushes args in reverse order + the link register
add r7, sp, #0xc //What is it doing here? Adding r7(the first char*) to the stack pointer? And what is #0xc?

还有一些行存储一些固定地址,如下所示:

ldr r0, [r0]
str r0, [r7, #0xffffffbc]
ldr r0, [r0]

我没有得到它,它无缘无故地从r0加载到r0两次?这个地址可能是他们要挂钩的功能吗?

1 个答案:

答案 0 :(得分:2)

arm架构参考手册可以很好地解释伪代码中的内容。

是的,有效地以相反的数字顺序推送寄存器,首先按下最大数字寄存器(r14)然后按r7,依此类推。

arm调用约定使用r0-r3作为参数,可能有一个例外你不能保留其他寄存器而不保留它们因此r4-r7在这种情况下被保存以及lr,这个函数很可能调用另一个函数。注意,正在推送奇数个寄存器,因此这是一个较旧的调用约定,当前的寄存器始终使堆栈指针保持64位对齐。

add r7没有修改sp,它只是指针进入堆栈。 0x00(r4)0x04(r5)0x08(r6)0x0C(r7)

中的第四个字

所以他们正在指向r7中的任何值,非常奇怪,但也许你正在寻找它。

注意从地址r0加载r0,修改r0,pointer = * pointer;然后该地址保存在r7 - 0x44中的地址,无论指向何处。他们用r0中的指针进入另一个间接层,指针= *指针。

这就是你为我们提供的所有内容,但是如果你从infocenter.arm.com获得一份手臂架构参考手册,你可以查看说明并阅读伪代码。完全理解每一条指令。

ARM架构过程调用标准(AAPCS)在适当命名的"Procedure Call Standard for the ARM Architecture"文档中进行了描述。还有另一个文档描述了64位ARM体系结构(AAPCS64)的过程调用标准。