Хак ядра NT

       

статическое отключение защиты памяти ядра через реестр


Динамическое отключение защиты осуществляется сбросом WP-бита в управляющем регистре CR0, который так и расшифровывается Write Protection. Соответственно, повторная установка бита обратно включает защиту. За этими махинациям не следят никакие известные мыщъху сторожа, их можно использовать во всех версиях Windows, включая еще не появившиеся на свет.

Ниже приведен код псевдодрайвера (см. листинг 1), временно отключающего защиту памяти ядра от записи, а затем включающий ее назад. "Псевдо-" потому что настоящие драйвера (в подлинном смысле этого слова) используется для управления реальными (или виртуальными) устройствами, а нам драйвер понадобился только для того, чтобы дорваться до нулевого кольца, поэтому, мы используем одну лишь процедуру DriverEntry, отрабатывающую на стадии инициализации и тут же возвращаем STATUS_DEVICE_CONFIGURATION_ERROR, сообщая о фиктивной ошибке, заставляющую систему выгрузить драйвер, чтобы он понапрасну не болтался в памяти. Загрузить же драйвер можно либо обычным путем (через реестр), либо через динамический загрузчик Свена Шрайбера, прилагаемый к его книге "Недокументированные возможности Windows 2000" (сам загрузчик можно найти на WASM'е)

.386

.model flat, stdcall

.code

DriverEntry proc

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

       mov ebx, eax               ; сохраняем бит WP в регистре ebx

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

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

      

       ; # теперь защита отключена!

       ; # делаем все, что задумали сделать

       ; # модифицируя память ядра по своему усмотрению

      

       mov    cr0, ebx             ; восстанавливаем бит WP

       ; # защита снова включена!

      

       mov eax, 0C0000182h        ; STATUS_DEVICE_CONFIGURATION_ERROR

       ret

DriverEntry endp



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