1

Тема: K-mode:SEH.

Здрасте.
Есть следующая проблема.
1. В отличие от юзермода, в ядре при фолтах стек не выравнивается в ISR. Это очень не приятный момент. Системный диспетчер начинает формирование трап-фрейма в стеке, который был на момент исключения. Если он не выравнен на 4, то раквёртка сех не будет выполнена. В RtlDispatchException() выполняется проверка выравнивания ссылок цепочки. В таких случаях например обычная защита кода сех'ом не работает. Единственное решение которое я вижу - выполнять самостоятельно диспетчерезацию сех из KiDebugRoutine.
2. Если код находится вне модулей, также раскрутка сех не будет выполнена. С учётом решения первой проблемы это позволит обойти проверки.
Есть ли альтернативное решение ?

2

Re: K-mode:SEH.

Семпл http://files.virustech.org/indy/Code/XcptIp/

3

Re: K-mode:SEH.

Пересмотрел архитектуру полностью. Следует реализовать код раскручивающий сех вручную. Код формирующий трап-фрейм не корректный, нет изоляции между цепочками сех разных ISR. В оличие от системного валкера, который извлекает начало цепочки для раскрутки из PCR, её следует извлекать вручную из трап-фрейма(.ExceptionList), при этом будет выполняться развёртка цепочки предыдущей ISR, но так как ENTER_TRAP не изолирует цепочки, в отличие от ENTER_INTERRUPT и ENTER_SYSCALL, будет ракручена вся цепочка всех ISR. Для проверки принадлежности инструции вызвавшей исключение нашему коду единственный способ это использование графа. Для всего кода создаётся граф, диспетчер ищет в нём описатель инструкции.

Отредактировано Indy (2010-07-31 15:41:21)