Статически назначить адрес памяти в программе c - PullRequest
1 голос
/ 05 мая 2020

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

Я полностью понимаю, что это может создать нежелательные условия / ситуацию.

1 Ответ

1 голос
/ 05 мая 2020

Вы можете использовать ampersand operator (&), чтобы указать указатель на указанный c адрес памяти. Однако ваша программа должна иметь возможность легально получить доступ к этому адресу, который определяется диапазоном адресов, который ваша ОС назначила вашей программе, в противном случае вы получите segmentation fault.

Пример кода :

void * p1 = (void *)0x28ff44;

Или, если вы хотите, чтобы это было указателем на символ:

char * p2 = (char *)0x28ff44;

PS

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

Вы можете указать здесь на проверьте, как вы можете прочитать адрес памяти, назначенный вашему процессу. Вы можете ввести данные во время выполнения, чтобы указать process id, чтобы получить путь к файлу .

Работайте вокруг

Поскольку вы упомянули, что это small test program, вы также можете сэкономить свои усилия, просто отключив randomization of memory addresses, отключив ASLR для тестирования вашей программы, вы просто отключите ASLR в linux, используя

echo 0 > /proc/sys/kernel/randomize_va_space

а затем запустите вашу программу, объявите и инициализируйте переменную, распечатайте ее адрес и затем жестко закодируйте этот адрес в вашей программе. Бин go !! Каждый раз, когда этот адрес будет использоваться, пока вы снова не включите ASLR.

Однако отключать ASLR небезопасно, и после тестирования вам следует снова включить ASLR, набрав

echo 1 > /proc/sys/kernel/randomize_va_space
...