Итак, я пытаюсь сделать небольшого бота, чтобы автоматизировать некоторые скучные задачи в одиночной игре. Я пользователь 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), если так, есть ли какой-либо метод, чтобы вызвать детерминизм? Если это из-за динамического выделения адрес не должен быть в стеке? Почему он всегда в куче?
И что такое сканирование указателей? Я попытался искать, и все, что я нашел, это некоторые парни, использующие игровые тренажеры на окнах, я хотел бы знать, как это работает, и почему указатель является детерминированным.