DEP работает в одном из двух режимов:
1) Аппаратный DEP предназначен для процессоров, которые могут помечать страницы памяти как неисполняемые. Это помогает предотвратить некоторые эксплойты, такие как переполнение буфера.
2) Программный DEP предназначен для процессоров, которые не поддерживают аппаратное DEP. Он не препятствует выполнению кода на страницах данных, но останавливает перезапись SEH (другой тип атаки).
В Windows XP с процессорами, которые его поддерживают, аппаратный DEP по умолчанию включен только для определенных системных двоичных файлов Windows, а также для программ, которые выбирают «согласие».
В Vista с процессорами, которые его поддерживают, аппаратный DEP включен по умолчанию почти для всех процессов. Иногда это может быть проблематично, как правило, для старых программ и драйверов, а также для независимых поставщиков ПО, которые еще не тестировали Vista.
Так что я подозреваю, что первым шагом будет выяснить, имеете ли вы дело с программным или аппаратным DEP. Кроме того, вы используете C # / VB или Managed C ++? И вы используете какой-либо нативный код или компоненты? Если ваше приложение использует собственный компонент или элемент управления ActiveX, созданный с использованием старой инфраструктуры ATL, вполне возможно, что ваше приложение завершится ошибкой с аппаратным DEP.
Начиная с .NET Framework 2.0 SP1, я считаю, что компилятор C # генерирует управляемый код, совместимый с DEP. Но если ваше приложение генерирует исключения DEP, вы можете попробовать очистить флаг IMAGE_DLLCHARACTERISTICS_NX_COMPAT для вашего исполняемого файла. Для этого вы используете EDITBIN.EXE из набора инструментов VC следующим образом:
editbin.exe /NXCOMPAT:NO <your binary>
Если вы используете Visual Studio, вы можете добавить шаг после сборки в проект вашего исполняемого файла. Вам необходимо настроить среду так, чтобы можно было разрешить зависимости EDITBIN. Когда я использую собственный код как часть моего приложения, шаг после сборки выглядит следующим образом:
call $(DevEnvDir)..\tools\vsvars32.bat
editbin.exe /NXCOMPAT:NO $(TargetPath)