能否“剥离”一个.NET DLL文件?

5
我使用模块化的方法用C#构建了一个简单的演示应用程序,它包含一个可执行文件和几个DLL文件。假设我将它放在一个zip文件中交给别人,目的只是让他们通过提取文件并双击exe来尝试演示应用程序。
据我所知,任何获得应用程序和DLL文件的人都可以在Visual Studio项目中添加对DLL文件的引用,然后开始使用任何公开声明的函数/类,因此,他们可以访问比我想要的更多的内容。
有没有办法禁用这个功能,并获得类似于C++ DLL(例如,如果他们没有头文件,则我可以给任何人很多C ++ DLL,并且他们将很难使用其中的函数/类)的系统?我是否可以删除DLL文件以使其仍然可被exe使用,但不会暴露引用?或者代码中是否有属性等可以使用的东西,表示“这个类只能被我构建的DLL/exe使用?”

2
如果你真正的问题是“如何保护我的软件免受黑客攻击?”,那么不,你不能。你唯一能做的就是让他们的生活更加困难。请参考这些技巧:http://www.ssware.com/articles/writing-effective-license-checking-code-and-designing-effective-licenses-with-cryptolicensing.htm - L.B
4个回答

5

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

如果您认为可以阻止某人使用DLL中的非公共类,则是错误的。具有完全信任的应用程序可以轻松访问私有和内部内容,或者他们可以反编译并重新构建具有全部公共内容的DLL。

人们会建议混淆代码,但实际效果不大。

建议您阅读以下答案(以及问题,但主要是答案):C#: 如何使黑客/破解者难以绕过或绕过许可检查?


我并不太关心黑客:最终软件包如果没有为其编写的特定硬件设备是毫无用处的,因此这不是许可证问题;它突然袭击了我,代码库的大部分内容都是如此暴露的,尤其是与C接口相比,我只会让其他人看到我想让他们看到的而已。无论如何,InternalsVisibleToAttribute看起来是一种可用的方法,可以使查看所有创建的东西变得更加困难.. +1! - stijn

3

一种可能的解决方案是只公开可从可执行文件中调用的方法。其他内容可以设为私有或内部。您还可以混淆程序集。但请记住,无论您做什么,始终存在使用反射来调用程序集内任何方法的可能性。当然,如果进行了混淆,这将会更加困难,但并非不可能。


1

我认为你可以使用友元程序集来实现这一点。 你还可以混淆你的dll内部,使得反向工程和反编译你的程序变得非常困难。像Dotfuscator这样的工具会将编译后的dll中的所有函数/变量名称重命名为类似a0002345的东西,因此阅读它将会非常费力。

请注意,这些方法都不能给你100%的保护,因为仍然有可能使用.NET反射例程来访问和使用你的私有和内部类。但是,将东西设为internalprivate将阻止大多数开发人员使用这些类。使用混淆来阻止试图挖掘你编译源代码的高级工程师。理论上,如果反编译的努力大于从头开始编写类似工具的努力,那么保护被认为是足够安全的。如果有人无法读取你的dll,那么他就不会知道如何使用它。


对于有经验的眼睛来说,破解混淆汇编代码不需要一个小时。 - L.B

0

不好意思,不行。

你可以尝试使用ilmerge,然后使用混淆工具(我不确定是哪个工具)来实现类似的效果。


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