如何保护我的.NET程序集免受反编译?

90

我刚开始学习C#时,学到的最重要的事情之一是可以使用Reflector或其他工具反编译任何.NET程序集。许多开发人员并不知道这一事实,当我向他们展示他们的源代码时,大多数人都感到震惊。

保护免受反编译仍然是一项困难的任务。我仍在寻找快速、简单和安全的方法来保护我的代码。我不想混淆我的代码,以至于我的方法名称将是a、b、c等。Reflector或其他工具应该完全无法识别我的应用程序作为.NET程序集。我已经知道一些工具,但它们非常昂贵。是否有其他保护我的应用程序的方法呢?

编辑:

我的问题并不是为了防止盗版。我只想阻止竞争对手阅读我的代码。我知道他们会这样做,他们已经这样做了。他们甚至告诉了我。也许我有点偏执,但是商业竞争对手读我的代码让我感觉不好。


10
如果反射器无法确定应用程序是否为.NET程序集,那么尝试加载该程序的应用程序该如何做呢? - Brian
1
“我不想让我的代码混淆,所以我的方法名将是a、b、c或者类似的。” 为什么不呢?这是很明显的做法,可以让竞争对手更难理解你的逻辑。 - ToolmakerSteve
是的,混淆100%“只是起作用”。首先,您不应将“秘密”放入代码中,这些“一旦在代码中找到就可能危及安全性”的东西。其次,您是否曾经从GitHub上获取代码并尝试重新利用它?我的意思是,即使是非混淆的代码也可能由于使用的范例、类耦合、模糊的类责任、依赖关系和回调等而难以重新利用。这意味着,您的混淆代码是完全安全的,直到我们有能够理解编程逻辑并快速重写/重构代码的机器人程序员,这不会很快发生。 - Felype
13个回答

116

需要记住的一件事是,你希望以商业上有意义的方式进行这样的处理。为此,你需要确定你的目标。那么,你的目标是什么呢?

防止盗版?这个目标是不可实现的。即使是本地代码也可以被反编译或破解;在线上有大量的盗版软件(即使是像Windows和Photoshop这样的产品),这证明了一个决心坚定的黑客总能够获得访问权限。

如果不能防止盗版,那么仅仅减少盗版呢?这也是错误的。只需要一个人破解你的代码,它就会对每个人都可用。你必须每次都很幸运,而盗版者只需要一次幸运。

我认为目标应该是最大化利润。你似乎认为停止盗版对于这个目标是必要的。但实际上这并不是这样的。利润仅仅是收入减去成本。停止盗版增加了成本。这需要付出努力,这意味着在过程中增加了成本,因此会减少方程式的这一侧。保护你的产品也无法增加你的收入。我知道你看着所有那些盗版软件,希望他们能够支付你的许可费用,但实际上这永远不会发生。这里有一些夸张,但它通常表明,不能破解您安全系统的盗版者要么会寻找可以破解的类似产品,要么就不使用。他们永远不会去购买它,因此他们并没有代表失去的销售额。

此外,保护你的产品实际上会降低收入。原因有两个。一是少数客户在激活或安全方面遇到问题,因此决定不再购买或要求退款。另一个是少数人在购买前实际上尝试盗版软件以确保其有效性。限制您的产品被盗版分发(如果您能够成功做到这一点)将阻止这些人尝试您的产品,因此他们永远不会购买它。此外,盗版也可以帮助您的产品传播到更广泛的受众中,从而吸引更多愿意为此付费的人。
更好的策略是假设你的产品将被盗版,并考虑利用这种情况的方法。关于这个话题还有几个链接:
如何防止我的代码被盗?
保护 .NET 应用程序

39
主要目标不是防止盗版,而是防止竞争对手阅读我的代码。我知道他们会这样做,他们已经这样做过了。 - TalkingCode
16
如果这是你的目标,使用混淆器就足够了。 - Joel Coehoorn
2
我不会说,如果某些软件无法破解,海盗就永远不会购买任何许可证。这并不是100%正确的。我见过人们说“我不会买那个软件/游戏,买不起,啥啥啥”,然后在他们发现破解版本已经过时、有病毒或无法让他们访问某些在线功能后购买它。 - Tarec
3
保护产品对增加收入一点用也没有?你有什么确凿的数据支持这种说法吗?我认识的任何软件销售商都没有这种经历。事实上,情况恰恰相反,保护产品反而能提高收入。保护产品会降低收入吗?不,这与我所认识的销售商的经验是不一致的。我听过很多这样的说法,但我认为它们一定是由那些没有尝试过两种方法的人或者那些跟我所知道的销售商不在同一个行业领域的人所说的。 - Shavais
2
-1 在我看来,这不是对问题的回答。而且很虚假,除非软件非常便宜 - 多数用户,少数购买者。即使有部分反盗版障碍,也是净利润的赢家,原因是有很多潜在客户如果可以免费获得东西就不会费心去购买,但他们也会犹豫是否安装盗版软件(病毒风险,更新不便)。根据我的经验,下载破解软件的人通常不是潜在客户,因为他们愿意冒这种风险而不愿花钱购买。潜在客户下载合法的试用版本。 - ToolmakerSteve
显示剩余7条评论

16

在我们的工作中,我们使用PreEmptive Solutions的Dotfuscator

虽然保护.NET程序集100%是不可能的,但我认为Dotfuscator足够难以破解。 它带有许多混淆技术;

交叉程序集重命名
重命名方案
重命名前缀
增强的重载归纳
递增式混淆
HTML重命名报告
控制流程
字符串加密

而且他们对于小公司来说并不是非常昂贵。 他们为小公司提供特殊定价。

(不,我不在PreEmptive工作;-))

当然还有免费软件替代品;


2
我也使用这个软件。非常好的软件,尽管它有一些对我来说无用的功能,比如让你的程序过期的功能或通过电子邮件向你报告异常的功能。但是重命名和逻辑流程方面非常好,我认为在经过这个程序的良好运行后,任何人都无法实际阅读您的代码。 - TheGateKeeper

14

在任何云服务提供商中托管您的服务。


10

如何防止任何C#应用程序的反编译

基本上描述了整个情况。

在某个时候,代码将必须转换为虚拟机字节码,用户可以在那时获取它。

机器代码也没有那么不同。像IDA Pro这样的优秀交互式反汇编器/调试器几乎使任何本地应用程序透明化。调试器足够聪明,可以使用人工智能来识别常见API、编译器优化等,它允许用户从机器代码生成的汇编中仔细重建更高级别的构造。

而且IDA Pro也在某种程度上支持.Net。

老实说,在一个反向工程(为了兼容性)项目上工作了几年之后,我从我的经验中得到的主要是,我可能不应该过分担心别人窃取我的代码。如果有人想要它,无论我采取什么方案,都不会很难获取它。


8
代码可读性应比编写难度更高。 - Brian

9
没有任何混淆器可以保护您的应用程序,甚至包括此处描述的任何一个。请查看此链接,它是一种反混淆器,可以反混淆几乎所有现有的混淆器。

https://github.com/0xd4d/de4dot

最好的方法(但请记住,它们也不是完全专业的)是使用混合代码,在非托管语言中编写重要代码并创建类似于C或C ++的DLL,然后使用Armageddon或Themida进行保护。 Themida并非适用于所有破解软件,它是市场上最好的保护程序之一,可以保护您的.NET软件。


5

我知道您不想混淆代码,但也许您应该查看dotfuscator,它可以帮助您混淆编译后的程序集。我认为它甚至可以对它们进行加密。


3

3
我们使用 SmartAssembly 来保护一个企业级分布式应用程序的 .NET,它对我们非常有效。

2
如果你想完全保护你的应用程序免受反编译,可以考虑使用Aladdin的Hasp。你可以将你的程序集包装在一个加密的壳中,只有你的应用程序才能访问。当然,人们会想知道他们是如何做到这一点的,但它确实有效。但我不确定他们是否能够保护你的应用程序免受运行时附加/反射,这是Crack.NET能够做到的。此外,编译成本地代码作为解决方案也要小心...因为对于本地代码也有反编译器。

1

你会使用API吗?

与其试图在所有客户设备上保护产品中的一个DDL文件,为何不为宝贵的产品功能创建API服务呢?让保存在设备上的实际产品使用该API以按照您要求的方式交付产品。

我认为这样您可以确保代码不会被反编译,并且您可以在API中设置自己的限制,以防开发人员/黑客以您不希望的方式使用您的API。

当然这需要更多的工作,但最终您将掌控一切。


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