是否可以以某种方式将 .NET 可执行文件限制在特定机器上,以便它只能在该机器上运行。
8 回答
是的,我在我的应用程序中这样做。它工作得很好。
使用 WMI 轻松获取系统信息(CPUID、MacID、HDD 详细信息)(强烈推荐)。
我创建了一个几乎万无一失的系统(除非您是专业黑客)。
当我的应用程序首次安装在用户的 PC 上时,它们会使用 Web 服务返回到我的服务器。他们使用密码哈希来标识自己,并为客户寻找授权代码/订单 ID。
如果客户端具有正确的授权代码,应用程序会加密系统详细信息并将其存储在客户端计算机上,并将信息的哈希发送到存储它的服务器。然后使用一些散列标志在客户端的计算机上激活该软件,并且每次运行应用程序时,系统信息都会与文件中的散列信息进行比较。
如果客户重新格式化计算机,他只需要订单ID即可再次自动激活软件(当程序与我的服务器进行检查时,系统详细信息将被验证并批准,如果它们匹配)。如果客户在另一台机器上安装软件,他必须联系我的支持团队以获得批准。
-- 所有信息都经过加密和散列(双重加密)。-- 所有代码都被混淆和打包。
目前它工作得非常安全。
所以是的,这是可能的,它已经过现场测试,发现与任何其他保护系统一样有效。
无法使用处理器 ID 并每次都检查它(?)
这是我一段时间前写的示例代码。
Imports System.Management
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Declare following three object variables
Dim objMOS As ManagementObjectSearcher
Dim objMOC As Management.ManagementObjectCollection
Dim objMO As Management.ManagementObject
'Now, execute the query to get the results
objMOS = New ManagementObjectSearcher("Select * From Win32_Processor")
objMOC = objMOS.Get
'Finally, get the CPU's id.
For Each objMO In objMOC
MessageBox.Show("CPU ID = " & objMO("ProcessorID"))
Next
'Dispose object variables
objMOS.Dispose()
objMOS = Nothing
objMO.Dispose()
objMO = Nothing
End Sub
End Class
假设机器有一个 NIC,您可以使用MAC 地址:
开箱即用 - 不。
您可以尝试在安装过程中生成机器签名,并在签名文件不存在或对该特定机器无效时锁定您的应用程序以使其无法启动。
.NET 很糟糕,因为使用常用工具很容易将其还原为源代码。(我们做了一个演示,我们在大约 2 分钟内破解了 .NET)。Cyril 的解决方案听起来不错,因为他正在对目标机器使用加密和指纹散列。遗憾的是,这些解决方案很容易受到某些中间人攻击,尽管他的解决方案听起来比大多数解决方案都好。机器绑定的一个问题是,您要使用的指纹令牌(如 MAC 地址、CPU 序列号等)必须通过操作系统调用来检索,这可能会被中级破解者欺骗。
根据您软件的价值,使用 CodeMeter、Hasp HL 或 KeyLok 等优质加密狗将为您提供重要的保护。不过,使用“坏”的加密狗对您没有一点帮助。
为此,您需要将您的许可证代码嵌入从机器的 MAC ID、HDD ID、CPU ID 等生成的某种机器代码中。
然后使用运行软件时生成的机器代码检查此嵌入代码。如果这些不匹配,则意味着该软件正在另一台机器上使用。
如果您想要支持此方案的现成许可证方案,请参阅CryptoLicensing
您可以对您的 EXE 进行数字签名并使用证书来帮助提供某种保护,但是如果您真的想阻止您的 EXE 在特定 PC 上运行,您最好提示用户输入密码并使用密钥文件?
.NET 加密示例 http://aspnet.4guysfromrolla.com/articles/112002-1.aspx http://www.eggheadcafe.com/articles/20020630.asp
如果您想要支持此方案的现成许可证方案,请参阅 CryptoLicensing
这不是真的。CryptoLicensing 仅使用计算机名称,甚至不使用 CPU ID。