На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Все статьи должны быть оформлены согласно Правил оформления статей.
2. Любые обсуждения должны происходить в специальной теме, обсуждение в любых других темах раздела запрещены.
3. Запрещается писать статьи о создании и распространении вирусов, троянов и других вредоносных программ!
4. За грамотно написанные и правильно оформленные статьи авторы награждаются DigiMoney.

Дополнительные ссылки:
Желаю творческих успехов! ;)
Модераторы: Jin X
  
    > Убираем BSOD (способ решения проблемы) , FASM, Win, Zen
       
      Убираем 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 — ожидание завершено

      Далее был написан код драйвера:
      ExpandedWrap disabled
        ; драйвер, компилить 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:
      ExpandedWrap disabled
        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)
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0238 ]   [ 16 queries used ]   [ Generated: 19.04.24, 03:31 GMT ]