C++: я могу выйти из границ памяти своего приложения с указателем?

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

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

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

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

Спасибо

5
задан Martijn Courteaux 4 June 2010 в 17:04
поделиться

5 ответов

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

15
ответ дан 18 December 2019 в 05:43
поделиться

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

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

0
ответ дан 18 December 2019 в 05:43
поделиться

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

Это не отражается на фактических байтах памяти в RAM.

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

6
ответ дан 18 December 2019 в 05:43
поделиться

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

2
ответ дан 18 December 2019 в 05:43
поделиться

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

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

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

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

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

7
ответ дан 18 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: