【发布时间】: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