我正在为我的软件实现锁定和复制保护系统.我已经关闭了每一个允许有人打破锁定的洞(嗯,这有点过于乐观,我知道!)但最后一件事就是这样:
我听说破解者可以像我使用的API一样改变像Kernel32.dll这样的Windows DLL,返回一个由破解者指定的值.我需要阻止这一点.
起初我以为我可以为我使用的每个DLL创建一个哈希值,并根据客户端DLL的计算哈希检查该哈希,以查看该文件是否已更改.这不起作用,因为对于不同版本的Windows有许多不同版本的DLL,并且Microsoft提供的每个修补程序和Service Pack都可以更改该文件.
然后我意识到我可以检查文件的签名,以确保它具有有效的Microsoft签名.现在有两个问题:
> Microsoft是否签署了Windows DLL?我怎样才能找到关于此签名的一些信息?
>是否提供了用于验证签名的公钥?如何使用此密钥验证文件?
任何演练都非常感谢.我的应用程序是使用Visual Basic.NET编写的.
多谢你们.
解决方法
MS会签署一些系统二进制文件,具体取决于Windows和二进制文件的版本.例如,如果您在Windows XP上使用
check 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确实使用root certificates进行某些验证.它不会在其Windows系统二进制文件中发布公钥,因为密钥对可以并且确实会发生变化.
但从根本上说,如果你不信任操作系统,那么无论如何你都是如此.
面对它,您的应用程序将被破解.我的建议是只花1%的努力来减缓破解过程,99%的努力是创造值得破解的东西.