3

我们正在构建一个 C++ 库,我们计划将其作为商业库 + 源代码提供,并收取一次性许可费。不幸的是,该库是为完全离线运行而构建的,因此无法连接到我们的服务器来验证许可证。

考虑到我们了解客户并且能够访问他们可能包含我们库的应用程序二进制文件,我们可以使用哪些工具/流程来证明客户 X 正在应用程序 X 中使用我们的库?可以使用什么技术来检查二进制段以匹配已构建的 EXE/DLL 中的二进制段?我正在寻找一些强大的东西,因为我们正在提供可以进一步重构/重命名/混淆的源代码。显然他们不能改变一切,所以一些类和函数应该匹配,允许我们在他们的 EXE/DLL 中找到它。

4

2 回答 2

3

如果您提供的代码已经从原始源充分派生,那么您可能无法做到这一点。另一方面,如果有人接受这个:

int longname = 42;
int othername = 3;
double largenumber = 0.5;
for(int i = 0; i < x; i++)
{
    largeNumber *= longname + othername;
}

并将其重写为:

int l = 42;
int o = 3;
double n = 0.5;
for(int i = 0; i < x; i++)
{
    n = n * l + o;
}

它将生成完全相同的二进制代码(显然,仅当您使用具有相同设置的相同编译器的相同版本时)

所以,如果你的软件包中有一些相当复杂和独特的代码,我敢肯定,如果不付出相当大的努力,就很难伪装 - 完全重写代码可能会更容易,只需使用你的一般想法(当然,他们本来可以做到的)。

是否有工具可以简单地告诉您“此二进制文件包含这段代码,由 gcc 4.7.3 生成”?如果您使用一组常量进行一些真正特定类型的计算,则可能会构建一个。

如果里面有足够的钱,你当然可以让专家逆向工程师调查它,并在法庭上出具一份法律证人陈述(可能是文件形式,然后由其他专家审查等),说“这是我相信这个代码只能通过使用 X 公司的源代码来实现”。

现在,你能在法庭上证明这一点吗?这是由法官和陪审团决定的。我认为做到这一点并不容易。但这也不是不可能的。

有没有完全万无一失的方法来保证这一点?不,绝对不是。但这几乎适用于所有事情。如果您与某人签订了一份合同,说您应该这样做,不能那样做,这是否意味着他们在身体上无法做到这一点?不,这是一份法律合同,如果他们违反了,你就将他们告上法庭。同样适用于软件。然后你必须在法庭上证明他们做了他们不应该做的事情(或者没有做他们应该做的事情),如果你的证据足够好,你就赢了。如果对方能很好地保护自己,你就输了。通常,这些案件最终会成为“赢钱最多的案件”,因为有办法说“我希望在下一级法院审理此案”,

于 2013-05-25T09:34:47.217 回答
1

有非常强大的工具可以扫描您的代码,以使用来自开源项目的源代码指纹来查找第 3 方。您所做的是配置该工具,以便您的代码也被分解为源代码指纹,然后扫描您认为侵犯您的人的代码。现在这可能只有在您出庭时才有可能,因为您将如何访问他们的代码。同样使用这些工具并对其进行定制并不便宜。谷歌开源尽职调查并查看一些顶级提供商 Black Duck、EscrowTech 和 Palamida。

于 2013-06-14T16:51:51.800 回答