Фильтр классового драйвера в Vista 64

Тема в разделе "WASM.X64", создана пользователем FallenGameR, 30 июл 2008.

  1. FallenGameR

    FallenGameR New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    10
    Есть драйвер-фильтр для классового драйвера клавиатур kbdclass. Написал на WiX с помощью DIFxAPP инсталлер, который успешно ставит драйвер на 32 и 64 разрядные WinXP, Win2003, а также на 32 разрядные Vista и Win2008.

    Однако при установке на 64 разрядные Vista и Win2008 драйвер не загружается и вешает клавиатуру с мышью. В диспетчере устройств написан код ошибки 37 (не удалось загрузить драйвер устройства). WinDBG к драйверу прицепиться не может. Драйвер должен писать в GlobalLogger через WPP трассировку, но лог тоже пуст.

    Драйвер, коинсталлер и cat-файл подписаны тестовым сертификатом. cat-файл причем создается уже по подписанным файлам. Тестовый сертификат добавляется как Root и TrustedPublisher на машину куда устанавливается (если не добавлять, то инсталлер не отрабатывает, и выдает ошибку, что не доверяет сертификату).

    В чем может быть проблема?

    В Digital Signatures for Kernel Modules on Systems Running Windows Vista (http://www.microsoft.com/whdc/winlogo/drvsign/kmsigning.mspx) написано:
    "The load-time signature check does not have access to the Trusted Root Certificate Authorities certificate store. Instead, it must depend on the root authorities that are built into the Windows Vista kernel. The Microsoft Code Verification Root is one of the root authorities trusted by the Windows Vista kernel and operating system loader:"

    Означает ли это что даже в режиме тестирования (Bcdedit.exe –set TESTSIGNING ON) драйвер-фильтр, подписанный тестовым сертификатом, будет всегда отклоняться? Как в таком случае вообще тестировать драйвер?
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    если к машине подключен ядерный отладчик - проверка подписи скипаеца
     
  3. FallenGameR

    FallenGameR New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    10
    По F8 она тоже должна пропускаться. Однако вот все равно не загружает.
    Есть какие-то хитрости с цеплянием WinDBG к стартующему при загрузке драйверу?

    Я отлаживал драйвер до этого по логам, а отладчик цеплял к уже загруженной системе.
    Правильно понимаю - нужно прописать пути к pdb файлам и сырцам, остановить систему, поставить брейк на DebugEntry, пустить систему, сделать ребут. И после ребута система должна остановиться на брейкпоинте.

    У меня она при этом не останавливается на брейке.
     
  4. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    ну с бутовыми дровами могут быть хитрости, реально, они могут стартовать раньше чем
    но ты же говоришь что у тебя фильтр на клаву-класс
    поставь его в мануал, грузи машину, цепляй дебагер, потом стартуй свой фильтр
    при такой последовательности 100% проверка дигитал-сигна скипается
    с брейкпойнтами там сложнее и я бы сказал рандомнее - то останавливается, то нет
    в доке написано что это зависит от старта дебагера, если он стартовал во время загрузки то тогда аппаратные бряки в ядре будут работать, если он подцеплен потом - то нет
    по моим наблюдениям - рандомно, то работают то нет :)
    а у тебя железная машина или вара?
     
  5. FallenGameR

    FallenGameR New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    10
    Машина железная. Похоже там проблема не в подписи:

    Загружаю машину:
    - в обычном режиме: в диспетчере устройств пишет код ошибки 39 (Не удалось загрузить драйвер устройства. Возможно он поврежден или отсутсвует. Также возникает если не прошла проверка подписи)
    - TESTSIGNING ON / F8 + отключениепроверки подписей / с прицепленым ядерным отладчиком: в диспетчере устройств пишет код ошибки 37 (Не удалось инициализировать драйвер устройства. Возможно провален DriverEntry.)

    Если в WinDBG поставить отображение загружаемых модулей, то пишет что драйвер грузился:

    ModLoad: fffff980`03c09000 fffff980`03c1f000 i8042prt.sys
    ModLoad: fffff980`03d67000 fffff980`03d75000 kbdclass.sys (class driver)
    ModLoad: fffff980`04620000 fffff980`0465f000 suppressor.sys (мой filter driver)

    Бряк на DriverEntry не останавливает. Ставлю его так: бряк в рабочую ОС, открываю сурс файл, ставлю бряк на первую строчку кода DriverEntry, отпускаю ОС, перезагружаю ее.

    Думал поставить бряк на адрес памяти, но в Vista рандомизация адресов загрузки модулей. От ребута к ребуту адрес загрузки драйвера меняется.

    Как остановить машину в таком случае - ХЗ.
     
  6. FallenGameR

    FallenGameR New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    10
    Поставил чтобы WinDBG делал бряк при перезагрузке (Ctrl+Alt+K):

    Код (Text):
    1. Loading symbols for fffff800`01c00000     ntkrnlmp.exe ->   ntkrnlmp.exe
    2. nt!DbgBreakPointWithStatus:
    3. fffff800`01c473c0 cc              int     3
    4. kd> bl
    5.  0 eu                      0001 (0001) (DriverEntry!suppressor)
    6.  1 eu                      0001 (0001) (suppressor!DriverEntry)
    7.  2 eu                      0001 (0001) (@@masm(`suppressor.c:78+`))
    Тоже не останавливает. Причем модуль драйвера грузится:
    Код (Text):
    1. ...
    2. ModLoad: fffff980`04298000 fffff980`042ae000 i8042prt.sys
    3. ModLoad: fffff980`0427f000 fffff980`0428d000 kbdclass.sys
    4. ModLoad: fffff980`04419000 fffff980`04458000 suppressor.sys
    5. ...
    6. ModLoad: fffff980`0616e000 fffff980`06177000 hidusb.sys
    7. ModLoad: fffff980`0431e000 fffff980`04328000 kbdhid.sys
    8. ModLoad: fffff980`064e5000 fffff980`06524000 suppressor.sys
    9. ...
     
  7. FallenGameR

    FallenGameR New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    10
    Причем если брякать на kbdclass!DriverEntry, то останавливается!
    Вопрос - почему модуль моего драйвера грузится но на DriverEntry не останавливается бряк?
    Возможно действительно DriverEntry из-за KMDF отрабатывает не первым и ощибка возникает до входа в код самомго драйвера?
    Как тогда на нее попасть-то?
     
  8. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    FallenGameR
    да, похоже что дело не в подписи
    че-то не нравится висте в процессе загрузки твоего драйвера, driverentry не вызывается:
    выложы свой бинарник - посмотрю у себя на варной лабе
     
  9. FallenGameR

    FallenGameR New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    10
    z0mailbox, спасибо большое за помощь.

    Ошибка оказалась не в самом драйвере, а в INF файле к нему.
    Драйвер написан KMDF и как подсказали на OSR online, сначала срабатывает FxDriverEntry, где происходит инициализация KMDF и в случае успеха вызов DriverEntry самого драйвера. Действительно, на bu suppressor!FxDriverEntry WinDBG стопит.

    Оказалось, что грузился KMDF не той версии под которую собран драйвер. !wdfkd.wdfldr выводит 1.5, а нужно 1.7.
    Сейчас копаю что нужно подправить в INF файле чтобы цеплялся нужный CoInstaller.