【问题标题】:Is it possible to 'strip' a .NET DLL?是否可以“剥离”.NET DLL?
【发布时间】:2011-10-08 15:43:51
【问题描述】:

我使用模块化方法在 C# 中构建了一个简单的演示应用程序,因此它由一个可执行文件和几个 DLL 组成。假设我将它放在一个 zip 文件中并将其交给某人,唯一的目的是让他们只需提取文件并双击 exe 即可试用演示应用程序。

现在,据我了解,获取应用程序和 DLL 的每个人都可以在 Visual Studio 项目中添加对 DLL 的引用,然后开始使用他们拥有的任何函数/类,只要它们被声明为公共。因此,他们可以访问比我希望他们访问的更多内容。

有没有办法禁用它,并获得一个类似于 C++ DLL 的系统(例如,我可以给任何人很多 C++ DLL,如果他们使用其中的函数/类会相当困难,如果他们没有头文件)?我可以以某种方式剥离 DLL 以便它们仍然可以被 exe 使用,但不公开引用吗?或者是否有一些属性可以让我在代码中使用“这个类只能在我构建的 DLL/exe 中使用”?

【问题讨论】:

  • 如果您真正的问题是“我如何通过软件保护免受黑客攻击?”,不,您不能。你唯一能做的就是让他们的生活更加艰难。查看这些技术ssware.com/articles/…

标签: c# .net dll


【解决方案1】:

您可以使用InternalsVisibleToAttribute 而不公开任何内容,但是...

如果您认为任何事情都会阻止某人使用您的 DLL 中的非公共类,那您就大错特错了。具有完全信任的应用程序可以毫无问题地访问私有和内部内容,或者他们可以反编译并重建所有公开的 DLL。

人们会建议混淆,但这并没有更多作用。

你应该阅读这个答案(和问题,但主要是答案):C#: How to Make it Harder for Hacker/Cracker to Get Around or Bypass the Licensing Check?

【讨论】:

  • 我不太在乎黑客:最终的软件包没有它所针对的特定硬件设备将是无用的,因此这不是许可证问题;突然让我震惊的是,代码库的很大一部分是如此暴露,尤其是与我拥有的 C 接口相比,在那里人们只看到我想让他们看到的东西,仅此而已。无论如何,InternalsVisibleToAttribute 看起来像是一种有用的方法,可以让您更难只查看创建的所有内容.. +1!
【解决方案2】:

一种可能的解决方案是只公开应该从可执行文件调用的方法。其他一切都可以是私有的或内部的。您还可以混淆程序集。但请记住,无论您做什么,总是有可能使用反射来调用程序集中的任何方法。当然,如果它被混淆,它会有点困难,但并非不可能。

【讨论】:

    【解决方案3】:

    我认为您可以为此使用Friend assemblies。 您还可以混淆 dll 的内部结构,因此很难进行逆向工程和反编译程序集。 Dotfuscator 之类的工具会将编译后的 dll 中的所有函数/变量名称重命名为 a0002345 之类的名称,因此阅读它会非常详尽。

    请注意,没有一种方法可以为您提供 100% 的保护,因为仍然可以使用 .NET 反射例程来访问和使用您的私有类和内部类。然而,制作 internalprivate 的东西会阻止大多数开发人员使用这些类。使用混淆来阻止高级工程师试图挖掘您的编译源。理论上,如果反编译工作量大于从头开始编写类似工具的工作量,则保护被认为是足够安全的。如果有人无法读取您的 dll,则该人将无法知道如何使用它。

    【讨论】:

    • 对于知道在哪里看的眼睛不会花费一个小时来破解一个混淆的程序集。
    【解决方案4】:

    不,对不起,不是。

    对于类似的事情,您可以先进行 ilmerge 混淆(我不确定是什么工具)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      相关资源
      最近更新 更多