Windows DLL подписаны Microsoft? Могу ли я определить, были ли они подделаны третьей стороной? - PullRequest
4 голосов
/ 22 декабря 2008

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

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

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 22 декабря 2008

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% на создание чего-то, что стоит взломать.

4 голосов
/ 22 декабря 2008

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

Кто смотрит на наблюдателей?

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

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

0 голосов
/ 02 июня 2017

К сожалению, проверка цифровой подписи собственных библиотек 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"

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

Так что да ... ПОЗРЯЙТЕСЬ, MICROSOFT!

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

0 голосов
/ 15 марта 2010

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

...