C ++: могу ли я выйти за пределы памяти моего приложения с помощью указателя? - PullRequest
5 голосов
/ 04 июня 2010

Если у меня есть какой-нибудь глупый код, подобный этому:

int nBlah = 123;
int* pnBlah = &nBlah;
pnBlah += 80000;
*pnBlah = 65;

Можно ли изменить память другого приложения?

Вы объяснили мне, что это зло, я знаю. Но мне было просто интересно.
И это не то, что просто попробовать. Я не знаю, что произойдет.

Спасибо

Ответы [ 5 ]

15 голосов
/ 04 июня 2010

В терминах C ++ это неопределенное поведение. Что на самом деле произойдет, зависит от многих факторов, но самое главное, это зависит от используемой операционной системы (ОС). В современных ОС с управлением памятью ваше приложение будет завершено с «ошибкой сегментации» (фактический термин зависит от ОС) за попытку доступа к памяти за пределами адресного пространства вашего процесса. Однако некоторые ОС не имеют такой защиты, и вы можете волей-неволей тыкать и уничтожать вещи, принадлежащие другим программам. Это также обычно имеет место, если ваш код находится внутри пространства ядра, например в драйвере устройства.

7 голосов
/ 04 июня 2010

Нет, это не так просто. :)

Современные операционные системы используют виртуальную память .

Каждому процессу предоставляется полное виртуальное адресное пространство.

Каждый процесс получает свое собственное «представление» всех адресов (от 0x00000000 до 0xffffffff в 32-разрядной системе). Процессы A и B могут выполнять запись по одному и тому же адресу, не влияя друг на друга, поскольку они не обращаются к адресам физической памяти, а к виртуальным адресам. Когда процесс пытается получить доступ к виртуальному адресу, ОС преобразует его в какой-то другой физический адрес, чтобы избежать конфликтов.

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

6 голосов
/ 04 июня 2010

В современных операционных системах вы не получаете доступ к реальной памяти, а скорее к виртуальной памяти объемом 4 ГБ (до 32 бит). Нижние 2 ГБ для использования, а верхние 2 ГБ зарезервированы для операционной системы.

Это не отражает фактические байты памяти в ОЗУ.

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

2 голосов
/ 04 июня 2010

Я думаю, что это повысит 0x00000005, нарушение прав доступа в Windows

0 голосов
/ 04 июня 2010

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

Для получения дополнительной информации прочитайте об эксплойтах Buffer Overflow и о том, как они обидели Microsoft до выхода Windows XP SP2.

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