我该如何保护我的项目中的DLL,以使它们无法被他人引用和使用?
谢谢。
简短的回答是除了显而易见的事情,你几乎无能为力。
你可能要考虑的显而易见的事情(按难度递增和可信度递减的顺序)包括:
不管怎样,一个足够决心的用户仍然可以找到使用它的方法。一个好的反汇编器很快就能提供所需的所有信息。
请注意,如果您的 DLL 真的是 COM 对象,或更糟糕的是 CLR Assembly,则存在大量运行时类型信息,您无法剥离它而不破坏其预期用途。
编辑:由于您已经更改标签以暗示 C# 和 .NET 是环境,而不是用 C 编写的纯 Win32 DLL,则我真的应该修改上述内容为“你无法,但是...”
长期以来,市场一直存在用于处理必须交付可编译源代码但不想提供有用源代码的环境的混淆工具。 有一些在这个市场中发挥作用的 C# 产品,看起来至少有一个参与其中。
由于从框架加载程序集需要很多工作,因此可能存在权限位,可以对程序集的提供者和使用者进行一些控制。 我没有看到任何关于这些方法提供的真正安全性的讨论,并且不知道它们对决心攻击的有效性。
很大程度上取决于您的使用情况。如果您只想防止随意使用,那么您可能可以找到适合您的解决方案。但是,如果您想保护有价值的商业机密免受逆向工程和重复使用,那么您可能不会感到满意。
你面临着数字版权管理(DRM)的支持者们同样面临的问题。
如果您希望能够运行动态链接库(DLL)的程序已经可以被一些用户账户运行,那么没有什么能够阻止一个具有足够决心、能够登录该用户账户的程序员从隔离执行解密操作的代码并使用它来解密您的 DLL 并运行它。
当然,您可以让这种反向工程变得不方便,这可能已经足够了。
请看StrongNameIdentityPermissionAttribute。它可以让您声明对程序集的访问权限。再配合一个好的代码保护工具(比如CodeVeil,免责声明:我销售CodeVeil),您会非常满意。
您尝试过.Net Reactor吗?我最近接触到它。有些人说它很棒,但我仍在测试中。
你可以将所有“public”类标记为“internal”或“protected internal”,然后使用 [assembly:InternalsVisibleTo("")] 属性标记你的程序集,这样只有被标记的程序集才能看到其中的内容。