.NET单机软件保护策略(3)机器码和有效期

机器码

机器码是一台电脑的身份证,在软件认证时就是对这个身份进行认证。一般机器码由提取电脑的硬件信息生成,包括CPU ID、硬盘序列号、主板序列号和MAC地址等。正常的电脑以上信息都有,但也不排除部分没有,例如没有网卡,就没有MAC地址。但这不影响,我们使用某一个,或某些合并到一起都可以。

获取CPU ID:

ManagementClass mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
    hardwareId += mo.Properties["ProcessorId"].Value.ToString();
    break;
}

获取硬盘序列号:

ManagementClass mc = new ManagementClass("Win32_PhysicalMedia");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
    hardwareId += mo.Properties["SerialNumber"].Value.ToString();
    break;
}

获取主板序列号:

ManagementClass mc = new ManagementClass("Win32_BaseBoard");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
    hardwareId += mo.Properties["SerialNumber"].Value.ToString();
    break;
}

假设我们把上述三个信息都用了起来,并把它们拼成一个字符串,那么将会得到类似以下的字符串:

335A_4830_4D61_3643_0025_3841_0000_0001./8J9J2X2/CNCMK0096S0093/BFEBFBFF000906EA

这样的字符串复制还可以,如果要手抄一下,就会很麻烦。而且它暴露了实际的硬件信息,会引导用户去修改自己的硬件信息以达到一致。所以,一般我们会对上述字符串进行哈希处理,例如是MD5、SHA1或者SHA256。在得到字节数组之后,再进行一个Base24编码,就可以得到形如3F89V-24K9X-3LS7R-5HNBD-CDF8H的序列号了。

有效期

如果是在线软件,那直接读取电脑时间,一点问题也没有。但对于单机软件,这可是一个大麻烦,因为电脑时间可以随便改!

为了防止这个问题,其中一个方法就是不让改时间。对于定制的特殊用途的软件,可能整台电脑都是定制的,在这种情况下就可以使用这个方法。例如在管理员模式下,设置组策略,禁止修改电脑时间,然后不让用户得到管理员身份就可以了。

在软件上,我们也可以做点事情,但不会很完美。例如,我们可以在初次安装软件时,生成一个时间戳文件。软件在运行的过程中,不断去检查和更新这个文件。如果这个文件丢失了,就要重新认证。这个文件是经过加密的,用户无法直接修改。如果发现当前时间比上次记录的时间小,软件不能运行。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在VB.NET中,我们可以使用系统的WMI(Windows管理界面)类来读取机器码,并实现注册功能。 首先,我们需要添加System.Management命名空间的引用。然后,我们可以使用ManagementObjectSearcher类和ManagementObjectCollection类来执行WMI查询,以获取机器码。 ``` Imports System.Management Public Class Form1 Private Function GetMachineCode() As String Dim scope As New ManagementScope("\\.\root\cimv2") Dim query As New ObjectQuery("SELECT * FROM Win32_BaseBoard") Dim searcher As New ManagementObjectSearcher(scope, query) Dim collection As ManagementObjectCollection = searcher.Get() Dim machineCode As String = "" For Each obj As ManagementObject In collection machineCode = obj("SerialNumber").ToString() Next Return machineCode End Function Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim machineCode As String = GetMachineCode() ' 将机器码保存到注册表或其他存储位置 ' 注册功能的实现 ' 你可以在注册功能中比对保存的机器码和当前获取的机器码,以验证注册信息 End Sub End Class ``` 上述代码中,我们使用WMI查询Win32_BaseBoard类来获取主板信息,其中的SerialNumber属性作为机器码。你可以根据需要修改查询语句和获取的属性。 获取到机器码后,你可以将其保存到注册表或其他安全的存储位置。在注册功能的实现中,你可以比对保存的机器码和当前获取的机器码,以验证注册信息的有效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值