【问题标题】:How can I prevent others from using my unmanaged DLL in their C# application?如何防止其他人在他们的 C# 应用程序中使用我的非托管 DLL?
【发布时间】:2015-08-14 23:10:17
【问题描述】:

我正在开发一个 C# 应用程序来帮助有阅读和写作障碍的人 - 这个应用程序还提供单词预测功能。

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

不过,最近,我们的一些客户表示对离线版本感兴趣,这是我们愿意提供的。作为一种方法,我围绕单词预测代码编写了一个包装器(用 C 语言),并将其编译为一个 DLL,我可以在我的 C# 应用程序中使用它以及我们的预测数据文件。

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

  1. 我们的数据文件(本身没有问题,因为没有预测代码,这些文件就没有真正意义)。
  2. 已编译的 DLL。
  3. C# 代码(可以轻松反编译以查看 DLL 的使用方式)。

我知道我无法保护 C# 代码,而且我也知道不可能完全保护代码,因为二进制文件始终是可读的(关于这个主题已经有很多问题/答案,所以我如果人们不重复这些答案,将不胜感激。

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

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

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

澄清问题的预期目的

基于一些 cmets,我认为需要进行一些澄清。

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

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

有些人会争辩说这是浪费时间,但如果这样想,我们不妨把我们所有的源代码免费分发给所有人,因为它最终还是会被破解,对吧? 对吗?

不。这真的取决于你的目标受众。

如果您是 Microsoft 试图阻止拥有数十万用户的 Windows 盗版,那么有人会找到破解它的方法 - 即使只是为了“破解 Windows 的人”的“声望”。无论如何,采取一些反盗版措施仍然是有意义的,只是为了防止普通用户盗版。

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

【问题讨论】:

  • 所以你问它是否可能,然后你又说你知道这是不可能的,你能做的就是让它更耗时。显然你已经回答了你自己的问题。这确实是不可能的。至于多少保护对您来说就足够了,您需要根据您认为您的代码对潜在破解者的价值以及您愿意为保护它投入多少资金来做出决定。
  • 就我个人而言,我会避免这样做,因为它更有可能妨碍您的客户使用该软件,而不是防止复制。相反,我会定期获取竞争对手软件的副本,以检查他们是否复制。对于在线消费,添加一个无意义的预测,可以请求查看是否正在使用同一个库。
  • 真的,您要的是建议:如何通过默默无闻来确保安全——答案往往主要基于 SO 的通常标准的意见。
  • 也许你应该重新考虑你的整个商业模式。提供计费服务而不是计费软件产品。如果您的服务托管在防黑客服务器上(哈哈!),那么您无需担心混淆等问题。
  • 你的计划是:检查调用的 EXE 注定要失败,因为没有可靠的方法来确定你的调用者是谁。请参阅Don't trust the return address, no really,作为一组示例。

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


【解决方案1】:

为了直接安全

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

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

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

通过默默无闻获得额外的安全性

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

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

【讨论】:

  • OP 在问题中说得对,他知道实际上不可能保护 DLL。他的问题是如何尽可能地保护它,而你没有帮助他做到这一点。 “去建立一个系统来做到这一点。”不是答案。您没有解释如何实际构建这样一个系统。
  • 显然其他人确实认为“我如何构建一个系统来保护我的程序?”的答案。是“建立一个系统来保护你的程序”。所以你们只是想把 OP 逗笑,还是你真的认为这不是一个完全荒谬的答案?
  • @Servy,答案并不一定要描述每一分钟的细节才有用。尼古拉斯可能没有提供关于他的建议的大量细节,但他确实提供了有用的建议,我可以进一步研究。
  • @Servy - 我认为 nicholas 想说的是 - 检查系统中是否存在其他文件,这些文件不包含这些文件。就像一个注册表项。我自己的补充是 - 让这个额外的秘密依赖于机器。这样,为了在另一台机器上使用 DLL,他们需要与您联系以获取新密钥。
  • @Servy 我同意您对注册表方法中的许可证密钥不足的评估,但这并不意味着许可证密钥方法完全没用。无论如何 - 如果您在第一条评论中说明了这一点(而不是批评尼古拉斯而没有真正解释原因),您的评论实际上会有用
【解决方案2】:

由于您只关心普通用户盗版您的产品,我建议您研究一下 flexlm 之类的许可证管理器。只需确保 dll 本身连接到许可服务器,以确保产品获得许可,而不是 exe。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 2011-10-04
    • 2014-05-11
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多