Почему нельзя читать данные из блоков с защитой PAGE_GUARD?
Я читаю данные из адресного пространства, используя функцию ReadProcessMemory. Я пытаюсь прочитать из всех блоков, которые имеют тип MEM_PRIVATE. Но я получаю ошибку (функция возвращает 0), когда этот блок имеет защиту PAGE_GUARD, почему?
Спасибо всем.
2 ответа
Страница с защитой PAGE_GUARD гарантированно не будет доступна. Любой доступ к нему генерирует ошибку страницы, отраженную обратно в процесс, которому принадлежит страница, как исключение STATUS_GUARD_PAGE_VIOLATION. Эта функция широко используется в Windows для обнаружения и восстановления после состояния, для которого этот сайт назван.
Последние две страницы стека потока являются защитными страницами. Когда программа рекурсивно взрывается, использует все пространство стека и вызывает исключение, операционная система перераспределяет эти страницы, чтобы сделать их пригодными для использования в качестве аварийного пространства стека, и повторно вызывает исключение STATUS_STACK_OVERFLOW. Что позволяет программе бороться с сердечным приступом. Краткое сообщение и завершение программы - обычный результат.
Отключение исключения охранника страницы - дело одного удара, как только вы это сделаете, стража больше нет. Ясно, что очень, очень важно, чтобы только код в процессе отключал его. Не существует сценария, в котором вы будете перелистывать адресное пространство другого процесса и отключать исключение, которое когда-либо будет успешно завершено. Помимо процесса, понятия не имею, что произошло, и, таким образом, никогда не имея возможности должным образом отреагировать на исключение, он также удаляет защитный люк. Если вы нажмете одну из страниц защиты стека, вы немедленно прекратите работу программы.
К настоящему моменту должно быть очевидно, что вы намеренно ограничены в доступе к этим страницам с помощью ReadProcessMemory(). Ничего хорошего не может случиться, когда вы делаете. Возвращаемое значение говорит вам "здесь ничего не видно, двигайтесь дальше".
Я не очень хорошо знаком с защитными страницами, но могу догадаться:
Защитная страница - это заведомо неверный адрес памяти, предназначенный для запуска события, если к нему обращаются вообще - даже для чтения.
Например, стек может использовать его для динамического выделения памяти стека - или просто для обнаружения переполнения стека и создания исключения вместо сбоя или возможного перезаписи памяти из кучи или другого потока.
В любом случае, это на самом деле не допустимая страница памяти, поэтому там нечего читать.