二进制比较,以证明客户端正在使用我们的C ++ / CLI库

时间:2013-05-25 09:08:11

标签: c++ security c++-cli protection

我们正在构建一个C ++库,我们计划将其作为商业库+源代码提供一次性许可费。遗憾的是,该库的构建完全脱机,因此无法连接到我们的服务器以验证许可证。

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

2 个答案:

答案 0 :(得分: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公司的源代码来实现”。

现在,你能在法庭上站起来吗?这是由法官和陪审团决定的。我认为这样做并不容易。但这也不是不可能的。

是否有完全万无一失的方法来确保这一点?不,绝对不是。但这适用于几乎所有事情。如果你与某人说你应该这样做的合同,一定不要这样做,这是否意味着他们无法做到这一点?不,这是一份法律合同,如果他们违反合同,你会将他们告上法庭。同样适用于软件。然后你必须在法庭上证明他们做了他们不该做的事情(或者没有做他们应该做的事情),如果你的证据足够好,你就赢了。如果另一个人能够很好地为自己辩护,那么你就输了。通常情况下,这些案件最终成为“赢得最多金钱的人”,因为有办法说“我希望在下一级法庭上尝试这种方式”,然后你最终会花更多的钱再次证明同样的事情(但这次有更贵的律师。)

答案 1 :(得分:1)

有非常强大的工具可以使用开源项目的源代码指纹扫描您的代码以查找第三方。您所做的是配置该工具,以便您的代码也被分解为源代码指纹,然后扫描您认为侵犯您的人的代码。现在这可能只有你在法庭上才有可能,因为你怎么能访问他们的代码。使用这些工具并定制它们并不便宜。谷歌开源尽职调查,看看一些顶级供应商Black Duck,EscrowTech和Palamida。