Интересует вопрос: отличается ли чем то PAGE_READWRITE от PAGE_EXECUTE_READWRITE ? Допустим я записал в область PAGE_READWRITE код и делаю JMP Испытывал - код выполняется в обоих случаях. Тестил на XP SP3, 7 (вирт и реал). Везде работает. Там какие-то флаги должны быть в заголовке PE установлены и процессор поддерживать такую возможность?
Уточнение: если аппаратный DEP неактивен. Кроме того, некоторые системные процедуры (скажем, обработка исключений) передадут управление на страницу только при условии, что она имеет соответсвующий атрибут.
Да, конечно должна быть аппаратная поддержка атрибута PAGE_EXECUTE. Однако, MS говорит, о наличии софтверной реализации DEP в windows XP SP2 (http://support.microsoft.com/kb/875352), правда эта реализация не полноценная и "работает только для системных бинарников"... тут я не очень понял, что имеется в виду. Также DEPом можно управлять для конкретного процесса (SetProcessDEPPolicy API). Что произойдёт если выделить память READWRITE, потом отключить DEP через API и после этого попытаться эту память выполнить зависит от деталей реализации. С одной стороны если есть аппаратная поддержка, то вызов API не должен никак повлиять на работу атрибутов страниц... если только эта API не изменяет сама атрибуты.
Да, ещё в OPTIONAL_FILE_HEADER в поле Dll characteristics флаг 0x100 указывает на совместимость с DEP. Поддерживается этот флаг начиная с Vista
100gold Не полноценная потому, что без хардварной поддержки ось не может контролировать атрибуты для обычного исполняемого кода и делает это только при обработке исключений - прежде чем передать управление на SEH-обработчик делается проверка его принадлежности executable-памяти (см.,например, "древнюю" тему)
Т.е. чтобы пустить такой код без EXECUTE (без SEH) нужно либо проверить, поддерживает ли камень DEP, либо заюзать АПИ SetProcessDEPPolicy?