Меняются ли адреса памяти и как их можно найти динамически? - PullRequest
1 голос
/ 16 декабря 2011

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

Помимо изменений в самой программе, должен ли я беспокоиться об этом?Я заметил, что мой редактор памяти сохраняет адреса относительно местоположения .exe (например, program.exe + 198F6C), и я хотел бы реализовать свою программу таким образом, но я не мог найти какой-либо метод для получения текущегоадрес программы .exe в C ++.

Ответы [ 4 ]

5 голосов
/ 16 декабря 2011

Да, они меняются.

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

2 голосов
/ 16 декабря 2011

Здесь есть две проблемы: расположение переменных внутри пространства памяти процесса и расположение процесса в физической памяти.Первое должно касаться вас, второе не должно.

Локальные переменные (а также глобальные / статические переменные) будут иметь тот же адрес относительно относительно расположения программы в памяти.Динамически размещенные переменные (new / malloc) будут каждый раз иметь разные адреса.

Когда я говорю «память», я имею в виду пространство виртуальной памяти определенного процесса: адрес 0x100 в одном процессе не равен 0x100в другом процессе и вообще отличается от номера ячейки 0x100 в вашей оперативной памяти.Фактический адрес обычно не интересен, потому что и ReadProcessMemory, и ваш редактор памяти работают только с этими относительными адресами.Вам не нужно расположение программы.exe.

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

1 голос
/ 16 декабря 2011

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

0 голосов
/ 16 декабря 2011

Вы также столкнетесь с проблемами параллелизма при множественном доступе к одной и той же области памяти.

Правильный порядок - W1a, W1b, R1a, R1b, W2a, W2b, R2a, R2b Неправильный порядок - W1a, W1b, R1a, W2a, W2b, R1b, R2a, R2b

Решитьэту проблему вам нужно посмотреть на IPC, межпроцессорное взаимодействие: http://en.wikipedia.org/wiki/Inter-process_communication

...