【问题标题】:.NET copy protection.NET 复制保护
【发布时间】:2010-11-11 15:35:15
【问题描述】:

是否可以以某种方式将 .NET 可执行文件限制在特定机器上,使其只能在该机器上运行。

【问题讨论】:

  • 请提供更多信息。你这样做的目的是什么?
  • 如果您想防止意外误用或恶意用户(后者要复杂得多),会很有趣。
  • 试图防止非法复制我的应用程序
  • 不是所有主要的软件公司都尝试过这个并失败了吗?
  • 差不多,是的。阿里,我建议你阅读en.wikipedia.org/wiki/…

标签: .net copy-protection


【解决方案1】:

如果您想要支持此方案的现成许可方案,请参阅 CryptoLicensing

这不是真的。 CryptoLicensing 仅使用计算机名称,甚至不使用 CPU ID。

【讨论】:

【解决方案2】:

.NET 很糟糕,因为使用常用工具很容易将其还原为源代码。 (我们做了一个演示,我们在大约 2 分钟内破解了 .NET)。 Cyril 的解决方案听起来不错,因为他正在对目标机器使用加密和指纹散列。遗憾的是,这些解决方案容易受到某些中间人攻击,尽管他的解决方案听起来比大多数解决方案都好。机器绑定的一个问题是,您要使用的指纹令牌(如 MAC 地址、CPU 序列号等)必须通过操作系统调用来检索,这可能会被中级破解者欺骗。

根据您的软件的价值,使用 CodeMeter、Hasp HL 或 KeyLok 等优质加密狗将为您提供重要的保护。不过,使用“坏”的加密狗对您没有一点帮助。

【讨论】:

  • '糟糕'?大多数用户会称之为功能。
【解决方案3】:

为此,您需要将您的许可证代码嵌入到机器的 MAC ID、HDD ID、CPU ID 等生成的某种机器代码中。

然后用运行您的软件时生成的机器代码检查这个嵌入代码。如果这些不匹配,则意味着该软件正在另一台机器上使用。

如果您想要一个支持此方案的现成许可证方案,请参阅CryptoLicensing

【讨论】:

    【解决方案4】:

    是的,我在我的应用程序中这样做。效果很好。

    使用 WMI 可以轻松获取系统信息(CPUID、MacID、HDD 详细信息)(强烈推荐)。

    我创建了一个几乎万无一失的系统(除非您是专业黑客)。

    当我的应用程序首次安装在用户的 PC 上时,它们会使用 Web 服务返回到我的服务器。他们使用密码哈希来标识自己,并为客户寻找授权代码/订单 ID。

    如果客户端具有正确的授权代码,应用程序会加密系统详细信息并将其存储在客户端的计算机上,并将信息的哈希发送到存储它的服务器。然后使用一些散列标志在客户端计算机上激活该软件,并且每次运行应用程序时,系统信息都会与文件中的散列信息进行比较。

    如果客户重新格式化计算机,他只需要订单ID即可再次自动激活软件(当程序与我的服务器检查时,如果匹配,系统详细信息将得到验证和批准)。如果客户在另一台机器上安装软件,他必须联系我的支持团队以获得批准。

    -- 所有信息都经过加密和散列(双重加密)。 -- 所有代码都经过混淆和打包。

    目前它运行得相当安全。

    所以是的,这是可能的,它已经过现场测试,发现与任何其他保护系统一样有效。

    【讨论】:

    • 使用 WMI 的问题是它要求应用程序以管理员身份运行许多最稳定的组件(MAC 地址、HDD 序列等)。这是 Vista/Windows 上的可用性问题7 默认情况下应用程序不再具有管理员访问权限。
    • 问题永远存在。做软件然后产生更多收入的原因。开发时间、维护、客户对重新激活感到恼火等等。清单很长。
    【解决方案5】:

    假设机器有网卡你可以使用MAC address:

    Read MAC Address from network adapter in .NET

    【讨论】:

    • 您可以这样做,但这正是激怒用户的技术之一。他们应该能够更新他们的网络设备,而无需通知他们的软件供应商!
    • 我完全同意。我只是说:D
    • 在某些系统上,我看到 MAC 地址在重启时发生了变化。特别是一个旧的 IBM Thinkpad 系统。
    • @DuncanBayne:我曾经使用根据每台计算机的独特属性更改 MAC 地址的网络软件。更改该属性,并且,繁荣,所有许可到该 MAC 地址的软件都会失败。
    【解决方案6】:

    您可以对您的 EXE 进行数字签名并使用证书来帮助提供某种保护,但是如果您真的想阻止您的 EXE 在特定 PC 上运行,您最好提示用户输入密码并使用密钥文件?

    .NET 加密示例 http://aspnet.4guysfromrolla.com/articles/112002-1.aspx http://www.eggheadcafe.com/articles/20020630.asp

    【讨论】:

      【解决方案7】:

      开箱即用 - 没有。

      您可以尝试在安装期间生成机器签名,并在签名文件不存在或对该特定机器无效时锁定您的应用程序以使其无法启动。

      【讨论】:

        【解决方案8】:

        无法使用处理器 ID 并每次都检查它(?)

        Here is a sample code 是我前段时间写的。

        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
        

        【讨论】:

        • CPU ID 过去不是一个可靠的唯一 ID。有变化吗?
        • 这可能不是一个可靠的解决方案。但解决方案之一(?);-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多