【问题标题】:How to license C++ software [closed]如何许可 C++ 软件 [关闭]
【发布时间】:2020-04-23 13:50:01
【问题描述】:

我想开始销售一些我用 C++ 开发的软件。第一道保护线将是 C++ 生成可执行文件这一事实。其中,我还将应用算法和手动混淆技术,使其即使被破解也很难理解。

关于许可,我的计划是创建一个 API,您可以向其发送请求。数据将包括您的许可证密钥和您的设备指纹。收到此数据后,API 将检查数据库中的许可证密钥,并确保设备指纹与存储的指纹匹配。如果是这样,它将回复某种必须匹配特定模式的加密响应。然后,客户端将检查该响应是否与预定模式匹配,如果匹配,则允许使用该软件。如果没有,用户将被锁定。并且如果 API 检查失败,该响应将为空,这样也会导致用户被锁定。

我知道这并非牢不可破,但我希望在不花费大量时间的情况下使其尽可能难以破解。我想添加一些加密响应的原因是用户不能只是欺骗来自我的服务器的响应。尽管我还将在此基础上使用 HTTPS。如果这是个好主意,您会推荐哪种加密检查方式?

指纹的想法是防止用户同时在多台计算机上使用该软件。我不太确定要使用什么,但我正在考虑对 MAC 地址、计算机名称和其他内容的组合进行哈希处理。有什么建议吗?

我还应该做些什么来保护我的软件?

谢谢。

【问题讨论】:

  • @drescherjm 谢谢,但我想自己开发它。关于我的问题有什么建议吗?
  • 我认为您所概述的是一个非常好的开始,并且需要大量的工作。一旦实施,一路上你可能会有更多的想法。跟踪这些想法,但不要让 1.0 保护脱轨,否则您将永远无法发布产品。
  • "然后客户端将检查该响应是否与预先确定的模式匹配" 1) 如果破解版的可执行文件被绕过(跳过)说(执行)检查的函数调用,只是让这样的函数返回true(例如)? 2)如果检查硬失败应用程序的启动,工作流程循环:尝试破解;检查是否启动;尝试破解如果启动失败 - 变得非常快。例如:如果它启动正确,但在计算中出现细微的错误,在多个地方 - 清除所有内容变得更加困难。
  • 我之前评论的 (1) 上的脚注,以便更容易可视化:假设您的代码中有这个:bool isLicenseValid (/* ... */) { /* Do some checks, to make sure client has the license, and return true, if it does. */ },那么补丁版本可能包含 @ 的变体987654323@。要破解一个程序,你不需要破解它的每一部分——只需要破解最薄弱的地方。
  • @JosephSible-ReinstateMonica 这是真的。我只是举了一个例子,说明破解尝试是否成功很容易检测,而破解尝试很难(呃)。注意:我关于这个主题的大部分(理论)知识来自于听过一些视频游戏(可以被认为是“软件”的子集)中的许可证检查是如何执行和破解的。因此,在检查失败的情况下产生微妙错误结果的风险并没有那么高。

标签: c++ cryptography license-key


【解决方案1】:

不要浪费你的时间。不可能阻止所有人,即使阻止 99.999% 的人破解它,也只需要一个人破解它并上传到所有盗版网站。而且你越努力,它就越会惹恼合法用户。

【讨论】:

  • 谢谢,但我正在寻找合法的解决方案。
  • 没有,你会找很久的。
【解决方案2】:

我正在专业地创建软件许可系统。我可以告诉你,要让软件保护系统安全到足以在人们破坏它之前阻止它,这并不容易。

是的,所有系统都是可破解的。有人找到绕过安全措施的方法只是时间问题。我们的工作是让他们尽可能少地提供线索。

我还将应用算法和手动混淆技术,使其即使被破解也很难理解。

目标不是理解应用程序,而是在没有有效许可证的情况下运行它。

关于许可,我的计划是创建一个 API,您可以向其发送请求。数据将包括您的许可证密钥和您的设备指纹。收到此数据后,API 将检查数据库中的许可证密钥,并确保设备指纹与存储的指纹匹配。

您所描述的称为许可证服务器。它持有许可证并确保系统用户不超过他们的数量。

并确保设备指纹与存储的指纹匹配

这些指纹被称为 hostid,它们有很多种类型:bios id、硬盘驱动器序列号、MAC 地址、donlge(带有许可证的 USB 棒)、运行应用程序的用户名等。其中大多数很容易伪造.但正如我所说。目标是尽可能减慢它们的速度。

我知道这不是牢不可破的。

你真是太聪明了。

但我希望在不投入大量时间的情况下使其尽可能难以破解

你要当我的小猫。

除非许可证服务器与您的软件位于同一网络中,否则它将无法在没有互联网连接的情况下运行。这对您来说可能不是问题,但对许多公司来说都是如此。

我并不是说这是一个坏主意。编写这样一个系统是一项很好的练习,我非常推荐给每个程序员,但这并不是一件容易的事。

【讨论】:

  • 感谢您的回复。需要连接不是问题,因为软件无论如何都需要连接。
  • 我的主要问题是来自服务器的加密响应。你知道我怎么能做到这一点吗?我正在考虑为每个用户生成一个公钥/私钥对。用户将私钥存储在他们的机器上,公钥在我的数据库中。通过响应,我发送一条使用公钥加密的消息,例如“hello”,然后客户端用他们的私钥解密它,如果它等于“hello”,它就会被接受。
  • 我不确定这种方法有两个原因。首先,如果用户丢失了他们的私钥怎么办?其次,我必须对消息进行硬编码,因此每次都发送它,这似乎并不安全。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多