В Windows Vista SP1 добавлены новые API для реализации NX

Разработчики компании Microsoft сообщают о добавлении в состав Windows Vista SP1 новых API (абб. от Application Programming Interface) для реализации технологии NX, более известной как Data Execution Protection. Майкл Говард (Michael Howard) пишет: "С целью сделать нашу платформу безопаснее, мы хотели вовлечь больше людей в использование Data Execution Prevention (DEP или иначе NX), поэтому мы решили убрать все преграды для разработчиков программ в Windows Vista SP1, Windows XP SP3 and Windows Server 2008. Мы добавили несколько новых API, которые позволят разработчикам настраивать DEP на работу с процессом их приложения, а не использовать редактор связей. Также новые API дают разработчикам немного больше гибкости, в случае если ваше приложение использует старую версию Abstract Type Library (ATL). Если вы не знаете, что это такое, то расскажу вам историю ATL.

ATL использовался очень давно, так как он довольно легковесен и позволяет разработчику быстро создавать COM-объекты. Также он включает в себя классы для манипуляций дескрипторами безопасности. Честно говоря, ATL делает работу с объектами безопасности Windows опасно открытыми.

Более старые версии ATL, я имею в виду до Visual C++ 2005, использовали динамически созданный код в небольших изолированных регистрах. Очевидно, что без использования соответствующих API это вызовет проблемы, так как на компьютерах с включенным DEP вы не сможете выполнить некоторые типы данных. Данный код будет перенаправляться как переход (небольшая секция кода, выполняющая преобразование или обеспечивающая вызов 32-разрядного кода из 16-разрядного и наоборот - прим. перев.), а версия ATL, входящая в комплект VC++ 2005, нормально работает с DEP.

Наиболее важный API добавлен в SetProcessDEPPolicy, который позволяет настроить DEP относительно запущенного процесса. Функция имеет только один аргумент: настройки политики. Возможные варианты:

 

  • 0x00000000 - отключить DEP для процесса
     
  • PROCESS_DEP_ENABLE - включить DEP для процесса
     
  • PROCESS_DEP_ENABLE | PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION - включить DEP для процесса и запретить ATL-переходы.


Последняя опция - убийственный аргумент: если вы создаёте приложение, которое содержит компоненты, которые могут быть несовместимы с DEP, так как они были созданы с использованием более старой версии ATL, то вы всё равно можете использовать DEP для вашего процесса. Есть еще две другие функции GetSystemDEPPolicy и GetProcessDEPPolicy.

Единственный негативный момент данных API - они должны быть динамически подключаемыми, так как они существуют не во всех поддерживаемых версиях Windows. Следующий код показывает, как вы можете использовать эти функции независимо от версии Windows:

 
Код:
#define PROCESS_DEP_ENABLE 0x00000001
#define PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION 0x00000002

BOOL SetDEP(__in DWORD dwFlags = PROCESS_DEP_ENABLE) {

HMODULE hMod = GetModuleHandleW(L"Kernel32.dll");

if (!hMod) return FALSE;

typedef BOOL (WINAPI *PSETDEP)(DWORD);

PSETDEP procSet = (PSETDEP)GetProcAddress(hMod,"SetProcessDEPPolicy");

if (!procSet) return FALSE;

return procSet(dwFlags);

}


Если связать два флага вместе с помощью оператора OR, то, фактически, это будет то же самое, что связывание с помощью /NXCOMPAT.

Есть три основные причины использования данных API:
 
  • Если ваше приложение имеет какой-либо механизм расширения в процессе исполнения и некоторые приложения могут использовать более старые версии ATL, то вы можете включить DEP для вашего процесса, а потом механизм расширения, используя ATL, и все будет работать корректно.
     
  • Если ваше приложение поддерживает DEP, но вы хотите разрешить пользователям запрещать использование DEP из-за проблем с совместимостью, то вам необходимо использовать данный API, так как аргумент может быть настраиваемой опцией.
     
  • Если ваше приложение использует более старую версию ATL, и вы всё равно хотите правильно использовать DEP, то используйте данный API. Конечно же, при этом вам нужно перейти на новую версию ATL.


Есть одна вещь, которую вам необходимо знать: SetPRocessDEPPolicy часто возвращает код ошибки 5 (доступ запрещён), но это не значит, что операционная система запрещает доступ - это значит, что вы пытаетесь изменить политику DEP некорректным способом. Например, если вы связываете программу с /NXCOMPAT, а потом используете данный API, то вы получите данную ошибку. Или если ОС настроена на использование DEP для всех процессов все время и несмотря ни на что, то вы тоже увидите ошибку. Наконец, вы получите ошибку о блокировке доступа, если вы попытаетесь вызвать SetPRocessDEPPolicy дважды в одном приложении - как только политика настроена, то она должна быть неизменной до конца жизни процесса. - Сообщает TheVista


Опубликовал admin
31 Янв, Четверг 2008г.



Программирование для чайников.