因此,我正在尝试做一个小机器人来自动完成单人游戏中的一些无聊任务。我是Linux用户,所以我没有在Windows上运行的那些游戏培训师,此外,我还想了解有关内存分配xD的更多信息。
考虑到这一点,我想知道是什么可以使内存分配过程不确定。在我的首次测试中,我使用了以下代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
/**
* main - uses strdup to create a new string,loops forever-ever
*
* Return: EXIT_FAILURE if malloc failed. Other never returns
*/
int main(void)
{
char *s;
unsigned long int i;
s = strdup("Holberton");
if (s == NULL)
{
fprintf(stderr,"Can't allocate mem with malloc\n");
return (EXIT_FAILURE);
}
i = 0;
while (s)
{
printf("[%lu] %s (%p)\n",i,s,(void *)s);
sleep(1);
i++;
}
return (EXIT_SUCCESS);
}
此代码使用以下代码编译:
gcc -Wall -Wextra -pedantic -Werror loop.c -o loop
哪个返回这样的内容:
[0] Holberton (0x5619c31ca260)
[1] Holberton (0x5619c31ca260)
[2] Holberton (0x5619c31ca260)
[3] Holberton (0x5619c31ca260)
[4] Holberton (0x5619c31ca260)
因此,每次我运行此代码时,地址打印都会更改,然后我进行了一点搜索,发现最新的Linux发行版默认为安全性而激活了ASLR,从而避免了一些溢出漏洞。当我停用ASLR时,此代码开始打印始终相同的地址。好的,所以ASLR是原因之一。因此,我开始测试游戏(现在使用scanmen搜索地址),并且每次重新启动游戏时,所有地址都与上次运行的地址不同。
PS:在两种情况下(我的C代码和游戏中)创建的地址都在堆中。 PS2:可以在this git上阅读有关C代码的更多信息。
我想知道为什么会这样吗?这是因为游戏使用了动态分配(例如malloc),如果可以的话,是否有任何强制确定性的方法?如果是因为动态分配,那么该地址不应该放在堆栈中吗?为什么总是堆?
还有什么是指针扫描?我试图进行搜索,发现所有的人都是在Windows上使用游戏训练器的人,我想知道它是如何工作的,以及为什么指针是确定性的。