如何保护动态链接库(DLL)?

16

我该如何保护我的项目中的DLL,以使它们无法被他人引用和使用?

谢谢。

7个回答

24

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

你可能要考虑的显而易见的事情(按难度递增和可信度递减的顺序)包括:

  • 使用静态链接,因此没有DLL可供攻击。
  • 剥离所有符号。
  • 使用 .DEF 文件和导入库仅具有匿名导出项,仅由其导出ID进行识别。
  • 将 DLL 保留在资源中,并在运行时仅在文件系统中公开它(使用适当模糊的名称,甚至在运行时生成),并仅在运行时暴露。
  • 在工厂方法后隐藏所有真实函数,该方法交换秘密(更好的是,证明知道秘密)以获取指向真实方法的函数指针表。
  • 借鉴恶意软件世界中的反调试技术以防止逆向工程。 (请注意,这可能会使您从 AV 工具获得误报。)

不管怎样,一个足够决心的用户仍然可以找到使用它的方法。一个好的反汇编器很快就能提供所需的所有信息。

请注意,如果您的 DLL 真的是 COM 对象,或更糟糕的是 CLR Assembly,则存在大量运行时类型信息,您无法剥离它而不破坏其预期用途。

编辑:由于您已经更改标签以暗示 C# 和 .NET 是环境,而不是用 C 编写的纯 Win32 DLL,则我真的应该修改上述内容为“你无法,但是...”

长期以来,市场一直存在用于处理必须交付可编译源代码但不想提供有用源代码的环境的混淆工具。 有一些在这个市场中发挥作用的 C# 产品,看起来至少有一个参与其中。

由于从框架加载程序集需要很多工作,因此可能存在权限位,可以对程序集的提供者和使用者进行一些控制。 我没有看到任何关于这些方法提供的真正安全性的讨论,并且不知道它们对决心攻击的有效性。

很大程度上取决于您的使用情况。如果您只想防止随意使用,那么您可能可以找到适合您的解决方案。但是,如果您想保护有价值的商业机密免受逆向工程和重复使用,那么您可能不会感到满意。


你能为每个步骤提供示例/描述吗?这将很好(例如,“1)静态链接”,“2)剥离符号”等等...)? - T.Todua

12

你面临着数字版权管理(DRM)的支持者们同样面临的问题。

如果您希望能够运行动态链接库(DLL)的程序已经可以被一些用户账户运行,那么没有什么能够阻止一个具有足够决心、能够登录该用户账户的程序员从隔离执行解密操作的代码并使用它来解密您的 DLL 并运行它。

当然,您可以让这种反向工程变得不方便,这可能已经足够了。


5

3
您可以将其嵌入到可执行文件中,并在运行时提取和加载库并调用它。或者您可以使用某种共享密钥来加密/解密附带的文件,并执行上述相同操作。
我假设您已经考虑过编译它,如果您真的不想共享它的话。但是,如果有人真的想要获取它,有很多方法可以做到这一点。

在.NET中,.exe文件也是程序集,并且可以被引用。 - Brian Rasmussen
这个问题的解决方案是什么? - Josh
不幸的是,这是一个非常容易被规避的解决方案。一旦您加载了程序集,就很容易从内存中转储汇编代码,从而允许任何人使用“加密”的程序集。 - Paul Alexander

2

您尝试过.Net Reactor吗?我最近接触到它。有些人说它很棒,但我仍在测试中。


1

你可以将所有“public”类标记为“internal”或“protected internal”,然后使用 [assembly:InternalsVisibleTo("")] 属性标记你的程序集,这样只有被标记的程序集才能看到其中的内容。


反射允许使用甚至是私有类型/成员。 - Michael Damatov
你的意思是,即使应用了InternalsVisibleTo属性,Reflector.Net仍然可以暴露代码吗? - Jon
是的。某人还可以使用反汇编器查看其InternalsVisibleTo属性的内容并创建具有相同名称的程序集以获取访问权限。 - Vinicius Gonçalves

0

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