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

时间:2015-06-01 13:08:36

标签: c# .net dll reverse-engineering unmanaged

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

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

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

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

  1. 我们的数据文件(本身不是问题,因为没有预测代码,文件真的没有意义)。
  2. 已编译的DLL。
  3. C#代码(可以很容易地反编译以查看DLL的使用方式)。
  4. 我知道我不能保护C#代码,我也知道完全保护代码是不可能的,因为二进制文件总是可读的(这个主题已经有很多问题/答案,所以我如果人们不重复这些答案,我们将不胜感激。)

    但是,我想知道是否可以通过只能从我的应用程序调用DLL来保护DLL?

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

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

    澄清问题的预期目的

    基于一些评论,我认为需要做出一些澄清。

    问题的关键在于找不到100%安全代码的方法 - 我们已经知道这是不可能的(这里有一个关于这个主题的好问题:Protect .NET code from reverse engineering?)。

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

    有些人会认为这是浪费时间,但通过这种思考,我们可以免费将所有源代码分发给每个人,因为它最终会被破解,对吧?

    否。这实际上取决于您的目标受众。

    如果你是微软试图用数以万计的用户防止盗版Windows,有人会找到破解它的方法 - 即使只是因为“破解Windows的人”的“威望”。无论如何,将一些反盗版措施付诸实施仍然是有意义的,只是为了防止普通用户盗用它。

    但是,如果您是一家小型企业,那么破解代码会使其变得更加复杂的行为可能意味着它实际上不会被破解。为什么?因为普通的Joe(以及他的开发者朋友)更不可能拥有破解代码的知识,并且可以破解它的人对它不感兴趣。

2 个答案:

答案 0 :(得分:1)

直接安全

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

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

生成和接受许可密钥的具体过程取决于您,但在纯脱机环境中,不存在100%安全系统(How are Software License Keys generated?)。

通过Obscurity实现额外安全性

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

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

答案 1 :(得分:0)

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