Ошибка загрузки/выгрузки драйвера, если WinDbg подключен с точкой останова

Я только начал с разработки драйверов. Для некоторых экспериментов с загрузкой, разгрузкой и отладкой я написал следующий простой драйвер:

#include <ntddk.h> 
void DriverUnload(PDRIVER_OBJECT pDriverObject) 
{ 
 UNREFERENCED_PARAMETER(pDriverObject);
 DbgPrint("Driver unloading\n"); 
} 
NTSTATUS DriverEntry( 
 PDRIVER_OBJECT DriverObject, 
 PUNICODE_STRING RegistryPath) 
{ 
 UNREFERENCED_PARAMETER(DriverObject);
 UNREFERENCED_PARAMETER(RegistryPath);
 DriverObject->DriverUnload = DriverUnload; 
 DbgPrint("Hello, World\n"); 
 return STATUS_SUCCESS; 
}
</ntddk.h>

Я скомпилировал драйвер для моей целевой системы, Windows 7 64bit, с отладочными символами, скопировал ее в целевую систему и загрузил и запустил ее с помощью Loader Loader OSR.

Все работает отлично, и я могу разгрузить и загрузить драйвер:

Я могу подключиться к WinDbg, используя последовательное соединение, и могу успешно сломать и запустить целевую систему. Однако проблема возникает, когда я пытаюсь установить точку останова.

Сначала я попытался установить точку останова следующим образом:

kd > bp MyDriver1! DriverEntry

но проблема была в том, что если я перезагрузил драйвер и проверил точки останова:

kd > bl 0 e fffff880`03572010 0001 (0001) < Unloaded_MyDriver1.sys> + 0x1010

Для меня, как для новичков, он выглядел неплохо (разгружен?), и при загрузке никаких перерывов не было.

Итак, я узнал, что его можно установить точку останова при загрузке модуля:

kd > bu MyDriver1

0 e fffff880`03578000 0001 (0001) MyDriver1! DriverEntry <perf> (MyDriver1 + 0x0)</perf>

Когда я продолжу выполнение системы после указанной выше команды и загрузите драйвер (net start MyDriver1), система выйдет из строя:

Исключение команды исключения - код 80000003 (первый шанс)

<ul> <li> *</li> <li> Вы видите это сообщение, потому что вы нажали либо *</li> <li> CTRL + C (если вы запускаете отладчик ядра консоли) или *</li> <li> CTRL + BREAK (если вы используете отладчик ядра GUI), *</li> <li> на клавиатуре вашего отладчика. *</li> <li> *</li> <li> ЭТО НЕ БЫСТРОЕ ИЛИ СБРОС СИСТЕМЫ *</li> <li> *</li> <li> Если вы не собираетесь входить в отладчик, нажмите клавишу "g", затем *</li> <li> нажмите клавишу "Enter". Это сообщение может сразу появиться. Если это *</li> <li> снова нажмите "g" и "Enter". *</li> <li> * </li> </ul>

nt! RtlpBreakWithStatusInstruction: fffff800 <code>028ca490 cc int 3 kd > bu MyDriver1 kd> bl 0 e fffff880</code> 03572010 0001

(0001) MyDriver1! DriverEntry <perf> (MyDriver1 + 0x0)</perf>

kd > bc 0 kd > bl 1 e fffff880`03578000 0001 (0001)

MyDriver1! DriverEntry (MyDriver1 + 0x0)

kd > g Нарушение прав доступа - код c0000005 (!!! второй шанс!!!)

nt! IopUnloadDriver + 0x327: fffff800`02cb8b29 0fb74844 movzx

ecx, слово ptr [rax + 44h]

Наконец, если я продолжу выполнение сейчас, я получаю BSOD...

Что здесь не так? Является ли мой код неправильным или я неправильно установил точки останова?

1 ответ

Команда, которую вы ищете,   sxe ld: MyDriver1

Это разрывается, когда драйвер отображается в память, но перед вызовом MyDriver1! DriverEntry и позволит вам установить точки останова в DriverEntry.

Команда bu MyDriver1 помещает точку останова в первый байт заголовка PE образа драйвера.

Кроме того, очистите точки останова после выгрузки драйвера, иначе вы можете отладчик изменить память, которая может быть выделена для чего-то еще.

licensed under cc by-sa 3.0 with attribution.