4

我正在为我的软件实施锁定和复制保护系统。我已经关闭了每个允许有人打破我的锁的洞(嗯,这有点太乐观了,我知道!)但最后一件事是:

我听说破解者可以更改像 Kernel32.dll 这样的 Windows DLL,我使用的 API 返回一个由破解者指定的值。我需要防止这种情况。

起初我以为我可以为我使用的每个 DLL 创建一个哈希值,然后根据客户端 DLL 的计算哈希检查该哈希值,以查看文件是否已更改。这是行不通的,因为不同版本的 Windows 有许多不同版本的 DLL,而且 Microsoft 提供的每个修补程序和服务包都可能更改文件。

然后我意识到我可以检查文件的签名以确保它具有有效的 Microsoft 签名。现在有2个问题:

  1. Microsoft 是否签署 Windows DLL?我怎样才能找到有关此签名的一些信息?
  2. 是否提供了公钥来验证签名?如何使用此密钥来验证文件?

非常感谢任何演练。我的应用程序是使用 Visual Basic.NET 编写的。

多谢你们。

4

4 回答 4

8

MS 确实签署了一些系统二进制文件,具体取决于 Windows 和二进制文件的版本。例如,如果您在 Windows XP 上检查kernel32.dll:

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 系统二进制文件中发布公钥,因为密钥对可以而且确实会改变。

但是从根本上说,如果您不信任操作系统,那么无论如何您都是fubar。

面对现实,您的应用程序将被破解。我的建议是只花 1% 的精力来减缓破解过程,而 99% 的精力用于创造值得破解的东西。

于 2008-12-22T16:04:25.600 回答
6

您是要编写自己的加密例程以便自己验证签名,还是要信任 Crypto API?您是否要在加密 dll 上使用签名来验证加密 dll?

谁在看守望者?

你会想要编写自己的操作系统,最好确保它不能在虚拟机中运行!也许您也应该制作自己的硬件硬件。

最终,你必须相信一些东西。真的。如果您不准备信任用户,请信任操作系统,因为如果您不信任它,您最终将推出自己的硬件以使其“安全”。是的,有人会破解你的软件——这几乎是不可避免的。一定要让它变得困难,但请记住回报会减少(迅速!)

于 2008-12-22T11:58:23.990 回答
0

其他答案说您可以检查磁盘上的副本是否未被修改。您是内存副本的 SOL。

于 2010-03-15T15:36:00.857 回答
0

不幸的是,检查微软自己的 DLL 的数字签名,无论它在理论上多么伟大,在实践中都是一个完全没有实际意义的问题。为什么?你会问。因为微软似乎并不关心签署大量他们自己的系统 DLL。

理论上,您可以使用此 C 代码的一个版本来检查可执行文件是否经过数字签名以及可执行文件是否完整/未更改,但如果您实现它并检查可能加载到您的进程中的所有系统 DLL,您将大失所望。

例如,从加载到我的进程中的大约 50 个系统 DLL 中,以下主要库没有签名

视窗 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"

视窗 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."

于 2017-06-02T09:08:52.517 回答