关于.net:将C#编译为Native?

Compiling C# to Native?

我想我对将.NET字节代码编译为本机代码有些困惑,或者我对最终结果有些困惑。所以请忍受我,因为我试图整理我认为我理解的东西,这样你可以帮助我找出我遗漏了什么。

我想做的是将用C语言编写的应用程序编译成常规的本地代码,就像我用C语言编写的那样。我的推理与性能无关,而是与某种程度的保护有关。我知道我的最终目标并非不可能(甚至真的很难)规避,但我只是觉得反转x86程序集比反转Reflector给我的东西更困难。

现在,如果我把我的C应用程序扔到Reflector中,我基本上会得到我的源代码。通常,当我把我的非托管C/C++应用程序扔进IDAPro并使用HexRays decompiler时,我不会得到同样程度的反编译,我不得不求助于通过x86拆解来理解逻辑流程。据我所知,这样伟大的反编译来自于Reflector,因为应用程序使用的是MSIL,而不是Hexray试图反编译的更简洁的本机代码。

我不担心客户机仍然需要.NET运行时,我并没有试图规避这些问题。我想在我的程序上运行像upx这样的普通软件模糊程序,并将其作为.NET二进制文件执行失败。

从这个相关的问题上,我的理解是,ngen做了我想要的。我试过用ngen。但是,在将输出文件从C:\Windows\assemblies\...\applicationName.ni.exe目录复制到某个我可以双击的地方并尝试运行它之后,会产生一个错误,说明它不是"有效的win32应用程序"。此外,当我把applicationName.ni.exe扔进反射镜时,我得到的输出与仅从applicationName.exe得到的相同。既然applicationName.ni.exe应该是本机代码,我希望reflector出错,但事实并非如此。如果按照我应该这样做的话,为什么reflector仍然给了我如此大的反编译呢?

所以,再次总结一下我的主要问题:我怎样才能将.NET程序编译成一个本机二进制文件,而Reflector就不那么容易反编译了?或者,保护用.NET语言编写的产品免受新手逆向工程师攻击的最佳实践是什么?

如果我需要不同的工具,我更喜欢免费的,而不是像codewall这样的工具。

谢谢!

更新:我明白我正在寻找的可能会限制语言的一些特性,比如反射,但我认为我可以接受。我的代码没有执行任何显式的Assembly.Load调用或任何类似的调用。不过,这些电话难道就不能换成GetProcAddress/LoadLibrary电话吗?


这不是ngen.exe的工作方式。它只是预先运行JIT编译器来生成.ni.exe或.ni.dll模块。该二进制文件不包含元数据,只包含从IL为方法体生成的机器代码。clr仍然必须找到原始程序集。只有这样,它才能确定有一个NGENED映像可用,这样它就可以使用来自它的机器代码,而不是从程序集的IL生成它。

ngen.exe可以加快应用程序的热启动时间,仅此而已。

我对任何有兴趣分解我的程序集的人通常的建议是将它们指向sourceforge.net。它有兆字节的源代码,由程序员编写和维护,通常比我好。有时甚至有好的评论。如果你的模糊器不好用,那就去买个更好的。有很多。


我刚刚在VS2015&Windows 8.1上验证了.NET本机(如果配置正确,请检查.proj以验证)并为特定体系结构进行构建(可能会造成过度破坏,尚未验证),这将生成一个本机文件,使您能够通过DotPeek(f来自JetBrains的ree.net解压器)。


昨天,在Build 2014上,微软发布了.NET Native。根据常见问题,"…最初,我们将重点放在.NET本机的Windows应用商店应用程序上。从长远来看,我们将继续改进所有.NET应用程序的本机编译。"


如果您想保护代码,通常使用模糊器。Dotfuscator与Reflector进行了一段时间的军备竞赛,我们在产品上使用它。然而,在实践中,熟练的人很容易阅读模糊的代码。

编译到本机代码会破坏拥有托管语言的目的。主要的好处是允许目标运行时将IL JIT到对目标CPU最有利的地方。如果您不想这样做,您可以在mono中使用类似提前时间选项的选项。


Spoon(以前叫Xenocode)的产品可能符合您的需求。我们将它用于基于WPF的安装程序UI,这样就不必为了加载安装程序本身而启动.NET。


ngen添加本机代码,但不删除msil。因此,在MSIL上操作的任何工具仍然可以工作。您还需要它来进行反射,这对于真正的本机编译器来说是非常困难的。


这是一个免费的模糊器,安静好:埃茨弗西卡特


这最终可以使用Microsoft的.NET本机编译器。

It automatically compiles the release version of apps that are written in managed code (C# or Visual Basic) and that target the .NET Framework and Windows 10 to native code.

?Your apps will provide the superior performance of native code.

?You can continue to program in C# or Visual Basic.

?You can continue to take advantage of the resources provided by the .NET Framework, including its class library, automatic memory management and garbage collection, and exception handling.

For users of your apps, .NET Native offers these advantages:

?Fast execution times

?Consistently speedy startup times

?Low deployment and update costs

?Optimized app memory usage

But .NET Native involves more than a compilation to native code. It transforms the way that .NET Framework apps are built and executed. In particular:

?During precompilation, required portions of the .NET Framework are statically linked into your app. This allows the app to run with app-local libraries of the .NET Framework, and the compiler to perform global analysis to deliver performance wins. As a result, apps launch consistently faster even after .NET Framework updates.

?The .NET Native runtime is optimized for static precompilation and thus is able to offer superior performance. At the same time, it retains the core reflection features that developers find so productive.

?.NET Native uses the same back end as the C++ compiler, which is optimized for static precompilation scenarios.

https://msdn.microsoft.com/en-us/library/dn584397(v=vs.110).aspx

这仅适用于vs.net 2015。


我可能会退后一步,问你为什么要找这种保护。我不是想说你不需要保护,但我认为这是值得理解的动机。

例如,如果您需要保护,因为您的系统中有一个算法,如果有人对其进行反向工程,那么对安全性将是毁灭性的,那么您可能需要考虑另一种方法。这意味着算法中有一个缺陷,任何模糊或本机编译都不会对您有所帮助。

如果是IP的问题,那么我认为模糊可能是您在这里的最佳方法。这有点像把门锁在你的门上。有人可以打开门锁进去,但他们是故意这样做的,而不是仅仅走在门上。


这可以使用IL2CPU编译器。IL2CPU是由制造Cosmos(C开源管理操作系统)的人开发的,只能通过下载Cosmos获得。il2cpu生成可以通过nasm编译的asm文件(其他一些汇编程序可能工作,但最好使用nasm)。il2cpu的唯一问题是它内置于cosmos项目中,很难让它自己运行。


下面是一个使用CoreRT的教程,介绍如何将C#项目编译为本机代码。

注:我还不得不对所有要工作的事情发表评论:

1
<!--  -->

输出大致为4MB大小的可执行文件:

></P><P>事实上,<wyn>.NET</wyn>解压程序无法读取代码,<wyn>IDA Pro</wyn>将其识别为本机代码。</P></p>
<p><center> <script src=