Как сделать мою программу DEP-совместимой? - PullRequest
8 голосов
/ 09 декабря 2008

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

Ответы [ 5 ]

17 голосов
/ 09 декабря 2008

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)  
5 голосов
/ 09 декабря 2008

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

5 голосов
/ 09 декабря 2008

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

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

Дополнительная информация о SetProcessDEPPolicy

3 голосов
/ 11 июля 2009

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

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

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

0 голосов
/ 09 декабря 2008

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

Информацию о DEP .

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