Что вызвало сбой моего драйвера минипорта NDIS на ОС XP
Я написал простой драйвер фильтра пакетов, основанный на примере "passthru" Windows DDK, когда я включил функцию фильтра, ОС потерпела крах, и я получил следующее сообщение из WinDbg:
Microsoft (R) Windows Debugger Версия 6.12.0002.633 X86 Авторское право (c) Корпорация Microsoft. Все права защищены.
Загрузка файла дампа [D:\iCheckTool\dump\MEMORY.DMP] Файл дампа сводки ядра: доступно только адресное пространство ядра
ВНИМАНИЕ: Пробелы в начале элемента path Путь поиска символа: D:\iCheckTool\dump; SRV*E:\DebuggingSymbols*http://msdl.microsoft.com/download/symbols;SRV*C:\MyLocalSymbols*http://192.168.20.25/zfprisymbols/ Путь поиска исполняемого файла: Windows XP Kernel Version 2600 (Service Пакет 3) MP (2 процесса) Бесплатный x86-совместимый Продукт: WinNt, набор: TerminalServer SingleUserTS Построен: 2600.xpsp_sp3_qfe.120504-1617 Имя машины: Ядро базы = 0x804d8000 PsLoadedModuleList = 0x8055e720 Время сеанса отладки: вторник, 11 сентября 09:41:02.828 2012 (UTC + 8:00) Время работы системы: 0 дней 0:02:30.578 Загрузка символов ядра............................................................................................................................ Загрузка пользовательских символов PEB выгружается (Peb.Ldr = 7ffd800c). Для получения подробной информации наберите ".hh dbgerr001" Загрузка списка выгруженных модулей........
- *
- Анализ ошибок *
- *
Используйте! Analysis -v, чтобы получить подробную информацию об отладке.
BugCheck C5, {4, 2, 1, 8054c10f}
Вероятно, вызвано: Pool_Corruption (нет!ExDeferredFreePool+109)
Продолжение: Pool_corruption
1: kd>! Анализировать -v
- *
- Анализ ошибок *
- *
DRIVER_CORRUPTED_EXPOOL (c5) Была предпринята попытка получить доступ к адресу страницы (или полностью недействительному) на слишком высоком уровне запроса прерывания (IRQL). Это вызвано драйверами, которые повредили системный пул. Запустите средство проверки драйверов для любых новых (или подозрительных) драйверов, и если это не выявит виновника, используйте gflags для включения специального пула. Аргументы: Arg1: 00000004, ссылка на память Arg2: 00000002, IRQL Arg3: 00000001, значение 0 = операция чтения, 1 = операция записи Arg4: 8054c10f, адрес, на который ссылается память
Детали отладки:
BUGCHECK_STR: 0xC5_2
CURRENT_IRQL: 2
FAULTING_IP: nt! ExDeferredFreePool + 109 8054c10f 895f04 mov
dword ptr [edi + 4], ebxDEFAULT_BUCKET_ID: DRIVER_FAULT
PROCESS_NAME: explorer.exe
TRAP_FRAME: b42555dc - (.trap 0xffffffffb42555dc) ErrCode = 00000002 eax=89cc1c60 ebx=89e4ded8 ecx=000001ff edx=89cc2a78 esi=80565d20 edi=00000000 eip=8054c1056 esp nb = es50 cy cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010297 nt!ExDeferredFreePool+0x109: 8054c10f 895f04 mov dword ptr [edi+4],ebx ds:0023:00000004=???????? Сброс области по умолчанию
LOCK_ADDRESS: 8055c4e0 - (! Блокирует 8055c4e0)
Resource @ nt! PiEngineLock (0x8055c4e0) Доступное число конфликтов = 1 1 всего блокировок
PNP_TRIAGE: Адрес блокировки: 0x8055c4e0 Количество потоков: 0 Адрес потока: 0x00000000 Ожидание потока: 0x0
LAST_CONTROL_TRANSFER: от 8054c10f до 80545768
STACK_TEXT: b42555dc 8054c10f badb0d00 89cc2a78 b8338538 нт KiTrap0E+0x238 b4255690 8054c75f 00000001 8055c100 00020019 нт ExDeferredFreePool+0x109 b42556d0 8058635e 899522e8 00000000 b42557d8 нт ExFreePoolWithTag+0x47f b42556fc 805878b8 c0000023 00000007 8058758c нт PiGetDeviceRegistryProperty+0x108 b425578c bf879f40 8a523030 00000001 00000100 нт IoGetDeviceProperty!!! +0x25e b42558f8 bf879735 00000000 e1b5e008 00000000 win32k!DrvEnumDisplayDevices+0x33b b425591c 8054268c 00000000 00000000 0007ecc4 win32k! Следующие кадры могут быть неправильными. 0007f010 00000000 00000000 00000000 00000000 0x7c92e514
STACK_COMMAND: кб
FOLLOWUP_IP: nt! ExDeferredFreePool + 109 8054c10f 895f04 mov
dword ptr [edi + 4], ebxSYMBOL_STACK_INDEX: 1
SYMBOL_NAME: нет! ExDeferredFreePool + 109
FOLLOWUP_NAME: пул_коррупция
IMAGE_NAME: Pool_Corruption
DEBUG_FLR_IMAGE_TIMESTAMP: 0
MODULE_NAME: Pool_Corruption
FAILURE_BUCKET_ID: 0xC5_2_nt! ExDeferredFreePool + 109
BUCKET_ID: 0xC5_2_nt! ExDeferredFreePool + 109
Продолжение: Pool_corruption
Может кто-нибудь сказать мне, что вызвало эту проблему и как ее исправить? Благодарю.
1 ответ
Видимо, вы пытались записать в недопустимую область памяти (адрес = 0x4). Помимо этого, анализ отладчика, который вы опубликовали, не слишком полезен. Вы можете попытаться найти свой стек драйверов (которого нет в опубликованных результатах отладки) в отладчике, чтобы получить код ошибки, но это не гарантировано. Другие методы для атаки включают в себя добавление отладочных отпечатков в ваш код и захват их с помощью DbgView (вы можете позже извлечь их из дампа памяти). И вы также можете подключить отладчик ядра и поймать ошибку, когда это произойдет.