Ошибка загрузки/выгрузки драйвера, если 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 (MyDriver1 + 0x0)

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

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

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

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

(0001) MyDriver1! DriverEntry (MyDriver1 + 0x0)

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.