【发布时间】:2014-09-15 21:20:32
【问题描述】:
基本上,我正在尝试反击 dlyb 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 两次?这个地址会不会是他们要挂钩的函数?
【问题讨论】:
-
add r7, sp, #0xc将堆栈指针的当前值和立即数 0xc(十进制的 12)相加,并将结果存储在r7。 -
另外,
r4-r7不包含函数参数;r0-r3做。推送r4-r7的原因是函数必须保留这些寄存器的值。 -
所以堆栈的顶部值增加了 12?最后推送的东西不是链接寄存器吗?那么函数又回到了不同的点?
-
不,
add r7, sp, #0xc不会更改堆栈上的任何内容,也不会更改堆栈指针本身。它获取堆栈指针的值(即当前堆栈顶部的地址),将值 12 添加到它并将结果放入不同的寄存器(r7)。 -
第二部分类似于
struct node { struct node *next; ...},带有'C'代码struct node *n = root; local = n; n = n->next;。即,ldr r0, [r0]正在遍历一些指针列表/结构。
标签: assembly arm reverse-engineering cracking