我们使用什么来保护.NET代码免受逆向工程的侵害?
一段时间以来,我们一直在使用一种称为CodeVeil的工具。我只是想知道是否还有更好的选择。
编辑:在更多的人误解这个问题之前,我知道坚定的饼干可能能够击败所有这些工具。不过我不太在乎他们。这些工具只是为了阻止"随意破解者",并阻止人们窃取我们公司的IP。如果他们足够优秀,可以通过一个不错的工具,那么他们可能对窃取我们糟糕的代码不感兴趣:-P
解决方案
我听说Obfusticator很好。它用于.Net Reflector。
老实说,除了对我们提到的工具进行一些迷惑之外,我们无能为力。 .NET只是脚本语言之上的一步,只是脚本命令是二进制的,称为IL。这有点简化,但这与现实相差不远。使用Reflection编写的任何好的程序都可以用来对.NET应用程序进行逆向工程,或者,如果我们有足够的知识,可以使用好的十六进制编辑器。
我对这些工具的价值不满意。没有任何一种技术解决方案能够比许可证,商标,专利,版权等法律保护措施更好地防止逆向工程...
.NET确实是大型透明源运动。取而代之的是,我们围绕IP制定使用条款,例如许可和版权,这要好得多。
有几种用于混淆的流行工具,包括Dotfuscation,它具有Visual Studio 2005和2008附带的"轻型"版本。它们具有的Pro版本不仅具有重命名变量和函数名称的功能。但是,代码仍然可见,只是对其进行了一点点加扰,以使其更难于阅读和理解软件的逻辑流程。
另一种技术是使用其他程序来对程序进行加密,然后在运行时对其进行解密。但是,这也不是完美的解决方案。实际上,据我所知,没有完美的解决方案能够阻止坚定的工程师对软件进行逆向工程,只要花费了足够的时间和精力。
真正的结果是确定保护级别,这将足以使说服临时黑客的工作变得十分困难,并使反向工程变得尽可能昂贵,因此至少反向工程要付出时间或者金钱的代价。金钱,或者理想的情况是两者兼而有之。逆向工程成本越昂贵,愿意付出努力的人员数量就越少。这就是混淆的重点。
有人认为使用像C ++编译器这样的编译器可以编译为本机代码可以防止这种反向工程,但事实并非如此。一个好的反汇编程序甚至可以对纯二进制可执行文件进行逆向工程,因此,不存在完美的解决方案。如果计算机可以读取并执行它,则可以扫描和跟踪计算机正在使用的内存,而无需进行所有试图加密,混淆或者使代码脱离确定的工程师之手的任何尝试。
编译.NET应用程序将导致输出程序集中包含大量的元信息。这些信息使重构非常接近原始代码的内容变得非常容易。一个很好的免费工具,称为.NET Reflector,可以用来做到这一点,并且是一种检查基类库工作方式的流行方法。下载并使用该工具查看程序集内容的重建C#/ VB.NET版本。
如果我们是一家商业组织,那么我们不希望人们发现花费大量精力来编写代码很容易。一种流行的方法是使用混淆来扰乱内容,其方式不会改变其运行方式,但会使人难以理解。混淆使用诸如重命名变量和方法之类的技术。确定方法" a1"," a2"," a3"的目的比原始的" GetName"," UpdateInterestRate"和" SetNewPassword"困难得多。
因此,使用混淆会使人们更难理解代码在做什么以及它使用的算法。但是,这不会使它成为不可能。愿意花时间处理二进制文件的汇编专家仍然可以理解C ++代码,而MSIL专家最终可以解决混淆的代码。但这增加了障碍,以至于很少有人会去尝试。
Xenocode Postbuild取得了很多成功。该工具可以混淆.NET程序集,保护Reflector的反汇编,将.NET程序集组合成一个可执行文件("虚拟化"),甚至可以将.NET应用程序编译为不需要安装.NET运行时的独立可执行文件。
很抱歉要复活一个旧帖子,但是我认为Eziriz的.NET Reactor表现出色。
实际上,我自己在所有.net应用程序中都使用了它,并且显然没有可用的工具来反编译受.net反应器保护的程序。可以在那里的信息页面http://www.eziriz.com/dotnet_reactor.htm上找到更多详细信息。使用试用版和.net反射器对其进行测试,我们可以自己看到。
另一个是Crypto Obfuscator,它比其他加密货币更实惠,并且具有多种混淆和保护方法,可以阻止因果关系和不太偶然的黑客。