Доступ к памяти, используемой другой программой - PullRequest
8 голосов
/ 19 ноября 2011

Сегодня у меня снова странный вопрос (по крайней мере, для меня это так). Я экспериментирую больше с указателями, и у меня в голове возникает мысль:

Код (только его часть)

int * firefoxmemory = (char*) 0x11111111 //this is just an example of address.
*firefoxmemory = 200;

Вопрос:

В приведенном выше коде я пытаюсь получить доступ к памяти, используемой Firefox (я использую редактор памяти для просмотра адреса), и после этого изменить его соответствующее значение. Но когда я пытаюсь это сделать, моя программа падает.

Почему это происходит с моей программой? Есть ли какой-то специальный код, используемый Firefox для предотвращения вмешательства сторонней программы в ее память? Или это делается аппаратным DEP для Windows и Intel?

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

Ответы [ 3 ]

13 голосов
/ 19 ноября 2011

Сбой из-за того, что 0x11111111 не указывает на действительный адрес в области памяти вашего приложения.

Что касается чит-движка, есть несколько способов получить доступ к памяти другой программы:

1) выполнить код внутри области памяти целевого процесса.Существуют различные способы внедрения кода в другой процесс с использованием SetWindowsHookEx() или CreateRemoteThread().

2) с использованием ReadProcessMemory() и WriteProcessMemory()

4 голосов
/ 19 ноября 2011

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

Так, например, у Firefox есть строка, расположенная в 0x100, ваша программа также имеет строку, расположенную в 0x100 - оба они являются адресами виртуальной памяти - OS / CPU отображает эти адреса в реальную физическую RAM - и сохраняет их отдельно от друг друга - чтобы избежать техники взлома, которую вы описываете.

0 голосов
/ 19 ноября 2011

Еще один способ разделить память между процессами в win32 - это использовать отображенные в память файлы:

http://msdn.microsoft.com/en-us/library/dd997372.aspx

Но, как и для ReadProcessMemory() и WriteProcessMemory(), этот метод требует поддержки2. Процесс.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...