Возможно ли принудительное нарушение прав доступа при обращении к определенному адресу? - PullRequest
4 голосов
/ 05 августа 2010

У нас есть массив, размер которого слишком велик для целей выравнивания, чтобы обычные механизмы не улавливали одну ошибку.

Можно ли защитить небольшую произвольную область (16 байтов в начале?)и конец массива) в Windows, что вызывает нарушение прав доступа?Язык - C ++.

Ответы [ 4 ]

4 голосов
/ 05 августа 2010

Я считаю, что в архитектуре x86 наилучшая степень детализации, которую вы можете достичь при маркировке памяти как защищенной, относится к странице (я думаю, 4K).Вы можете настроить массив так, чтобы начало или конец пересекали границу страницы (и защищали эту страницу).Но чтобы оба конца пересекали такие границы, конечно, потребовалась бы очень конкретная длина массива.

Вот пример того, как настроить защитные страницы.

1 голос
/ 05 августа 2010

Не напрямую.Самое близкое, что вы можете сделать, это установить точку останова данных на этих буферах.Тем не менее, x86 имеет в общей сложности 4 таких точки останова, и они не более 8 байт.Кроме того, вы должны быть в кольце 0 (режим ядра), чтобы установить их.

1 голос
/ 05 августа 2010

Вы можете сделать это в ОС UNIXish с комбинацией __attribute__((aligned (PAGESIZE))) и mprotect. В Windows, я думаю, есть эквивалент mprotect, но он также ограничен одной страницей памяти.

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

0 голосов
/ 05 августа 2010

Я не думаю, что это можно сделать. Вы всегда можете сами выбросить исключение.

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