Что необходимо, чтобы распределение памяти было детерминированным в Linux? - PullRequest
2 голосов
/ 09 ноября 2019

Итак, я пытаюсь сделать небольшого бота, чтобы автоматизировать некоторые скучные задачи в одиночной игре. Я пользователь 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:Адреса, найденные в обоих случаях (мой код на С и в игре) находятся в куче. PS2: Возможно узнать больше о коде C на этом git .

Я хотел бы знать, почему это происходит? Это потому, что игра использует динамическое распределение (например, malloc), если так, есть ли какой-либо метод, чтобы вызвать детерминизм? Если это из-за динамического выделения адрес не должен быть в стеке? Почему он всегда в куче?

И что такое сканирование указателей? Я попытался искать, и все, что я нашел, это некоторые парни, использующие игровые тренажеры на окнах, я хотел бы знать, как это работает, и почему указатель является детерминированным.

...