Доступ к прямым адресам памяти и получение значений в C ++ - PullRequest
16 голосов
/ 01 сентября 2011

Мне было интересно, можно ли получить доступ к прямому блоку памяти с помощью C / C ++ и получить значение. Например:

int i = 15;
int *p = &i;
cout << &i;

Если бы я взял напечатанное значение здесь, это дало бы мне адрес переменной i, которая содержит значение 15. Я просто скажу, что это распечатало 0x0ff9c1 для этого примера. Если у меня есть отдельная программа, которая объявляет указатель так ...

int *p = 0x0ff9c1;
cout << *p;

Можно ли распечатать ту 15, которую другое приложение поместило в блок памяти 0x0ff9c1? Я знаю, что мое объявление указателя с адресом памяти неверно, я не уверен, как это сделать иначе. Я попытался использовать memcopy, но я не смог заставить это работать. Я знаю, что это как-то возможно, поскольку у меня есть программа под названием Cheat Engine, которая изменяет значения адресов игровой памяти, чтобы получить несправедливые преимущества. Я успешно разместил напечатанную ячейку памяти и получил значение (15) через Cheat Engine. Моя цель сделать это с помощью C ++. Если это слишком запутанно, я бы хотел получить доступ к переменной, сохраненной другим приложением, используя адрес своей памяти, и распечатать значение. Я использую Windows 7 x64 с компилятором MinGW, если это имеет значение. Спасибо!

PS: я опубликую фотографию того, что делает Cheat Engine, чтобы дать лучшую идею. enter image description here

Ответы [ 5 ]

6 голосов
/ 01 сентября 2011

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

5 голосов
/ 01 сентября 2011

Вы не можете сделать это независимо от платформы в C ++.Хотя я не использовал этот «чит-движок» специально, он почти наверняка использует тот же специальный API, который использует отладчик.Код будет специфичным для Windows, и вам потребуется определенный уровень привилегий для запущенного процесса.

(Например, если вы используете Visual Studio и запускаете программу из него в режиме отладки, Visual Studioможет просматривать и изменять значения в этой программе.)

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

http://www.woodmann.com/fravia/iceman1.htm

3 голосов
/ 01 сентября 2011

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

Поиск по удаленному созданию потока или перехват . Здесь есть несколько вопросов по этому поводу (и здесь , для начала).

1 голос
/ 01 сентября 2011

Как правило, одна программа не может изменить память другой.Система идет на все, чтобы обеспечить это.Если этого не произойдет, ни одна программа не будет безопасной.Это особенно верно для всех вариантов Unix, над которыми я работал, хотя не для всех проприетарных ОС, которые я видел.

Обратите внимание, что ни одно из этих правил не применимо к ядру ...

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

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

0 голосов
/ 02 ноября 2015

Немного поздно, но вы все еще можете сделать это с помощью DLL-инъекции. Вот ссылка на учебник: http://resources.infosecinstitute.com/using-createremotethread-for-dll-injection-on-windows/

...