вторник, 31 октября 2017 г.

Long road to launch boot driver

Понадобилось мне как-то запустить проприетарный boot драйвер на x86 windows.
Зарегистрировал его в System Bus Extender группе, запустил, и поймал startup repair на старте ОС.
Что же, BSOD'a нет - уже хорошо, подумал я тогда.

Проверил внешние зависимости - они были.
Вот только были они от системных драйверов(NDIS и прочие), никаких других сторонних компонентов не было.
Несмотря на то, что LoadOrder показывал, что тот же NDIS стартовал как boot, но с тагом N/A, то есть позже, все равно при ресолве импорта он был бы подгружен системой. Дело было в чем-то другом.

Я предположил, что в структуре файла.
Проверил CRC в хедере - все в норме, security directory пуста(подписи нет), разве что peverify выдал нечто вроде: Warning: cannot find address of 'ExReleaseFastMutex' in 'HAL.dll',
но это лишь варнинг, что сам верифай и подтвердил: Everything is OK. File is correct and can be loaded by system loader.
То есть, со структурой файла было всё в порядке.

Не придумав ничего другого, как пробежать момент загрузки в отладчике( бряк на IopLoadDriver ), я дошел в windbg до точки входа и ... драйвер загрузился. Это было как-то совсем странно, обычно бывает наоборот, под отладчиком программы не грузятся из-за антиотладки, а у меня случилось vise versa.

Далее я решил позагружать драйвер вручную, через kmdmanager, он драйвер не загрузил и выдал что-то типа error number not found. Wtf???
Пришлось загружать через свою тулзу. Наконец, я получил код ошибки:

ERROR_INVALID_IMAGE_HASH

Windows cannot verify the digital signature for this file.
A recent hardware or software change might have installed a file that is signed incorrectly or damaged, or that might be malicious software from an unknown source.


Тут я повторно сказал - WTF! Какие подписи на x86? Пробую запустить свой драйвер пустышку без всяких подписей - запускается.

После перелопаченного гугла решение паззла нашлось - https://msdn.microsoft.com/en-us/library/windows/hardware/dn653559(v=vs.85).aspx

В частности, в доке сказано, что:

• Boot-start drivers should contain an embedded signature.

Именно она и находилась в моем драйвере( но невалидная или поврежденная ).

Также, в доке есть другой полезный раздел:

How to Disable Signature Enforcement during Development

During the early stages of development, developers can disable enforcement in Windows so that driver signing is unnecessary.
The following options are available for developers to temporarily disable kernel-mode code-signing enforcement so that Windows Vista will load an unsigned driver.

•    Attaching a kernel debugger.
    Attaching an active kernel debugger to the target computer disables the enforcement of kernel-mode signatures in Windows Vista and allows the driver to load.
•    Using the F8 option.
    An F8 Advanced Boot Option introduced with Windows Vista — “Disable Driver Signature Enforcement”
    — is available to disable the kernel-signing enforcement only for the current boot session. This setting does not persist across boot sessions.

Собственно, поэтому при активном отладчике драйвер у меня замечательно загрузился. А после “Disable Driver Signature Enforcement” на старте, наконец запустился и исходный драйвер.

Комментариев нет:

Отправить комментарий