Как сделать мою программу DEP-совместимой?

У меня есть проект windows form (.net 3.0), который не запускается на компьютере Vista моего клиента из-за ошибки DEP. Он работает на моей машине Vista, и в чистой версии Vista SP1 на виртуальной машине. У меня возникают проблемы с поиском путей совместимости моей программы с DEP, предотвращением выполнения данных. Я действительно не могу ничего сделать для компьютеров конечного пользователя, он просто должен работать. Есть ли выход из этого последнего кошмара разработки Vista? Моя программа использует элементы управления devexpress, sql express и.net, т.е. элемент управления веб-браузера. Я уже выбил контроль над ie, но безрезультатно. У меня есть другая программа, которая использует devexpress и sql express на той же машине, и они работают нормально. Я затрудняюсь отладить это на компьютере пользователя.

5 ответов

Решение

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)  

Компиляторы, поставляемые с.NET 2.0 SP1, включают флаг NXCOMPAT в заголовке исполняемого файла. Вы можете отключить этот флаг на этапе Post Build, запустив EditBin.exe с параметром /NXCOMPAT:NO.

Более старые версии ATL не поддерживают DEP, поэтому, если вы используете какие-либо элементы управления ActiveX, созданные с использованием ATL и созданные на основе этой версии ATL (я думаю, версии 7.1 и ниже), вы получите ошибки DEP.

В качестве последнего средства вы можете фактически отключить DEP для процесса, вызвав функцию API: SetProcessDEPPolicy,

Больше информации о SetProcessDEPPolicy

Кстати, стоит прямо упомянуть, что во многих случаях приложения не являются "несовместимыми с DEP", а скорее все равно должны были аварийно завершить работу, и DEP "нырнул, чтобы спасти день". Очень часто, отключив DEP, вы обнаруживаете, что используете "обычный" AV.

Если ваш проект написан исключительно на.NET 3.0, это почти наверняка так, потому что.NET не делает никаких "сумасшедших" вещей, запускающих DEP (например, функция thunking и т. Д.).

Для отладки установите отладчик или включите Watson для создания файла.DMP, затем перенесите этот файл.DMP на компьютер разработчика и выясните, что пошло не так.

Начните с попытки выяснить, где и как ваша программа терпит неудачу. Можете ли вы повторить проблему в вашей системе? С включением DEP для приложения в вашей системе? Когда вы сможете повторить проблему и получить ошибку (нарушение прав доступа), вы можете попытаться исправить свою программу.

См. Статью MSDN для получения информации о DEP.

Другие вопросы по тегам