.NET模糊处理工具/策略


160

我的产品包含几个组件:ASP.NET,Windows Forms App和Windows Service。95%左右的代码是用VB.NET编写的。

出于知识产权的原因,我需要对代码进行混淆处理,直到现在为止,我一直在使用dotfuscator版本,该版本现已使用5年以上。我认为现在是时候使用新一代工具了。我正在寻找的是在寻找新的混淆器时应考虑的要求列表。

我知道到目前为止我应该寻找的是:

  • 序列化/反序列化。在我当前的解决方案中,我只是告诉该工具不要混淆任何类数据成员,因为无法加载以前已序列化的数据的痛苦实在太大了。
  • 与构建过程集成
  • 使用ASP.NET。过去,由于更改.dll名称(每页通常有一个),我发现这是有问题的-并非所有工具都能很好地处理。

一些重复:google.com/...
约翰·拉什


有关混淆代码的替代解决方案,请参见Agile.net .NET Obfuscator。特别要检查其代码虚拟化功能。
萨顿伯纳德

在SO上查看从ArmDot到Xenocode的混淆器的完整列表:stackoverflow.com/a/60054/1480104
Artem Razin

Answers:


43

回到.Net 1.1,混淆是必不可少的:反编译代码很容易,并且您可以从汇编,IL到C#代码,再花费很少的精力重新编译。

现在,对于.Net 3.5,我完全不确定。尝试反编译3.5程序集;您得到的信息距离编译还有很长的路要走。

添加3.5中的优化(远优于1.1),以及通过反射处理匿名类型,委托等的方式(它们是重新编译的噩梦)。添加lambda表达式,像Linq-syntax和一样的编译器“魔术” var,以及像这样的C#2函数yield(这会导致名称不可读的新类)。您反编译的代码与可编译代码的距离很长。

一个有很多时间的专业团队仍然可以再次对其进行反向工程,但是对于任何混淆的代码来说都是如此。他们从中得到什么代码将是难以维护的,并且很有可能是非常多的错误。

我建议对程序集进行密钥签名(这意味着如果黑客可以重新编译它们,则必须重新编译所有程序),但是我认为混淆不值得。


127
完全不同意。签名不能取代混淆。签名的目的是再次入侵您的代码。但是,如果您要隐藏什么,您的想法,算法等都是唯一的方法。
伯劳

24
我不认为签名可以代替混淆,它只是使黑客更难。混淆并不能掩盖您的想法-如果他们想复制自己的想法,反而混淆也不会变得更加困难。特别是由于算法对所有运算符的混淆都不会对其产生太大影响-它们通常是最容易提取的东西之一。
基思

6
如果您谈论的是一个拥有大量可支配资源的团队,那么混淆可能不值得,但是混淆对于防止“普通”开发人员非常有用,该开发人员只希望使用Reflector打开您的程序集并保存源代码作为一个项目并进行调整。混淆存在,而完全排除它是错误的态度。这是防御层。
Razor

5
反编译时,源处于混乱状态,但从逻辑上讲,它仍遵循相同的路径。没有编译器“魔术”伏都教。我知道,因为我最近丢失了一个存储库,并使用了反射器来恢复源代码。混淆只是“维护”的痛苦,如果它不是您构建过程的一部分。它确实增加了开销,但是我们都在编写计算密集型应用程序吗?不。对于弱小的攻击者来说,这是防御的薄弱环节。
Razor

8
真是个可怕的答案。您最近是否实际尝试过反编译?反编译器变得更好,而不是更糟。Reflector提供接近原始资源的质量,当然没有评论。
BlueRaja-Danny Pflughoeft

50

我们已经尝试了许多混淆器。它们都不能在使用远程处理的大型客户端/服务器应用程序上工作。问题是客户端和服务器共享一些dll,而我们还没有找到任何可以处理它的混淆器。

我们已经尝试过DotFuscator Pro,SmartAssembly,XenoCode,Salamander和一些名称不知我的小型应用程序。

坦白说,我坚信混淆是一个大问题。

即使它解决的问题也不是完全真实的问题。您真正需要保护的唯一一件事就是连接字符串,激活代码以及诸如此类的对安全敏感的东西。另一家公司将对您的整个代码库进行反向工程并从中创建竞争产品的想法是胡说八道,这是妄想狂经理的噩梦,而不是现实。


14
勇敢的犹大!保持领先的唯一方法是开发新的,更好的代码,而不是坚持使用已经编写的代码。您最终将时间,精力甚至是金钱投入到无关紧要的事情上。混淆是不值得的。
David Rutten

180
这就是为什么我不喜欢这种声誉系统的原因,您只有19票,还没有提出要求。用户不是要征求您有关混淆的意见,而是想了解有关混淆技术的更多信息。
backslash09年

32
我提供了有关使用几种现有混淆器的经验的信息。我的看法是从这种经验中得出的。
Judah Gabriel Himango,2009年

6
+1表示“坦白地说,我确信混淆是个大问题。” 您再没有比这更好的了。
安德烈·里内(AndreiRînea),2010年

15
保护您的代码非常有效的需求是向公司出售昂贵的专用应用程序,而这些应用程序将仅在少数用户内部使用。诱惑在于颠倒代码,以允许出于内部目的进行内部黑客和修改,避免维护合同,甚至破解试用版本以获取所需的东西。
布雷迪·莫里兹

43

我现在正对此深有感触,试图找到一个好的解决方案。到目前为止,这是我的印象。

Xenocode-我拥有Xenocode2005的旧许可证,该许可证曾经用于混淆.net 2.0程序集。它在XP上运行良好,是一个不错的解决方案。我当前的项目是.net 3.5,我在Vista上,支持人员告诉我可以尝试一下,但2005版甚至无法在Vista上运行(崩溃),因此我现在必须以惊人的价格购买“ PostBuild2008” 1900美元。这可能是一个很好的工具,但我不会发现。太贵了

Reactor.Net-这是一个更具吸引力的价格,在我的Standalone Executeable上运行良好。许可模块也很好,可以为我省去很多精力。不幸的是,它缺少一个关键功能,那就是能够将事物排除在混淆之外。这使得无法实现我需要的结果(将多个程序集合并在一起,混淆一些而不是混淆其他)。

SmartAssembly-我为此下载了Eval,它运行正常。我能够实现我想要的一切,并且界面是一流的。价格仍然有点高。

Dotfuscator Pro-在网站上找不到价格。目前正在讨论中以获取报价。听起来不祥。

Confuser-一个工作得很好的开源项目(正如名称所暗示的那样,混淆了ppl)。

注意:据报道,根据ConfuserEx 在其GitHub存储库上的问题498,其“损坏” 。


8
你可以张贴多少dotfuscator报价?
安东尼·约翰斯顿,2010年

6
@Anthony I最近在2011年初购买了一个许可证。报价为$ 2475 USD,要求至少购买一台构建机器+ 1个开发人员许可证。包括12个月的升级和支持。
Yoshi

2
发布本文时,我没有使用.NET Reactor,但是现在您可以使用System.Reflection.Obfuscation属性将部分代码从混淆中排除。还有一些设置可以让您执行诸如排除所有方法或所有可序列化类型的操作。
benteight

5
DotFuscator报价我4999美元,但由于10%的折扣而减至4500美元。这是1个开发许可证!在讨论中,价格降低到2500美元,但仍然太贵了。
奥利弗(Oliver)

3
.NET Reactor现在具有“排除规则编辑器”,可以从混淆中排除某些类,方法或属性。此外,您可以使用复选框“仅合并”将特定的dll从混淆中排除
avitenberg 2016年


18

我一直在使用smartassembly。基本上,您选择一个dll,然后将其混淆。看来一切正常,到目前为止我还没有遇到任何问题。非常非常易于使用。


6
Smartassembly非常没用。破解者将您的应用程序放入DumbAssembly,并通过单击鼠标删除所有“保护”: woodmann.com/collaborative/tools/index.php/Dumbassembly
Elmue 2014年

2
到目前为止,Google安全浏览已将woodmann的网站标记为不安全。另外,woodmann的网站上有整篇关于他以前遭受恶意软件感染的文章,因此当Google不信任他时,我真的不想浏览他的网站。
布赖恩

10

我已经尝试了市场上几乎所有的混淆器,我认为SmartAssembly是最好的。


6
Smartassembly非常没用。破解者将您的应用程序放入DumbAssembly,单击鼠标即可删除所有“保护”:woodmann.com/collaborative/tools/index.php/Dumbassembly
Elmue 2014年

3
到目前为止,Google安全浏览已将woodmann的网站标记为不安全。另外,woodmann的网站上有整篇关于他以前遭受恶意软件感染的文章,因此当Google不信任他时,我真的不想浏览他的网站。
布赖恩

9

我也一直在使用SmartAssembly。我发现Ezrinz .Net Reactor在.net应用程序上对我来说要好得多。它混淆,支持Mono,合并程序集,并且还具有非常好的许可模块,可以创建试用版或将许可链接到特定计算机(非常易于实现)。价格也很有竞争力,当我需要支持时,价格会很快。 埃齐里兹

明确地说,我只是喜欢该产品的客户,与公司没有任何关系。


我有很多朋友对.Net Reactor发誓-尽管不在产品网站上,但该产品还有一个有用的Google
网上论坛

2
+1代表Eziriz。我取得了出色的成绩。IMO,这是目前最好的。
德鲁伊

4
.NET Reactor很烂。我更换了计算机,两次发送有关许可证文件的电子邮件,但没有得到答复。您会看到.NET Reactor许可证已被硬件锁定。
OrElse 2011年

2
那很正常。您如何期望他们相信您?他们怎么知道您确实更改了计算机,而不是尝试在计算机上运行朋友的许可证?因为那是硬件锁!如果可以在多台计算机上使用,则硬件锁将毫无用处。
Elmue 2014年

(PS。我们主要是根据此SO响应选择反应堆。)
克里斯(Chris

7

简短的答案是您不能这样做。

周围有各种各样的工具,这会使某人阅读您的代码变得更加困难-其中一些已由其他答案指出。

但是,所有这些操作使阅读起来更加困难-它们增加了所需的工作量,仅此而已。通常,这足以阻止不经意的读者,但是决心研究您的代码的人将始终能够做到这一点。


51
if(efforts.Required> codeFromScratch.Costs)DoNoReverseEngineer();
Nicolas Dorier,2009年

41
@NicolasDorier,Operator '>' cannot be applied to operands of type 'System.TimeSpan' and 'decimal'
Saeb Amini

21
@Saeb确信他们可以做到,从TimeSpan转换为money(十进制)是大多数企业的目标。
hultqvist 2014年

6

我们有一个带有asp.net和winform界面的多层应用程序,它还支持远程处理。我使用任何混淆器都没有问题,除了加密类型会生成一个加载程序,该加载程序可能会以各种意外方式出现问题,我认为这不值得。实际上,我的建议将更多地遵循“避免像瘟疫一样加密加载程序类型混淆器”的思路。:)

以我的经验,任何混淆器都可以在.net的任何方面(包括asp.net和远程处理)正常工作,您只需要熟悉设置并了解可以在代码的哪些区域进行扩展即可。并花时间尝试对所获得的内容进行逆向工程,并查看其在各种设置下如何工作。

多年来,我们在商业应用程序中使用了数年,并从9rays.net上选择了Spices混淆器,因为价格合适,可以完成工作,并且它们具有良好的支持,尽管说实话,多年来我们确实不再需要这些支持,我认为使用哪种混淆器并不重要,如果要使其与远程处理和asp.net一起正常工作,问题和学习曲线都是相同的。

正如其他人提到的那样,您真正要做的只是相当于一个挂锁,将其他情况下的老实人拒之门外,或者使重新编译应用程序变得更加困难。

许可通常是大多数人的关键领域,无论如何,您绝对应该使用某种数字签名的证书系统进行许可。如果没有合适的智能系统,最大的损失将来自于随意共享许可证,而破坏许可证系统的人永远不会首先购买。

太容易了,这很容易对客户和您的业务产生负面影响,做简单而合理的事情,然后不必担心。


5

在过去的两天里,我一直在尝试使用Dotfuscator Community Edition Advanced(注册Visual Studio附带的基本CE后免费下载)。

我认为更多人不使用混淆作为默认选项的原因是,与风险相比,这是一个严重的麻烦。在较小的测试项目上,我可以花很多精力使混淆的代码运行。通过ClickOnce部署一个简单的项目很麻烦,但是在使用法师手动签名清单后可以实现。唯一的问题是,在出错时,堆栈跟踪会再次被混淆,并且CE没有打包去混淆器或澄清器。

我试图混淆一个基于Excel的VSTO的真实项目,该项目具有Virtual Earth集成,大量Web服务调用,一个IOC容器以及大量反射。这是不可能的。

如果混淆确实是一个关键要求,则应从一开始就考虑到应用程序的设计,并在进行过程中测试混淆的构建。否则,如果这是一个相当复杂的项目,那么最终将带来极大的痛苦。


5

加密混淆器可解决您的所有问题和情况。它:

  1. 根据规则自动将类型/成员排除在混淆之外。序列化类型/字段是其中之一。
  2. 可以使用MSBUild将其集成到构建过程中。
  3. 支持ASP.Net项目。

3
fyi @logicnp写了Crypto。
CAD bloke

似乎不再支持加密。
卡尔

我已经试了几个,“加密”显得非常积极和有益的,但运行在De4dot我的混淆DLL时拿到的原代码...很抱歉毁了党....
戴夫·加恩

4

我最近尝试将一个免费混淆器的输出传递到另一个免费混淆器中,即Dotfuscator CE和CodePlex上的新Babel混淆器。在我的博客上有更多详细信息。

至于序列化,我已经将该代码移到了另一个DLL中,并将其包含在项目中。我认为在XML中没有任何秘密,因此它不需要混淆。如果这些类中有任何严肃的代码,则应在主机部件中使用部分类来解决。


-1,因为“天哪,我听说您喜欢混淆器,所以我在混淆器的输出上运行了混淆器……想了解更多?gimme页面点击数”。但是我发现第二段是一个很好的建议。
ANeves 2014年

3

您应该使用平台上最便宜,最著名的东西,然后每天称呼它。高级语言的混淆是一个难题,因为VM操作码流不会遭受本机操作码流所面临的两个最大问题:函数/方法标识和寄存器别名。

您应该了解的字节码反转是,安全测试人员查看标准X86代码并查找其中的漏洞已经成为标准做法。在原始X86中,您甚至不必找到有效的函数,更不用说在整个函数调用中跟踪局部变量了。几乎在任何情况下,本机代码反向器都无法访问函数和变量名-除非他们正在审阅Microsoft代码,而MSFT会帮助他们将这些信息公开。

“ Dotfuscation”主要通过扰乱函数和变量名来工作。这样做可能比发布带有调试级别信息的代码更好,因为Reflector实际上会放弃您的源代码。但是,除此之外,您所做的任何事情都可能会导致收益递减。



3

您可以使用“ Dotfuscator社区版”-Visual Studio 2008 Professional中默认提供它。您可以在以下位置阅读有关它的信息:

http://msdn.microsoft.com/zh-cn/library/ms227240%28VS.80%29.aspx
http://www.preemptive.com/dotfuscator.html

该产品的“专业”版本要花钱,但效果更好。

您是否真的需要对代码进行混淆?通常,除非将其用于安全目的,否则将应用程序反编译的错误很少。如果您担心人们会“窃取”您的代码,那就不要了。看着您的代码的绝大多数人都是出于学习目的。无论如何,.NET没有完全有效的混淆策略-具有足够技能的人将总是能够反编译/更改您的应用程序。


为此+1。我已经尝试了几乎所有免费的.NET模糊处理程序,而Dotfuscator是唯一在我的ASP.NET应用程序中真正混淆了大部分MSIL的程序。
Saille 2010年

@Saille,您是否为此使用了免费的Dotfuscator-Community Edition?我刚进行过销售聊天,他们说专业版的价格为2000欧元。:(
霍曼2011年

Dotfuscator一文不值。
user626528 2014年

3

避免使用反应堆。这是完全没用的(是的,我付了许可证)。Xenocode是我遇到的最好的,并且也购买了许可证。支持非常好,但我并不需要它,因为它可以正常工作。我测试了我能找到的每个混淆器,得出的结论是xenocode无疑是最健壮的,并且干得最好(也有可能将.NET exe后期处理成本机exe,而我在其他任何地方都看不到)。

反应器和异种代码之间有两个主要区别。第一个是Xenocode实际上有效。第二个是程序集的执行速度没有什么不同。使用反应堆时,速度要慢约600万倍。我也给人的印象是反应堆是一个人的手术。


.NET Reactor有很多选择。其中一些涉及运行时保护,这会稍微降低应用程序的速度,但这是获得额外安全性的代价。但是,我严重怀疑,如果仅使用.NET Reactor模糊处理,而没有其他选择,是否会减慢速度
avitenberg 2016年


2

从.Net 1开始,我就一直在混淆同一应用程序中的代码,从维护角度来看,这一直是一个头疼的问题。正如您已经提到的,可以避免序列化问题,但是很容易犯一个错误并混淆您不想混淆的内容。破坏构建或更改混淆模式很容易,并且无法打开旧文件。另外,可能很难找出问题所在和出处。

我们的选择是Xenocode,如果我今天要再次做出选择,我希望不要混淆代码或使用Dotfuscator。



1

我们在Windows客户端上使用SmartAssembly。效果很好。

确实也会增加一些额外的问题。必须清除对日志文件/异常中的类名的打印输出。当然不能从其名称创建类。因此,最好看一下您的客户,看看通过混淆可以解决哪些问题。




1

我不得不在最新的rpoject中使用混淆/资源保护,并发现Crypto Obfuscator是一个很好用且易于使用的工具。序列化问题仅是此工具中的设置问题。


@logicnp,这是您在该线程中认可该产品的第二篇文章。如果您与该产品的开发者有关系,请透露。
H2ONaCl

抱歉,但de4dot可以对此进行混淆。我建议使用ConfuserEx
newbieguy

1

有一个很好的开源版本叫做Obfuscar。似乎工作正常。类型,属性,字段,方法可以排除。原始文件位于:https : //code.google.com/p/obfuscar/,但是由于它似乎不再更新了


今天我看了一下-请注意我的评论日期!-开始有点麻烦。我还浪费了大部分时间来尝试使用.pfx文件重新签名程序集。它引发了一个难以理解的,未记录的错误;似乎您只能使用.snk签名。
SteveCinq '18年



0

SmartAssembly很棒,我在大多数项目中都使用过



-1

混淆不是真正的保护。

如果您有.NET Exe文件,则FAR更好解决方案。

我用Themida ,可以说它运作良好。

Themida的唯一缺点是它无法保护.NET Dlls。(它还保护Exe和DLL中的C ++代码)

Themida远比此处提到的混淆器便宜,并且在 盗版 保护方面是最好的市场上。它创建了一个虚拟机,在其中运行了代码的关键部分,并运行了多个线程来检测破解者设置的操作或断点。它将.NET Exe转换为Reflector甚至无法再识别为.NET程序集的东西。

请阅读其网站上的详细说明:http : //www.oreans.com/themida_features.php


-2

我尝试过一种叫做Rummage的产品,它在为您提供一些控制方面做得很好。虽然它缺少Eziriz提供的许多东西,但是Rummage的价格太高了……

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.