Ядерные шалости Крис Касперски ака мыщъх Хакер, номер #091, стр. 091-082-3 Ниже приведен код псевдодрайвера (см. листинг 1), временно отключающего защиту памяти ядра от записи, а затем включающий ее назад. «Псевдо» потому, что настоящие драйвера (в подлинном смысле этого слова) используются для управления реальными (или виртуальными) устройствами, а нам драйвер понадобится только для того, чтобы дорваться до нулевого кольца. Поэтому мы используем одну лишь процедуру DriverEntry и тут же возвращаем STATUS_DEVICE_CONFIGURATION_ERROR, сообщая о фиктивной ошибке, заставляющую систему выгрузить драйвер, чтобы он понапрасну не болтался в памяти. Загрузить же драйвер можно либо обычным путем (через реестр), либо через динамический загрузчик Свена Шрайбера, прилагаемый к его книге «Недокументированные возможности Windows 2000» (сам загрузчик можно найти на WASM'е) КОД Листинг 1: код псевдодрайвера krnlWR.asm, временно отключающего защиту ядра от модификации, а затем включающего ее обратно .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 Для компиляции драйвера потребуется DDK. Во время Windows 2000 он раздавался бесплатно всем желающим, но затем Microsoft сменила политику и теперь его могут получить только подписчики MSDN или почетные погонщики ослов. На самом деле все не так уж и печально. И полноценный DDK (вместе с частью SDK) входит теперь в объединенный пакет Kernel-Mode Driver Framework, который пока еще распространяется бесплатно, так что спешите качать: http://www.microsoft.com/whdc/driver/wdf/KMDF_pkg.mspx (см. рис. 2). Сама компиляция осуществляется следующими ключами командной строки (см. листинг 2): КОД Листинг 2: компиляция псевдодрайвера ml /nologo /c /coff krnlWR.asm link /driver /base:0x10000 /align:32 /out:krnlWR.sys /subsystem:native krnlWR.obj Модифицируя код или данные ядра, необходимо быть на 100% уверенным, что в данный момент времени их не использует никакой другой поток. Невыполнение этого условия приводит к непредсказуемому поведению системы. В лучшем случае – к голубому экрану, в худшем — к потери всего дискового тома (особенно, если мы вмешиваемся в файловые операции). Проблема возникает как на многопроцессорных, так и на однопроцессорных системах без поддержки Hyper Heading, причем универсальных путей выхода из ситуации не существует. Каждый случай требует индивидуального подхода, описание которого тянет на целую статью, а поэтому здесь не рассматривается. Анализ исходных текстов (или драйверов) великих гуру далеко не всегда идет на пользу начинающим хакерам. На то они и гуру, чтобы знать, какими трюками когда можно пользоваться, а когда — нет. Начинающие же обычно запоминают лишь сам трюк, а о границах его применимости зачастую даже не догадываются. В частности, в ранних версиях своей утилиты DbgView Марк Руссинович вставлял в начало ядерной функции DbgPring команду перехода на свой обработчик (см. листинг 3). |