如何保护dll?

时间:2009-04-30 05:32:41

标签: c# dll

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

由于

7 个答案:

答案 0 :(得分:20)

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

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

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

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

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

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

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

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

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:5)

看看StrongNameIdentityPermissionAttribute。它允许您声明对程序集的访问权限。结合良好的代码保护工具(如CodeVeil(免责声明我出售CodeVeil)),您会非常开心。

答案 3 :(得分:3)

您可以将其嵌入到您的可执行文件中,并在运行时解压缩和加载库并调用它。或者您可以使用某种共享密钥来加密/解密附带的文件,并执行相同的操作。

我假设您已经考虑过如果您真的不希望它共享的解决方案。如果有人真的想要这样做,有很多方法可以做到。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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