如何保护dll?

如何保护项目的dll,使其无法被其他人引用和使用?

谢谢

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

您可能想要考虑的显而易见的事情(大致按照增加难度和降低合理性的顺序)包括:

  • 静态链接所以没有DLL可以攻击。
  • 剥去所有符号。
  • 使用.DEF文件和导入库只能使用导出ID才能知道匿名导出。
  • 将DLL保留在资源中,并在运行时将其暴露在文件系统中(在一个适当的模糊名称下,甚至可能在运行时生成)。
  • 隐藏工厂方法背后的所有实际函数,该方法为真实方法的函数指针表交换秘密(更好的,秘密知识certificate)。
  • 使用从恶意软件世界借来的反调试技术来防止逆向工程。 (请注意,这可能会让你从AV工具中得到误报。)

无论如何,充分确定的用户仍然可以找到使用它的方法。 一个体面的反汇编程序将迅速提供所需的所有信息。

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

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

很长一段时间以来,混淆工具一直存在一个市场,需要处理必须提供可编译源的环境,但是你不想提供有用的资源。 有一些C#产品在该市场上发挥作用,看起来至少有一个产品已经插入。

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

很多将取决于您的用例。 如果您只想防止随便使用,您可能会找到适合您的解决方案。 如果您想保护有价值的商业秘密免受逆向工程和重用,您可能不会那么开心。

您面临的问题与DRM的支持者相同。

如果您的程序(您希望能够运行DLL)可由某个用户帐户运行,那么没有任何东西可以阻止一个充分确定的程序员,该程序员可以作为该用户登录,从而隔离执行解密和使用的代码解密你的DLL并运行它。

您当然可以使执行此逆向工程变得不方便,这可能就足够了。

看一下StrongNameIdentityPermissionAttribute 。 它允许您声明对程序集的访问权限。 结合良好的代码保护工具(如CodeVeil (免责声明,我出售CodeVeil)),你会很高兴。

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

我假设你已经考虑过编译它的解决方案,如果你真的不想让它共享的话。 如果有人真的想要达到它,有很多方法可以做到这一点。

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

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

您可能对以下有关朋友聚会的信息感兴趣: http : //msdn.microsoft.com/en-us/library/0tke9fxk(VS.80).aspx