Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.200.136] |
|
Сообщ.
#1
,
|
|
|
Убираем BSOD В который раз, пронаблюдав синенькую открытку с белыми строками от Майкрософта, я решил, что мне это надоело.... Я не приверженец ВМ и эмуляторов, а проверять дрова, свои и не только бывает нужно, и не редко, после запуска драйвера я наблюдал всеми обожаемый BSOD. Достаточно известно, что BSOD рисуется функцией KeBugCheckEx, которую вызывает KeBugCheck. Крис Касперски в своей статье Жизнь после BSOD предлагал "закоротить" функцию KeBugCheckEx, записав в её начало retn. На мой взгляд, на практике это оказался не самый лучший вариант, по этому я решил попробовать несколько своих идей: - Прибить поток, вызвавший исключение и(или) выгрузить драйвер. Увы, не увенчалось успехом, система либо зависала, либо уходила в ребут. - Заморозить вызвавший исключение поток. Тут возникли проблемы с KeSuspendThread, по этому решил попробовать простейший способ Jmp $. Само собой BSOD, уже не наблюдался но вот тормозила машина ужасно, оно и понятно. Решением было использовать функцию KeDelayExecutionThread NTSTATUS KeDelayExecutionThread IRQL == PASSIVE_LEVEL Параметры Останавливает работу на указанный интервал, независимо от производительности процессора IN KPROCESSOR_MODE WaitMode Для драйверов: KernelMode IN BOOLEAN Alertable Для драйверов: FALSE IN PLARGE_INTEGER TimeInterval Время задержки в 100нс интервалах Возвращаемое значение STATUS_SUCCESS — ожидание завершено Далее был написан код драйвера: ; драйвер, компилить FASM format PE native 4.0 include "%fasminc%/win32a.inc" include 'Driver.mac' ;************************************************************************* proc main,pDriverObject,pDriverPath ;****************************************** mov eax,[NtBuildNumber] ; проверим версию винды, т.к. mov ax,[eax] ; в XP нужно падчить другую функцию cmp ax,893h ; этот код будет работать только на W2k jne ERROR_VER ;*******************win2000*************** mov eax,[KeBugCheckEx] ; mov [BugCheck_ADR],eax ; разрешим запись в кодовые страници памяти ; clear WP mov eax,cr0 push eax and eax,0xFFFEFFFF mov cr0,eax ;save ; сохраним первые 8 байт из обработчика БДС mov ecx,8 mov esi,[BugCheck_ADR] mov edi,KeBugCheck_temp rep movsb ;edit ; запишем адресс нашего обработчика БДС mov dword[jmp_c+2],BugCheck ; запишем в начало KeBugCheckEx jmp на наш обработчик mov ecx,8 mov esi,jmp_c mov edi,[BugCheck_ADR] rep movsb ; востановим значение флага записи ; restore WP pop eax mov cr0,eax ; Unload Reg ; зарегистрируем функцию выгрузки драйвера mov eax,[pDriverObject] add eax,34h mov dword[eax],UnloadDriver mov eax,0 ret ; ERROR VERSION ERROR_VER: mov eax,STATUS_DEVICE_CONFIGURATION_ERROR ret endp ;******************************UNLOAD************************************* proc UnloadDriver,pDriverObject ; функция выгрузки драйвера pushad ;*** ; clear WP mov eax,cr0 push eax and eax,0xFFFEFFFF mov cr0,eax ;undo ; востановим первые 8 байт обработчика БДС mov ecx,8 mov esi,KeBugCheck_temp mov edi,[BugCheck_ADR] rep movsb ; restore WP pop eax mov cr0,eax ;*** popad mov eax,0;STATUS_DEVICE_CONFIGURATION_ERROR ret endp ;************************************************************************* ;************************************************************************* proc BugCheck,BugCheckCode,BugCheckParameter1,BugCheckParameter2,BugCheckParameter3,BugCheckParameter4 ;**** собственно наш обработчик BC_1: invoke KeDelayExecutionThread,0,0,DelayTime ;ожидать ;KeDelayExecutionThread удаляет программный поток из очереди "ready to run", ;следовательно, не мешает выполнению других потоков, готовых к работе. jmp BC_1 ret endp ;************************************************************************* ;************************************************************************* KeBugCheck_temp: dd 0h dd 0h BugCheck_ADR dd 0h DelayTime: dd 0ffffffffh dd 0ffffffffh dd 0ffffffffh dd 0ffffffffh jmp_c: nop mov eax,BugCheck jmp eax nop ;******************************************** ;*********************IMPORT****************** section '.idata' import data readable writeable syslibrary ntoskrnl,"ntoskrnl.exe" include 'ntoskrnl.inc' ;********************************************* mov eax,main ;********************************************* section '.reloc' data fixups readable discardable Код для вызова BSOD: format PE native 4.0 include "%fasminc%/win32a.inc" include 'Driver.mac' proc main,pDriverObject,pDriverPath xor eax,eax mov [eax],eax mov eax,STATUS_DEVICE_CONFIGURATION_ERROR ret endp ;*********************IMPORT****************** section '.idata' import data readable writeable syslibrary ntoskrnl,"ntoskrnl.exe" include 'ntoskrnl.inc' ;********************************************* mov eax,main ;********************************************* section '.reloc' data fixups readable discardable Прикреплённый файлBSOD.rar (2.14 Кбайт, скачиваний: 619) |