EreTIk's Box » Cтатьи, исходники » О подписи исполняемых файлов... в очередной раз


Тема embedded-подписи драйверов Windows не нова. Есть достаточно подробное описание Digital Signatures for Kernel Modules on Windows. Документ большой: прочел, написал cmd-файлы и забыл.


Но недавно мне понадобилось собирать исполняемые файлы пользовательского режима с флагом IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY и, естественно, цифровой подписью. Решение было простым: с использованием cmd-файлов для подписи драйверов были успешно подписаны и файлы пользовательского режима. Smoke-тесты дали отличные результаты. А вот запуск на Windows Vista дал ошибку 577 (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.

Проведя несколько тестов и поискав на просторах MSDN было найдено много рекомендаций подписывать user mod'ные модули с ключем /ph. Это и стало решением проблемы. А о том, что проблемными платформами являются Windows Vista и 2008 Server, говорит статься Forced Integrity Signing of Portable Executable (PE) files: Use the /ph option with SignTool:


During both test signing and release signing, you must use the /ph (page hash) flag with SignTool when signing user mode binaries with the IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY flag set. On Windows 7 and Windows Server 2008 R2, page hashes are optional, but recommended for performance reasons. The /ph option requires the computer used to sign target files to be using Windows Vista, Windows Server 2008 or later OS versions.

ΞρεΤΙκ