Подтвердить что ты не робот

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

Мне было интересно, можно ли получить доступ к прямому блоку памяти с помощью 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. Моя цель - сделать это с помощью С++. Если это слишком запутанно, в основном я хотел бы получить доступ к переменной, которую другое приложение хранило, используя свой адрес памяти, и распечатывать значение. Я использую Windows 7 x64 с компилятором MinGW, если это имеет значение. Спасибо!

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Найдите удаленное создание потоков или hooking. Здесь более чем несколько вопросов (и здесь, для начала).

Ответ 4

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

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

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

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