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

33
我们计划使用C#和MySQL开发客户端服务器应用程序,并像其他软件工具一样将产品销售出去。我们担心我们的产品会被反编译,因为它在可用性和捆绑功能方面确实比我们的竞争对手有所优势。
如何防止我们的软件被反编译,以便产品的业务逻辑保持完整?
我们听说过Reflector和其他反编译器,它们让我们的代码非常容易受到抄袭的威胁。
我们的客户群体不是企业,而是医生,他们自己可能不会这么做,但我们的竞争对手可能想要复制、禁用许可证甚至复制代码/功能,以使我们的产品价值在市场上降低。
欢迎提出任何防止这种情况的建议。

7
因为还没有人提到它,所以我想我会说一下:没有100%的绝对方法可以防止软件反编译。如果有人真的想看到你的算法,他们就能够做到。但是,你可以混淆你的代码,虽然这并不能防止反编译,但它使得反编译变得更加困难。 :) (注:"makes it a bitch to do"是一句口语化的表达方式,意思是“使它变得非常困难”。) - Sasha Chedygov
1
另外,请参考这个问题:https://dev59.com/ynVD5IYBdhLWcg3wL4cA - Sasha Chedygov
10个回答

28
如果您将.NET程序集部署到客户机上,使用反编译和类似的工具进行某种程度的反编译总是可能的。
但是,这种情况与您使用本机C++编写应用程序所遇到的情况并没有实质性的不同。反编译总是可能的,如果不可能反编译,处理器也无法理解它。
您永远无法击败专业的破解者——他们会将您的安全性视为一个智力难题,为了挑战而被解决。
问题在于如何打败您的许可证实践和投资回报。
坐下来用电子表格查看可能的情况——危险可能比您想象的要小。
像“易用性”这样的因素在您的软件中对任何用户都是可见的,因此您认为很容易复制。但是,好的用户体验很少见(也很少被很好地复制),因为大多数开发人员(包括我自己)都不像典型用户。
我建议您专注于使破解者的工作更加困难,因为您永远无法使其变得不可能,只能使其失去利润。
一个尝试的可能性:可以在安装过程中将程序集预编译为本机代码。Paint.NET出于性能原因就这样做。我相信,一旦您完成了此操作,就可以放弃原始程序集并使用优化的本机代码版本。

嗨,我听说使用预编译和普通dll可能会出现问题。我们自己正在使用8-9个第三方dll来实现我们的功能。你有任何相关的想法吗? - Kalpak
@Kalpak - 很抱歉,但我不知道。我读过有关程序集预编译的内容,但从未尝试过。 - Bevan

7

如果是我,我不会试图混淆代码;相反,我会:

  1. 不用担心这个问题,继续改进并保持领先。

但第二点:

  1. 考虑通过Web提供“秘密”服务。这取决于您决定这一点的重要性和可行性;但它确实“防止”反编译,因为最终用户甚至没有代码。

3
我喜欢这个想法。在任何人使用该服务之前,他都可以通过认证来确认他是持有许可证的人。 - Kalpak
+1 特别是为了不断提高和保持领先。 - kenny
"甚至没有编译后的应用程序" - Xpleria

6
搜索.NET混淆器的谷歌。你会发现有很多产品可以帮助解决这个问题。同时,在Stack Overflow上也已经有相关的问题被问到了。
以下是一些例子: 编辑: 在寻找去混淆工具时,我发现了一个开源工具De4Dot。这个工具支持反编译大多数商业工具创建的混淆dll,并且效果非常好。

1
我们尝试了几个混淆器,但它们在某些情况下都失败了。我们正在使用一些由Delphi开发的第三方dll。因此,一些混淆器存在问题。有些混淆器对从数据库填充的下拉菜单也存在问题。我不知道我们是否做错了什么,但肯定我们已经尝试了4-5个混淆器,但没有一个能使产品像在Visual Studio中那样工作。另外,我们正在使用log4net进行日志记录。关于这些消息,我们该怎么办? - Kalpak
如果你真的希望你的代码不被读取,那么请使用C++构建你的重要和关键dll(如许可证等)。否则,请尝试以本机模式构建C# dlls(不确定这会提供多少保护)http://msdn.microsoft.com/en-us/library/6t9t5wcf%28VS.80%29.aspx。 - Ganesh R.
我听说一些,可能是很多混淆器已经被黑客攻破了,变得毫无价值。我相信其他的也只是时间问题。最好的防守就是进攻,推动你的产品向前发展。 - kenny

1

Intellilock在混淆和许可方面为我们服务得很好。但是,由于支持不到位,我不建议使用该产品。我们从未及时收到针对我们所面临问题的回复。我们不得不自己搜索和研究,甚至改变业务需求以实现一些目标。

通过这个答案,我并不打算推广或贬低任何软件,只是想让人们了解我们正在使用的产品,以便他们做出明智的决定。


0

你可能想考虑使用Remotesoft Salamander Protector,这比其他任何东西都要好,因为它使反编译到高级语言变得不可能。

当然,任何专家都可以花足够的时间来研究你的软件并找出其中的一些问题,但它会隐藏所有的设置和获取方法。

所以,他们可以窥视一下,但仅限于此。他们必须自己解决其余的问题,这降低了任何人破解它的概率。

希望这有所帮助。


0

很久没有在这个帖子上发言了。我们购买了一个叫做Intellilock的软件,它有助于防止反编译、混淆,并且还具有强大的许可模块。

尽管.Net Reactor拥有更多的预防控制,但我们并没有选择它,因为Intellilock已经足够满足我们的需求。


0

上一次我调研时,Spices.Net Obfuscator 看起来是市场上最好的东西。

不,我不在他们工作。 :)


6
“Looked like” - 你实际尝试过吗? - Jason Short

0

我使用smartassembly。它易于使用,还具有内置的崩溃报告发送功能。


0

其他人提到的混淆器可能非常好。

你可能没有考虑过的另一种方法是使用完全编译为机器代码的语言(如C++)编写一些核心业务逻辑。

这样做的好处是,它使得他人更难反编译您的代码。缺点是您需要维护两种语言的代码。这可能不是您情况下最好的方法,但在只需要混淆一小部分代码而其余代码是UI装饰时非常有用。

例如,您的医疗软件包可能正在执行某些腺体的边缘检测,以便告诉医生该腺体的大小。从位图图像计算腺体大小的算法将包含在使用C++编写的DLL中。


当然,这样做会违反您运行100%托管代码的能力,这也会防止您在中等信任级别下运行等等。我想这取决于您的情况。 - Jason Short

0
关于C++封装.NET代码的问题,我认为这种方法行不通。因为当你部署应用程序时,最终的C++动态链接库和包含业务逻辑代码的.NET动态链接库将是独立的实体。那些想要访问你的业务逻辑的人仍然可以轻易地提取出.NET动态链接库并查看其中的内容。

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