Как получить значение переменной в C ++, если вы знаете адрес переменной - PullRequest
2 голосов
/ 18 марта 2011

Привет,

Я недавно начал кодировать в C ++ и столкнулся с проблемой, на которую мне не удалось найти ответ, поэтому я подумал, может кто-то другой может знатьответ.

Можно ли получить значение переменной из другой программы, если вы знаете адрес переменной? Представьте, что в программе отображается адрес памяти, что-то вроде: 0x7fff5fbff758 и я бы хотел (в моей собственной программе, не связанной с первой) получить значение , сохраненное в этом адресе памяти.

Это возможно?Если так, может кто-нибудь объяснить, пожалуйста, как.Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 18 марта 2011

C ++ не имеет комментариев по этому поводу, так или иначе.Это полностью зависит от платформы, на которой работает ваша программа.Например, если вы используете Windows, вы можете использовать функцию ReadProcessMemory () для чтения памяти другого процесса (при условии, что у вас есть соответствующие разрешения).

Обратите внимание, что современные операционные системы предназначены для защиты процессовмешать друг другу.Один из способов сделать это - дать каждому процессу свое адресное пространство.Процессы не могут получить доступ к памяти вне этого пространства без использования специальных API.

3 голосов
/ 18 марта 2011

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

Чтобы делать то, что вы хотите в современных операционных системах, вы можете, например, настроить расположение общей памяти.1003 *

Но есть гораздо более простой способ передать значение из одной программы в другую.

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

2 голосов
/ 18 марта 2011

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

0 голосов
/ 18 марта 2011

В большинстве современных операционных систем общего назначения (Windows, Linux и т. Д.) вы не можете сделать это . Различные программы выполняются в разных процессах, и каждый процесс имеет свое собственное пространство памяти. Адрес 0x7fff5fbff758 в одном, вероятно, указывает на совсем другое место в ОЗУ, чем адрес 0x7fff5fbff758 в другом (если этот адрес даже существует в другом).

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

0 голосов
/ 18 марта 2011

Редактировать: Это устарело, потому что вопрос изменился.

Если вы знаете тип переменной, это возможно.

Для переменной int вам нужно вставить строки типа

int* addr = (int*)0x7fff5fbff758;
std::cout << *addr << std::endl;

где-то в уязвимой программе.

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

Это зависит от ОС, например, в linux вам необходимо отслеживать процесс, если вы хотите сделать это из другого процесса, см. man ptrace .В этом случае вы можете прочитать данные с помощью PTRACE_PEEKDATA.

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