Жизнь после BSOD Крис Касперски и Жирный Хомяк Хакер, номер #085, стр. 085-114-7 Объединив все компоненты воедино, мы получаем следующий папелац: [средство против BSOD, перед употреблением встряхнуть] .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 dword ptr DS:[8042BF14h+1], 14C258h 14C258 ; «закорачиваем» KeBugCheckEx mov cr0, ebx ; восстанавливаем бит WP mov eax, 0C0000182h ; STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry endp end DriverEntry Вот такой маленький драйвер, а сколько данных он может спасти! Остается только откомпилировать его. [ключи ассемблирования и линковки (используется пакет MASM из NT DDK)] ml /nologo /c /coff nobsod.asm link /driver /base:0x10000 /align:32 /out:nobsod.sys /subsystem:native nobsod.obj Если все было сделано правильно, то на диске образуется файл nobsod.sys, который мы загрузим с помощью динамического загрузчика w2k_load. Загрузчик, конечно, заругается матом, что, мол, ERROR и драйвер вообще не грузятся, но так и должно быть. Все нормально! Мы же возвратили код STATUS_DEVICE_CONFIGURATION_ERROR! Но, внимание! Под VM Ware такой трюк не срабатывает, поскольку она не полностью эмулирует регистр cr0 и таких шуток в упор не понимает, вызывая завис гостевой оси. В этом случае можно закомментировать все строки, относящиеся к регистру cr0 и отключить защиту через реестр, создав соответствующий ключ редактором. Кстати говоря, если на целевой машине установлен SoftICE, то такой ключ уже создан, и ничего делать не надо. Загрузим драйвер-убийцу, чтобы проверить справиться ли с ним наше средство против BSOD или нет. SoftICE (если он установлен) несколько раз всплывает. Вот зануда! Гони его прочь, нажимая «x» или <Ctrl-D>. Все равно голубой экран уже не появляется! Система жутко тормозит, но работает. Плохо то, что теперь NT никак не может сигнализировать, что произошел системный сбой и что нужно побыстрее сматывать ласты, совершая shutdown. Кстати, почему это не может сигнализировать?! Самое простое - добавить в нашу заплатку на KeBugCheckEx несколько ассемблерных строк, которые «бибикнут» спикером или сыграют семь-сорок на динамике. В принципе, можно даже разделить BugCheck-коды на категории, каждой из которой будет соответствовать свое число гудков. За примерами далеко ходить не надо. Их можно выдрать из любого DOS-вируса. Техника программирования спикера на уровне ядра та же самая, и она ничуть не изменилась. Да много что можно сделать! Главное - фантазию иметь! [жизнь после BSOD] Мы пережили самую страшную катастрофу - BSOD, после которой нам все по плечу! Конечно, неразумно практиковать такой подход на сервере, но для рабочих станций он вполне приемлем. Проверено на мыщъх'иной шкуре! Кстати говоря, некоторые вирусы, черви и rootkit'ы используют схожую технику для маскировки своего присутствия в системе. Некорректно написанный вирус может вызвать синий экран, и в системном журнале появится соответствующая запись, помогающая администратору разобраться с проблемой. Если же перемкнуть KeBugCheckEx, то компьютер будет просто беспричинно тормозить (или виснуть), но в журнале ничего не появится! |