如何防止他人在其C#应用程序中使用我的未受管制的DLL?

4
我正在开发一个C#应用程序,以帮助阅读和写作障碍的人们 - 其中之一是提供单词预测功能。
该单词预测功能是使用C编写的,并在Linux服务器上作为Web服务运行,需要登录才能使用。没有问题。
然而,最近,我们的几位客户表示对离线版本感兴趣,这是我们想要提供的。为此,我编写了一个包装器(使用C语言),将其编译为DLL,并与我们的预测数据文件一起在C#应用程序中使用。
问题是,现在每个人都可以访问:
1. 我们的数据文件(本身不是问题,因为没有预测代码,文件没有意义)。 2. 编译的DLL。 3. C#代码(可以轻松反编译以查看如何使用DLL)。
我知道我无法保护C#代码,也知道完全保护代码是不可能的,因为二进制文件始终可读(有关此主题的问题/答案已经有很多,所以如果人们不要重复这些答案,我会非常感激)。

然而,我想知道是否有可能以某种方式保护DLL,使其只能从我的应用程序中调用?

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

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

澄清问题的预期目的

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

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

重点是获取有关如何复杂化破解代码的建议(或者,正如我现在所学到的那样:通过模糊性实现安全性)。

有人会认为这是浪费时间,但如果按照这种想法,我们可能会把所有源代码免费分发给每个人,因为它最终肯定会被破解,对吧?对吗? 不对。 这真的取决于你的目标受众。
如果你是微软,试图防止成千上万的用户盗版Windows,那么总会有人找到破解方法 - 即使只是为了成为“破解Windows的人”。无论如何,把一些反盗版措施放置在合适位置仍然是有意义的,以防止普通用户盗版。
然而,如果你是一家小企业,让代码更难破解可能意味着它实际上不会被破解。为什么?因为普通人(及其开发者朋友)很少有能力破解你的代码,而那些能够破解它的人将对此毫无兴趣。

1
所以你问是否可能,然后稍后又说你知道这是不可能的,你所能做的就是让破解变得更加耗时。显然,你已经回答了自己的问题。确实是不可能的。至于对于你来说多少保护足够,这是一个基于你认为你的代码对于潜在的破解者有多少价值以及你愿意投入多少来保护它的决定。 - Servy
1
个人而言,我会避免这样做,因为它更可能会妨碍客户使用软件,而不是防止复制。相反,我会定期获取竞争对手的软件副本以检查是否存在抄袭行为。对于在线消费,添加一个无意义的预测,可以请求该预测,以查看是否使用了同一库。 - Jeff Siver
实际上,你所要求的是如何通过混淆来进行安全保护的建议 - 根据SO的通常标准,答案往往会基于大多数人的观点。 - Gary Walker
也许你应该重新思考整个商业模式,提供可计费的服务而不是可计费的软件产品。如果你的服务托管在一个防黑客攻击的服务器上(哈!),那么你就不需要担心混淆等问题了。 - RenniePet
你关于检查调用EXE的计划注定会失败,因为没有可靠的方法来确定你的调用者是谁。可以参考不要相信返回地址,真的这篇文章中提供的一组例子。 - Damien_The_Unbeliever
2个回答

2

针对直接安全性

最简单的方法是让你的非托管C DLL具有内置的许可机制,从而使其对可能将库导入到自己的托管或非托管代码中的第三方开发人员无用。

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

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

通过混淆提高额外的安全性

以下剩余选项只是额外的技巧,可以使竞争对手更难进行反向工程,但并不能提供真正的安全性:

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

OP在问题中明确表示,他知道实际上无法保护DLL。他的问题是如何尽可能地保护它,而你没有帮助他做到这一点。“去构建一个系统来做这件事”不是一个答案。你并没有解释如何实际构建这样的系统。 - Servy
@Servy,一个答案并不需要描述每一个细节才能有用。尼古拉斯可能没有提供关于他建议的大量细节,但是他确实提供了可用的建议,我可以进一步研究。 - Woodgnome
@Servy - 我认为Nicholas想说的是 - 检查系统中是否存在其他与这些文件不同的东西。比如注册表键。我的建议是 - 让额外的秘密依赖于机器。这样,为了在另一台机器上使用DLL,他们需要联系您以获取新的密钥。 - Vilx-
@Woodgnome他没有提供任何细节。在这个答案中,关于如何保护dll不被执行的信息没有一点不在问题中。如果“构建安全系统”实际上回答了你的问题,并且你不需要被告知其他任何事情,那么你一开始就不应该问这个问题。 - Servy
1
@Servy,我同意您的对注册表中许可证密钥方法的评估不足之处,但这并不意味着许可证密钥方法完全无用。无论如何 - 如果您在第一条评论中就已经陈述了这个观点(而不是批评Nicholas而没有真正解释原因),那么您的评论实际上将会更加有用 - Woodgnome
显示剩余9条评论

0

既然你关注的是普通用户盗版你的产品,我建议你研究一下像 flexlm 这样的许可证管理器。只要确保 dll 自身连接到许可证服务器,以确保产品已获得许可证,而不是 exe。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接