Подписаны ли DLL-библиотеки Windows корпорацией Майкрософт? Могу ли я определить, были ли они подделаны третьей стороной?

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

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

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

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

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

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

Спасибо, парни.


person TheAgent    schedule 22.12.2008    source источник


Ответы (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 использует root сертификаты для некоторых целей проверки. Он не публикует открытые ключи в своих системных двоичных файлах Windows, потому что пары ключей могут меняться и меняются.

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

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

person HTTP 410    schedule 22.12.2008
comment
Спасибо RoadWarrior. У меня есть опыт в этой области, и я знаю, сколько усилий мне нужно потратить на блокировку моего программного обеспечения. Вы должны нарисовать защитный круг вокруг своей собственности, исходя из имеющегося у вас времени и ресурсов. Чем больше круг, тем безопаснее ваше приложение. - person TheAgent; 23.12.2008
comment
Просто помните, что чем безопаснее ваше приложение, тем меньше вероятность того, что оно будет использоваться. - person HTTP 410; 26.12.2008

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

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

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

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

person James Ogden    schedule 22.12.2008
comment
Я понимаю это много. Единственное, что мне нужно в этом случае, это открытый ключ, предоставленный Microsoft для проверки подписи Windows DLL. Этого было бы достаточно, и я уверен, что сигнатура изобретена для таких целей. - person TheAgent; 22.12.2008
comment
Кроме того, я мог бы написать подпрограммы Crypto. Я делаю свой код слишком неясным, чтобы взломщик мог найти мою логику проверки, и я размещаю логику проверки во многих разных местах. Приложение также не информирует пользователя о взломе, просто иногда оно дает сбой. Это хорошая схема защиты! - person TheAgent; 22.12.2008
comment
Я был бы на 99% уверен, что если Microsoft подписала двоичные файлы, они уже проверяют эти подписи как часть своего собственного механизма безопасности. - person Paul; 22.12.2008
comment
Я знаю, что они не проверяют свои собственные файлы, так как я видел, как люди фактически меняют библиотеки DLL, такие как Kernel32. - person TheAgent; 22.12.2008

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

person Broam    schedule 15.03.2010

К сожалению, проверка цифровых подписей собственных DLL-библиотек Microsoft, какой бы замечательной ни была идея в теории, на практике является совершенно спорным вопросом. Почему? Вы спросите. Потому что 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"

Так что, как видите, надежды на то, что они сделают это в ближайшее время, нет.

Так что да.... ПОЗОР ВАМ, МАЙКРОСОФТ!

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

person ahmd0    schedule 02.06.2017