Являются ли Windows DLL подписанными Microsoft? Могу ли я определить, были ли они подделаны третьей стороной?

Я использую систему блокировки и защиты от копирования для своего программного обеспечения. Я закрыл каждую дыру, которая позволила бы кому-то сломать мой замок (ну, это слишком оптимистично, я знаю!), Но последнее: вот что:

Я слышал, что взломщики могут изменять DLL Windows, такие как Kernel32.dll, таким образом, что API, который я использую, возвращает значение, указанное в файле взломщика. Мне нужно предотвратить это.

Сначала мне показалось, что я могу сделать хэш-значение для каждой используемой DLL, и проверить этот хэш против вычисленного хэша клиентской DLL, чтобы увидеть, изменился ли файл. Это не сработает, так как существует множество различных версий DLL для разных версий Windows, и каждое исправление и пакет обновления, предоставленные Microsoft, могут изменить файл.

Тогда я понял, что могу проверить подпись файла, чтобы убедиться, что он имеет действительную подпись Microsoft. Теперь есть 2 вопроса:

  • Подписывает ли Microsoft Windows DLL? Как я могу найти информацию об этой сигнатуре?
  • Предоставляется ли открытый ключ для проверки подлинности? Как использовать этот ключ для проверки файла?

Любые пошаговые инструкции очень приветствуются. Мое приложение написано с использованием Visual Basic.NET.

Спасибо, ребята.

4 ответа

MS действительно подписывает некоторые системные двоичные файлы, в зависимости от версии Windows и двоичного файла. Например, если вы проверьте файл kernel32.dll в Windows XP:

C:\Windows\system32>sigcheck kernel32.dll
Sigcheck v1.5
Copyright (C) 2004-2008 Mark Russinovich
Sysinternals - www.sysinternals.com
C:\Windows\system32\kernel32.dll:
Verified: Signed
Signing date: 02:07 14/04/2008
Publisher: Microsoft Corporation
Description: Windows NT BASE API Client DLL
Product: Microsoft« Windows« Operating System
Version: 5.1.2600.3119
File version: 5.1.2600.3119 (xpsp_sp2_grd.070416-1301)

Вы также можете использовать sigcheck для создания таких вещей, как найти все неподписанные двоичные файлы в определенной папке, например.

sigcheck -u -e c:\windows\system32

Я считаю, что ответ на ваш второй вопрос - "нет", хотя MS использует корневые сертификаты для некоторых целей проверки. Он не публикует открытые ключи в своих системных двоичных файлах Windows, поскольку пары ключей могут и могут меняться.

Но в корне, если вы не доверяете ОС, тогда вы все равно фубар.

Посмотрите на него, ваше приложение будет разбито. Мой совет будет потратить всего 1% ваших усилий на замедление процесса взлома и 99% на создание чего-то, что стоит взломать.


Собираетесь ли вы писать свои собственные крипто-процедуры, чтобы вы могли самостоятельно проверить подпись, или вы будете доверять Crypto API? Вы собираетесь использовать сигнатуры на криптографических dll для проверки криптографических библиотек?

Кто наблюдает за наблюдателями?

Вам захочется написать свою собственную операционную систему, и вам лучше убедиться, что она не может быть запущена на виртуальной машине! Возможно, вы также должны создать собственное аппаратное обеспечение.

В конечном счете, вы должны что-то доверять. В самом деле. Если вы не готовы доверять пользователю, доверьтесь ОС, потому что, если вы не доверяете этому, вы в конечном итоге сворачиваете свое собственное оборудование, чтобы сделать его "безопасным". Да, кто-то взломает ваше программное обеспечение - это в значительной степени неизбежно. Сделать это сложно, но помните, что возврат уменьшается (быстро!)


К сожалению, проверки цифровой подписи Microsoft собственных библиотек DLL, однако большая идея это может быть в теории, это совершенно спорный вопрос на практике. Зачем? Вы спросите. Поскольку Microsoft, похоже, не хочет подписывать большое количество своих собственных системных DLL.

Теоретически вы можете использовать версию этого C-кода, чтобы проверить, является ли исполняемый файл цифровой подписью, и если исполняемый файл неповрежден/неизменен, но если вы его реализуете и просматриваете все системные DLL файлы, которые могут быть загружены в ваш процесс, вы будете очень разочарованы.

Например, из примерно 50 системных DLL, загруженных в мой процесс, следующие основные библиотеки не были подписаны!

Windows 8.1:

Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\MSIMG32.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\system32\COMDLG32.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\WINSPOOL.DRV"
Failed: hr=0x800B0100 "C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.9600.18006_none_623f33d3ecbe86e8\COMCTL32.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\oledlg.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\WinSxS\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.9600.18592_none_933383bf47487fd6\gdiplus.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\dbghelp.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\system32\uxtheme.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\RICHED20.DLL"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\USP10.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\msls31.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\system32\msftedit.dll"

Windows 10:

Failed: hr=0x800B0100 "C:\WINDOWS\system32\apphelp.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\System32\COMDLG32.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\MSIMG32.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\WINSPOOL.DRV"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\oledlg.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\WinSxS\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.14393.953_none_7300116921188239\gdiplus.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\dbghelp.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\system32\uxtheme.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\RICHED20.DLL"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\msls31.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\SYSTEM32\USP10.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\system32\msftedit.dll"
Failed: hr=0x800B0100 "C:\WINDOWS\system32\dataexchange.dll"

Итак, как вы видите, у них нет надежды на это в ближайшее время.

Так что да.... ПОЗДРАВЛЯЕМ ВАС, MICROSOFT!

PS. Код ошибки 0x800B0100= "No signature was present in the subject."


Другие ответы говорят, что вы можете проверить, что копии на диске не были изменены. Вы используете SOL для копий в памяти.

licensed under cc by-sa 3.0 with attribution.