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

问题描述 投票:64回答:13

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

防止反编译仍然是一项艰巨的任务。我仍在寻找一种快速,简便,安全的方法。我不想混淆我的代码,所以我的方法名称将是a,b,c左右。反射器或其他工具应该无法将我的应用程序识别为.NET程序集。我已经了解了一些工具,但它们非常昂贵。有没有其他方法来保护我的应用程序?

编辑:

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

c# .net decompiling reflector
13个回答
100
投票

要记住的一件事是,您希望以具有商业意义的方式执行此操作。为此,您需要定义目标。那么,你的目标到底是什么?

防止盗版?这个目标是不可能实现的。甚至本机代码也可以反编译或破解;在线提供的众多warez(即使是像Windows和Photoshop这样的产品)也证明了一个坚定的黑客可以随时获得访问权限。

如果你无法阻止盗版,那么仅仅减少盗版呢?这也是错误的。它只需要一个人破解你的代码就可以让每个人都可以使用它。你每次都要幸运。海盗只需要幸运一次。

我把它给你的目标应该是最大化利润。您似乎相信阻止盗版是这项努力的必要条件。它不是。利润只是收入减去成本。停止盗版会增加成本。这需要付出努力,这意味着在过程中的某个地方增加成本,因此减少了等式的这一方面。保护您的产品也无法增加您的收入。我知道你看看所有那些海盗,看看你能赚到的所有钱,只要他们愿意支付你的执照费,但现实是这种情况永远不会发生。这里有一些夸张,但它通常认为,无法破解你的安全的海盗会找到一个他们可以破解或没有的类似产品。他们永远不会购买它,因此它们不代表销售损失。

此外,保护您的产品实际上会减少收入。有两个原因。其中一小部分客户在激活或安全性方面遇到问题,因此决定不再购买或要求退款。另一个是实际尝试使用盗版软件以确保其在购买前有效的人中的一小部分。限制您的产品的盗版分发(如果您能以某种方式成功)可以防止这些人尝试您的产品,因此他们永远不会购买它。此外,盗版还可以帮助您的产品传播到更广泛的受众,从而吸引更多愿意为此付费的人。

更好的策略是假设您的产品将被盗版,并考虑如何利用这种情况。关于这个主题的几个链接: How do i prevent my code from being stolen? Securing a .NET Application


1
投票

你是API吗?

您没有尝试在所有客户设备上的某个产品中保护您的一个ddl文件,为什么不为您的宝贵产品功能创建API服务呢?让设备上保存的实际产品使用该API来根据需要提供产品。

我认为这样你就可以100%确定你的代码没有被反编译,并且你在API中设置了自己的限制,这样开发人员/黑客就不会以你不想要的方式使用你的API。

当然还有一些工作,但最终,你处于控制之中。


0
投票

如果有人必须窃取您的代码,则可能意味着您的业务模式无效。那是什么意思?例如,我购买你的产品然后我要求支持。你太忙了,或者相信我的请求无效,浪费你的时间。我解码您的产品以支持我的相关业务。您的产品对我来说变得更有价值,我会优先考虑我的时间,以便解决业务模式以利用您的产品。我重新编码并重新标记您的产品,然后出去赚取您决定留在桌面上的钱。有保护代码的原因,但很可能你是从错误的角度看问题。你当然是。你是“编码员”,我是商人。 ;-)干杯!

PS。我也是开发人员。即“编码员”


0
投票

我知道这已经过时了,但Themida是我用过的最先进的防破解软件。 但这不是免费的。


0
投票

除了此处列出的第三方产品外,还有另一个:NetLib Encryptionizer。然而,它的工作方式与混淆器不同。混淆器通过内置的反混淆“引擎”修改程序集本身。加密器在文件级加密DLL(托管或非托管)。所以它不会修改DLL,除了加密它。在这种情况下,“引擎”是位于应用程序和操作系统之间的内核模式驱动程序。 (免责声明:我来自NetLib Security


16
投票

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

虽然不可能保护.NET程序集100%Dotfuscator让我觉得很难。我带来了很多混淆技术;

交叉装配重命名 重命名方案 重命名前缀 增强的过载感应 增量混淆 HTML重命名报告 控制流 字符串加密

事实证明,对于小公司来说,它们并不是非常昂贵。他们对小公司有特殊定价。

(不,我不是为PreEmptive工作;-))

当然有freeware替代品;


13
投票

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


10
投票

How to preventing decompilation of any C# application

几乎描述了整个情况。

在某些时候,代码必须被转换为VM字节码,然后用户可以获得它。

机器代码也没有太大的不同。像IDA Pro这样的好的交互式反汇编程序/调试程序可以使任何本机应用程序透明化。调试器非常智能,可以使用AI来识别常见的API,编译器优化等。它允许用户从机器代码生成的程序集中重新构建更高级别的构造。

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

老实说,在从事逆向工程(兼容性)项目几年之后,我从经验中得到的主要是我可能不应该过多担心人们窃取我的代码。如果有人想要它,无论我实施什么方案,都不会很难得到它。


5
投票

我知道你不想混淆,但也许你应该检查dotfuscator,它将采取你编译的程序集并为你混淆它们。我认为它甚至可以加密它们。


4
投票

没有混淆器可以保护您的应用程序,甚至没有任何描述。看到这个链接,它是一个deobsfuscator,可以解除几乎每个混淆器在那里。

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

可以帮助你的最好的方法(但要记住它们也不是完整的教授)是使用混合代码,用非托管语言编写重要代码并制作类似C或C ++的DLL,然后使用Armageddon或Themida保护它们。 Themida并不适合所有的破解者,它是市场上最好的保护者之一,它也可以保护您的.NET软件。


3
投票

我听说过一些直接将IL编译成本机代码的项目。你可以从这篇文章中获得一些额外的信息:Is it possible to compile .NET IL code to machine code?


3
投票

我们使用{SmartAssembly}来保护企业级分布式应用程序的.NET,它对我们来说非常有用。


2
投票

如果你想完全保护你的应用程序免受反编译,请查看阿拉丁的搭扣。您可以将程序集包装在只能由应用程序访问的加密shell中。当然有人想知道他们是如何做到这一点的,但它有效。但我不知道他们是否保护您的应用程序免受Crack.NET能够执行的运行时附件/反射。

- 编辑还要注意编译本机代码作为解决方案......本机代码也有反编译器。

© www.soinside.com 2019 - 2024. All rights reserved.