如何保护C++动态库不被擅自使用?

How to protect a C++ dynamic library from being used without permission?

我们正在构建 Unity3D 插件。任何使用我们的插件的游戏,在为某些平台构建时,也会以该平台的动态库形式包含我们的插件。例如Unity导出Androidapk时,会包含我们的库xyz.so。该库是用 C++ 编写的。

如何保护我们的动态库不被盗用?似乎任何人都可以 "unzip" 一个 apk Android 包,获取我们的库,获取导出,从我们的免费试用中获取文档,并最终在没有许可客户的情况下使用该库。是否有在此用例中推荐的保护模型?

好吧,尽管它比使用托管代码要难得多,但 C++ 代码可以被反汇编并因此被破坏。然而,这是一项艰巨的工作,只有在拥有大量消费者的情况下才值得。拥有这种技能的人宁愿破解最近流行的 AAA 游戏,也不愿将时间浪费在第三方 Unity 库上。

话虽这么说:是的,您应该能够保护您的图书馆。 只要在您的 C++ 库中有一个许可证密钥验证器。该库在收到能够成功验证的许可证密钥之前拒绝工作。

许可证可能是

License =
{
    key=[ Owner-Identification, App-Identifier ],
    verification=(Signed hash of key)
}

您可以使用 key 来识别密钥的所有者,图书馆也可以使用它来确保许可证仅适用于具有特定 App-Identifier 的应用程序。 verificationkey 的散列,用只有你知道的私钥签名。匹配的 public 密钥为图书馆所知,可用于验证许可证是否由您创建,并且只有您创建。

如果您的库中有此代码并使用 C++ 混淆工具对您的代码进行混淆,您应该非常安全。如果不混淆,其实应该还是很安全的。

编辑:您甚至可以使用此模型进行试验。只需在 key 中添加一个 License-Expire-Time,当该时间过去时,您的图书馆可以停止工作。

一种可能的实现可能是:

一个包含明文 key 的文件(以便您的代码,如果需要的话,甚至人类也可以阅读和理解它),还包含签名的散列(key 的散列) ,用您的私钥加密)。

代码将读取 key 并使用相同的哈希算法计算其哈希值。它还会使用 public 密钥解密签名的哈希。如果两个哈希值相同,代码可以确定 key 有效并可以继续检查其内容:key 是否未过期(Expire-Time),key 表示此特定应用程序 (App-Id),等等