繁体   English   中英

如何防止他人在C#应用程序中使用我的非托管DLL?

[英]How can I prevent others from using my unmanaged DLL in their C# application?

我正在开发一个C#应用程序来帮助阅读和写作残疾人 - 除此之外,这个应用程序提供了单词预测。

单词预测是用C语言编写的,在Linux服务器上作为Web服务运行,需要使用登录。 没问题。

然而,最近,我们的一些客户表达了对离线版本的兴趣,这是我们想要提供的。 作为一种手段,我在单词预测代码周围编写了一个包装器(在C中)并将其编译为一个DLL,我可以在我的C#应用​​程序中使用它和我们的预测数据文件。

问题是,现在每个人都可以访问:

  1. 我们的数据文件(本身不是问题,因为没有预测代码,文件真的没有意义)。
  2. 编译的DLL。
  3. C#代码(可以很容易地反编译以查看DLL的使用方式)。

我知道我不能保护C#代码,我也知道完全保护代码是不可能的,因为二进制文件总是可读的(这个主题已经有很多问题/答案,所以我会感谢如果人们不重复这些答案)。

但是,我想知道是否有可能以只能从我的应用程序调用DLL的方式保护DLL?

我正在考虑将调用EXE文件的校验和与编译到DLL中的校验和进行比较。 是否有其他(更优雅)的解决方案?

关键是不要创建一个100%安全的DLL来防止被非预期的应用程序使用(因为它是不可能的) - 但足够安全,其他开发人员不能轻易复制数据/ DLL文件并在他们的应用程序中使用它们(我们已经竞争对手已经在其他平台上窃取我们的代码存在问题。

澄清问题的预期目的

根据一些评论,我认为需要做出一些澄清。

问题的关键在于找不到100%安全代码的方法 - 我们已经知道这是不可能的(这里有一个关于这个主题的好问题: 保护.NET代码免受逆向工程? )。

关键是要获得关于破解代码复杂化的方法的建议(或者,正如我所知,现在:通过默默无闻的安全性)。

有些人会认为这是浪费时间,但通过这种思考我们不妨免费向所有人发布所有源代码,因为它最终会被破解,对吧? 对?

不,这取决于您的目标受众。

如果你是微软试图用它的成千上万的用户来防止盗版,那么有人会找到破解它的方法 - 即使只是因为“破解Windows的人”的“威望”。 无论如何,制定一些反盗版措施仍然有意义,只是为了防止普通用户盗版。

但是,如果您是一家小型企业,那么破解代码会使其变得更加复杂的行为可能意味着它实际上不会被破解。 为什么? 因为它更加不可能平均乔(和他的朋友们开发)有知识,破解你的密码,谁可以破解它会没有兴趣的人。

对于直接安全

最简单的方法是使您的非托管C DLL具有内置的许可机制,从根本上使它对第三方开发人员无用,否则他们可能会将库导入到他们自己的托管或非托管代码中。

有许多技术可以做到这一点,例如从Windows注册表中读取许可证密钥,或者向DLL添加特殊的ActivateLicense(string key)函数,该函数在使用库的其他功能之前从C#托管应用程序调用。

生成和接受许可密钥的具体过程取决于您,但在纯脱机环境中,没有100%安全系统( 如何生成软件许可证密钥? )。

通过Obscurity实现额外安全

这些剩余的选项只是额外的提示和技巧,使竞争对手更难以进行逆向工程,但不提供真正的安全性:

  • 将非托管DLL作为资源嵌入托管应用程序中,并在运行时从临时文件加载它
  • 在嵌入之前加密非托管DLL,在运行时解密,并在卸载应用程序时将其删除
  • 为您的C#代码使用第三方混淆工具

由于您只关心普通用户盗用您的产品,我建议您查看像flexlm这样的许可证管理器。 只需确保dll本身连接​​到许可证服务器,以确保产品已获得许可,而不是exe。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM