在Linux上确定内存分配的必要条件是什么?

因此,我正在尝试做一个小机器人来自动完成单人游戏中的一些无聊任务。我是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上使用游戏训练器的人,我想知道它是如何工作的,以及为什么指针是确定性的。

zfw19900506159 回答:在Linux上确定内存分配的必要条件是什么?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3132356.html

大家都在问