Жизнь после BSOD

скелет "псевдодрайвера"


На самом деле это не совсем драйвер. Он не принимает никаких IRP-пакетов, не обслуживает никаких устройств и вообще не делает ничего, только загружается и выгружается. Но для нашей затеи этого будет вполне достаточно!

Весь код сосредоточен внутри процедуры DriverEntry – своеобразном аналоге функции main языка Си, которая выполняется при попытке загрузки драйвера, инициализируя все, что необходимо. Отсюда можно "дотянуться" до функции KeBugCheckEx и модифицировать ее по своему усмотрению.

Несмотря на то, что процедура DriverEntry выполняется на уровне ядра с максимальными привилегиями, попытка "правки" машинного кода приводит к нарушению доступа. Это срабатывает защита от непреднамеренного хака ядра некорректным драйвером. Как ее отключить?

Путь первый — через реестр. Создаем в разделе HKLM\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management значение типа REG_DWORD с именем EnforceWriteProtection и значением 0 (это можно делать и с прикладного уровня). Все! Запись в ядро открыта! Кстати говоря, soft-ice именно так и работает.

Путь второй — репаминг страниц. Отображаем физический адрес страницы, в которой лежит KeBugCheckEx на виртуальное адресное пространство своего процесса посредством вызова функции NtMapViewOfSection, назначая все необходимые нам права. Репаминг осуществляется исключительно на уровне ядра, но к отображенной странице можно обращаться даже из прикладного уровня. Красота! По этой схеме работают многие брандмауэры и другие программы, нуждающиеся в перехвате ядерных функций, например, rootkit'ы. Подробности здесь: http://www.stanford.edu/~stinson/misc/curr_res/nt_hooking.txt.

Путь третий — сброс флага WP в регистре Cr0. Это достаточной грязный трюк с целой свитой противопоказаний и рекламаций, однако, для наших целей он вполне подходит. Используем его как самый простой и быстрый вариант, умещающийся всего в 3 (!) машинных команды:

mov    eax, cr0      ; грузим управляющий регистр cr0 в регистр eax

and    eax, 0FFFEFFFFh; сбрасываем бит WP, запрещающий запись

mov    cr0, eax      ; обновляем управляющий регистр cr0



Содержание раздела