Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
articles:after-bsod.lite [2017/03/09 23:01]
91.108.183.162
articles:after-bsod.lite [2017/09/05 02:55] (текущий)
Строка 64: Строка 64:
 Так происходит потому,​ что в процессе инициализации драйвера-убийцы выполняются следующие строки,​ обращающиеся к нулевой ячейке памяти,​ что строго-настрого запрещено:​ Так происходит потому,​ что в процессе инициализации драйвера-убийцы выполняются следующие строки,​ обращающиеся к нулевой ячейке памяти,​ что строго-настрого запрещено:​
  
-NTSTATUS DriverEntry (PDRIVER_OBJECT pDriverObject,​ PUNICODE_STRING pusRegistryPath) +<code c> 
 +NTSTATUS DriverEntry (PDRIVER_OBJECT ​ pDriverObject,​ PUNICODE_STRING pusRegistryPath)
 { {
- + return *((NTSTATUS *) 0);
-return *((NTSTATUS *) 0); +
 } }
 +</​code>​
  
 **Листинг 1 фрагмент драйвера-убийцы,​ пытающийся прочитать двойное слово по нулевому указателю из режима ядра** **Листинг 1 фрагмент драйвера-убийцы,​ пытающийся прочитать двойное слово по нулевому указателю из режима ядра**
Строка 91: Строка 90:
 Даем команду "d esp" для отображения содержимого стека и видим (примечание:​ для удобства рекомендуется переключить окно дампа в режим двойных слов, воспользовавшись командой "​dd"​):​ Даем команду "d esp" для отображения содержимого стека и видим (примечание:​ для удобства рекомендуется переключить окно дампа в режим двойных слов, воспользовавшись командой "​dd"​):​
  
 +<​code>​
 :d esp :d esp
- +0010:​F7443C88 BE67C000 ​ 00000008 ​ 00200202 ​ 804A4431 ​     ..g....... .1DJ. 
-0010:​F7443C88 BE67C000 00000008 00200202 804A4431 ..g……. .1DJ. +0010:​F7443C98 81116AD0 ​ 8649D000 ​ BE8F1D08 ​ BE8F1D08 ​     .j....I......... 
- +0010:​F7443CA8 81480020 ​ F7443D34 ​ 745FFFFF ​ 83A49E60 ​      ​.H.4=D..._t`... 
-0010:​F7443C98 81116AD0 8649D000 BE8F1D08 BE8F1D08 .j.I……… +</​code>​
- +
-0010:​F7443CA8 81480020 F7443D34 745FFFFF 83A49E60 .H.4=D_t`+
  
 **Листинг 2 содержимое стека на момент возникновения сбоя** **Листинг 2 содержимое стека на момент возникновения сбоя**
Строка 105: Строка 103:
 Теперь мы знаем место сбоя и можем вывести дизассемблерный листинг на экран. В этом нам поможет команда "u *esp" (дизассемблировать содержимое памяти по адресу,​ лежащему по адресу,​ содержащемуся в регистре esp) или "u be67c000":​ Теперь мы знаем место сбоя и можем вывести дизассемблерный листинг на экран. В этом нам поможет команда "u *esp" (дизассемблировать содержимое памяти по адресу,​ лежащему по адресу,​ содержащемуся в регистре esp) или "u be67c000":​
  
 +<code asm>
 :u *esp :u *esp
- +0023:BE67C000 MOV EAX,​[00000000] 
-**0023:BE67C000MOVEAX,[00000000]** +0023:BE67C005 RET 0008 
- +0023:BE67C008 NOP 
-0023:BE67C005RET0008 +0023:BE67C009 NOP 
- +0023:BE67C00A NOP 
-0023:BE67C008NOP +0023:BE67C00B NOP 
- +</​code>​
-0023:BE67C009NOP +
- +
-0023:BE67C00ANOP +
- +
-0023:BE67C00BNOP+
  
 **Листинг 3 определение реального места сбоя** **Листинг 3 определение реального места сбоя**
Строка 139: Строка 133:
 На всякий случай,​ вот последовательность команд по реанимации системы. Напоминаю,​ что она применима только в данном частном случае:​ На всякий случай,​ вот последовательность команд по реанимации системы. Напоминаю,​ что она применима только в данном частном случае:​
  
 +<​code>​
 u *esp u *esp
 r eip = *esp r eip = *esp
Строка 148: Строка 143:
 r fl=I r fl=I
 x x
 +</​code>​
  
 **Листинг 4 реанимация системы в условиях,​ приближенных к боевым** **Листинг 4 реанимация системы в условиях,​ приближенных к боевым**