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

5 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам