Доступ к адресам прямой памяти и получение значений в C++

мне было интересно, можно ли получить доступ к прямому блоку памяти с помощью 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 ответов


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


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

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

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

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


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

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


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

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

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

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


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