C# 如何保护DLL?

C# 如何保护DLL?,c#,dll,C#,Dll,我如何保护我的项目的DLL,使它们不能被其他人引用和使用 谢谢您可以将其嵌入到可执行文件中,并在运行时提取和加载库并调用它。或者,您可以使用某种共享密钥对附带的文件进行加密/解密,并执行上述操作 我假设您已经考虑过解决方案,比如在不希望共享的情况下编译它。但是,如果有人真的想达到目的,有很多方法可以做到。看看下面的例子。它将允许您声明对程序集的访问权限。再加上一个好的代码保护工具(比如(我卖CodeVeil的免责声明)),你会非常高兴的 简单的回答是,除了显而易见的事情之外,你也无能为力 显然,

我如何保护我的项目的DLL,使它们不能被其他人引用和使用


谢谢

您可以将其嵌入到可执行文件中,并在运行时提取和加载库并调用它。或者,您可以使用某种共享密钥对附带的文件进行加密/解密,并执行上述操作


我假设您已经考虑过解决方案,比如在不希望共享的情况下编译它。但是,如果有人真的想达到目的,有很多方法可以做到。

看看下面的例子。它将允许您声明对程序集的访问权限。再加上一个好的代码保护工具(比如(我卖CodeVeil的免责声明)),你会非常高兴的

简单的回答是,除了显而易见的事情之外,你也无能为力

显然,你可能要考虑的事情(大致上是增加难度和降低合理性)包括:

  • 静态链接,因此没有可攻击的DLL
  • 去掉所有符号
  • 使用.DEF文件和导入库只能通过其导出ID知道匿名导出
  • 将DLL保存在资源中,并仅在运行时将其暴露在文件系统中(使用一个适当的模糊名称,甚至可能在运行时生成)
  • 将所有实函数隐藏在一个工厂方法后面,该工厂方法将一个秘密(更好的是,秘密的知识证明)交换为指向实方法的函数指针表
  • 使用从恶意软件世界借来的反调试技术来防止反向工程。(请注意,这可能会导致AV工具出现误报。)
无论如何,一个有足够决心的用户仍然可以找到使用它的方法。一个像样的反汇编程序将迅速提供所需的所有信息

请注意,如果您的DLL实际上是一个COM对象,或者更糟糕的是,它是一个CLR程序集,那么在不破坏其预期用途的情况下,您将无法删除大量的运行时类型信息

编辑:既然您重新标记暗示C#和.NET是环境,而不是用C编写的纯Win32 DLL,那么我真的应该将上述内容修改为“您不能,但是…”

很长一段时间以来,模糊处理工具在处理强制提供可编译源代码,但不希望提供有用源代码的环境方面一直存在市场。有一些C#产品在该市场上发挥作用,而且看起来至少有一种产品参与了进来

因为加载一个程序集需要框架付出如此多的努力,所以可能有一些权限位对程序集的诚实提供者和使用者施加一些控制。我没有看到任何关于这些方法所提供的真正安全性的讨论,也不知道它们在对付确定的攻击时有多有效


很大程度上取决于您的用例。如果你只是想避免随意使用,你可能会找到一个适合你的解决方案。如果你想保护有价值的商业秘密不被逆向工程和重用,你可能不会这么高兴。

你面临着与DRM支持者相同的问题

如果您的程序(您希望能够运行DLL)可由某个用户帐户运行,则没有任何东西可以阻止一个有足够决心的程序员以该用户身份登录,以隔离执行解密的代码并使用该代码解密您的DLL并运行它。


当然,您可以不方便地执行此反向工程,这可能就足够了。

您可能会对有关友元程序集的以下信息感兴趣:

您可以将所有“公共”类标记为“内部”或“受保护的内部”,然后使用[assembly:InternalsVisibleTo(“”)属性标记程序集,除标记的程序集外,没有人可以看到内容。

您尝试过.Net reactor吗?我最近遇到了它。有些人说它很棒,但我仍在测试。

在.NET中,exe文件也是程序集,可以引用。解决方案是什么?不幸的是,这是一个非常容易绕过的解决方案。一旦加载程序集,就可以很容易地从内存中转储该程序集,从而允许任何人使用“加密”程序集。反射甚至允许使用私有类型/成员。您的意思是,即使应用InternalsVisibleTo属性,Reflector.Net仍然可以公开代码?是的。有些人还可以使用反汇编程序查看其InternalsVisibleTo属性的内容,创建具有相同名称的程序集并获得访问权限。您能否提供每个步骤的示例/说明?这会很好(即如何“1)静态链接”、“2)条形符号”等)??