статическое отключение защиты памяти ядра через реестр
Динамическое отключение защиты осуществляется сбросом 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