Предотвращение выполнения данных
Предотвращение выполнения данных (DEP) — это функция защиты памяти на уровне системы, которая встроена в операционную систему начиная с Windows XP и Windows Server 2003. DEP позволяет системе помечать одну или несколько страниц памяти как неисполняемые. Пометка областей памяти как неисполняемых означает, что код не может выполняться из этой области памяти, что затрудняет использование переполнения буфера.
DEP предотвращает выполнение кода со страниц данных, таких как кучи по умолчанию, стеки и пулы памяти. Если приложение пытается выполнить код с защищенной страницы данных, возникает исключение нарушения доступа к памяти, а если исключение не обрабатывается, вызывающий процесс завершается.
DEP не предназначена для комплексной защиты от всех эксплойтов; это еще один инструмент, который можно использовать для защиты приложения.
Как работает предотвращение выполнения данных
Если приложение пытается выполнить код с защищенной страницы, приложение получает исключение с кодом состояния STATUS_ACCESS_VIOLATION. Если приложение должно выполнять код со страницы памяти, оно должно выделить и задать соответствующие атрибуты защиты виртуальной памяти . Выделенная память должна быть помечена PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE или PAGE_EXECUTE_WRITECOPY при выделении памяти. Выделения кучи, выполненные путем вызова функций malloc и HeapAlloc , не являются исполняемыми.
Приложения не могут выполнять код из кучи процессов по умолчанию или из стека.
DEP настраивается при загрузке системы в соответствии с параметром политики защиты страниц без выполнения в данных конфигурации загрузки. Приложение может получить текущий параметр политики, вызвав функцию GetSystemDEPPolicy . В зависимости от параметра политики приложение может изменить параметр DEP для текущего процесса, вызвав функцию SetProcessDEPPolicy .
Замечания по программированию
Приложение может использовать функцию VirtualAlloc для выделения исполняемой памяти с соответствующими параметрами защиты памяти. Рекомендуется, чтобы приложение, как минимум, PAGE_EXECUTE параметр защиты памяти. После создания исполняемого кода рекомендуется, чтобы приложение установило защиту памяти, чтобы запретить доступ на запись к выделенной памяти. Приложения могут запретить доступ на запись к выделенной памяти с помощью функции VirtualProtect . Запрет доступа на запись обеспечивает максимальную защиту для исполняемых областей адресного пространства процесса. Следует попытаться создать приложения, использующие наименьшее возможное адресное пространство исполняемого файла, что позволяет свести к минимуму объем памяти, подверженный эксплуатации памяти.
Также следует попытаться управлять макетом виртуальной памяти приложения и создавать исполняемые регионы. Эти исполняемые регионы должны располагаться в меньшем пространстве памяти, чем в неисполняемых регионах. Найдя исполняемые области ниже неисполняемых регионов, вы можете предотвратить переполнение буфера в исполняемую область памяти.
Совместимость приложений
Некоторые функциональные возможности приложения несовместимы с DEP. Приложения, которые выполняют динамическое создание кода (например, JIT-создание кода) и не помечают созданный код явным образом разрешением на выполнение, могут иметь проблемы совместимости на компьютерах, использующих DEP. Приложения, написанные в библиотеке активных шаблонов (ATL) версии 7.1 и более ранних версий, могут пытаться выполнять код на страницах, помеченных как неисполняемые, что активирует ошибку NX и завершает работу приложения; Дополнительные сведения см. в разделе SetProcessDEPPolicy. Большинство приложений, которые выполняют действия, несовместимые с DEP, должны быть обновлены для правильной работы.
Небольшое количество исполняемых файлов и библиотек может содержать исполняемый код в разделе данных файла изображения. В некоторых случаях приложения могут помещать небольшие сегменты кода (обычно называемые thunks) в разделы данных. Однако DEP помечает разделы файла образа, загруженные в память, как не исполняемые, если к разделу не применен атрибут исполняемого файла.
Поэтому исполняемый код в разделах данных следует перенести в раздел кода, или раздел данных, содержащий исполняемый код, должен быть явно помечен как исполняемый. Атрибут исполняемого файла , IMAGE_SCN_MEM_EXECUTE, следует добавить в поле Характеристики соответствующего заголовка раздела для разделов, содержащих исполняемый код. Дополнительные сведения о добавлении атрибутов в раздел см. в документации по компоновщику.
Связанные темы
Предотвращение выполнения данных
Настройка защиты памяти в Windows XP с пакетом обновления 2 (SP2)