C++ 检查许可证的最佳方法

C++ 检查许可证的最佳方法,c++,windows,licensing,C++,Windows,Licensing,我们有一个自定义的许可证检查方法,非常简单,我们只需检查注册表项(一个字符串,由另一个进程根据不同的参数设置)并授予许可证或拒绝 我开始知道,任何人只要知道我们要找的是哪一个regkey,就可以轻松破解它。或者通过在汇编代码中搜索cmp指令。 我只是想知道这个许可证检查问题的更好的解决方案。我可能不需要非常复杂的程序或任何类似的程序。但如果它应该比现在的好一点的话 我在Windows7中使用C++\VC++ 谢谢&Rgds,calvin您可以从特定于硬件的值计算哈希值,并在注册表中检查该值。这样

我们有一个自定义的许可证检查方法,非常简单,我们只需检查注册表项(一个字符串,由另一个进程根据不同的参数设置)并授予许可证或拒绝

我开始知道,任何人只要知道我们要找的是哪一个regkey,就可以轻松破解它。或者通过在汇编代码中搜索cmp指令。 我只是想知道这个许可证检查问题的更好的解决方案。我可能不需要非常复杂的程序或任何类似的程序。但如果它应该比现在的好一点的话

我在Windows7中使用C++\VC++


谢谢&Rgds,calvin

您可以从特定于硬件的值计算哈希值,并在注册表中检查该值。这样就不足以找到您要查找的值,还不足以找到算法

数学上合理的方法是将计算机特定值(例如MAC地址)转换为素数,将其与您自己的幻数相乘并存储乘积


编辑:不过,请注意,除了非常简单的保护方案外,任何保护方案通常都不值得麻烦。即使是大公司也在努力解决这个问题。

您需要以某种方式保护您的代码不受逆向工程的影响;有许多所谓的可执行文件保护器,我在这里不给它命名。无论您计算什么,只要两条NOP指令就会将保护检查的流程推向不希望的方向

当然,保护哪种代码真的很重要;对于解释语言来说,保护自己几乎是不可能的


啊,对不起,我可以举出一个非商业的:臭名昭著的尤达PE保护者。

完全防止破解的唯一方法是使用用户远程访问的基于现收现付的托管应用程序。 这样一来,没有有效付费帐户的人就不能使用该应用程序,任何将其帐户凭据交给他人的人都将为其使用以及自己的使用付费

没有任何代码(可能除了允许登录的存根)被发送到客户端,更不用说存储在那里了,因此客户端在没有连接到服务器的情况下无法运行(这希望不会受到影响,但这是一个sysop问题,而不是编码问题)


您可能采用的任何其他系统基本上都必须依靠您的许可证背后的法律影响力来阻止人们破解它。

任何本地运行的逻辑都可能被规避。关于许可证的实际存储,取决于您的应用程序,我将编写一个web服务并运行您自己的服务器。让应用程序在每次启动时检查您的服务,确保许可证仍然有效


这也为您提供了更大的灵活性,例如,如果支付不清,您可以吊销许可证。

您可以使用公钥/私钥加密来完成此操作。使用本地签名文件,而不是包含许可证信息的注册表,并且偶尔使用web服务器检查许可证是否有效。这应该给你足够的保护


这可以通过以下方式完成。网站上有示例代码,虽然只有c#。

…但是要小心人们更换网卡,例如如果机器的主板在保修期内更换,就会发生这种情况。@Joel:我同意。这些方案造成的问题比解决的问题要多。谢谢,你的建议对我的部分问题提供了见解。我的问题更多的是关于更好的方法和良好的实践。听起来很奇怪也很有趣。有人用这种方法吗?如果我使用高级语言,如C++或C语言,我如何实现这个(使用NOPS)?顺便说一下,我喜欢这种方法,并给出了一个赞成票。C是解释的,原生U-托管C++是编译的意思,C++编译项目总是有更好的机会得到保护。然而,我看到一些商业可执行保护程序实际上编译了C#代码的一部分(而不是像Obfuscator.NET那样对其进行模糊处理)。当然,人们正在使用这些保护措施;例如,现在所有的SecuROM游戏都受到专有代码保护。谢谢你的投票!:)这里有一个这样的保护者