将C#编译为Native?

我想我对编译.NET字节码到本机代码有些困惑,或者我对最终结果感到困惑。 所以请耐心等待,因为我试图理清我认为理解的事情,所以你可以帮我弄清楚我错过了什么。

我想要做的就是用C#编写我的应用程序,然后编译成普通的本地代码,就像我用C写的那样。我的推理与性能无关,而是有一定程度的保护。 我知道我的最终目标并不是不可能的(甚至是真的很难),但是我只是想倒转x86程序集比倒转Reflector给我更困难。

现在,如果我把我的C#应用​​程序放入reflection器,我基本上得到我的源代码。 通常,当我将非托pipeC / C ++应用程序投入到IDAPro中并使用HexRays反编译器时,我并不完全获得相同的反编译程度,我不得不通过x86反汇编来了解逻辑stream程。 这是我的理解,这样伟大的反编译来自reflection器由于应用程序在MSIL而不是更简洁的本机代码,HexRays尝试反编译。

我不担心仍然需要.NET运行时的客户机,我不想绕过这些。 我想在我的程序上运行正常的软件混淆程序(如upx ,并将其作为.NET二进制文件执行失败。

这是我从这个相关的问题的理解, ngen做我想要的。 我试过使用ngen 。 但是,将输出文件从C:\Windows\assemblies\...\applicationName.ni.exe目录复制到某处后,我可以双击,并尝试运行它会产生一个关于它不是“有效的Win32应用程序”。 此外,当我将applicationName.ni.exe折腾到Reflector中时,我得到的输出与我从applicationName.exe得到的输出相同。 由于applicationName.ni.exe应该是本地代码,我期望Reflector出错,但是没有。 如果这是我应该这样做的方式,为什么Reflector仍然给我这样一个伟大的反编译?

所以,只是总结我的主要问题:我怎样才能编译我的.NET程序到一个本地的二进制reflection器不会这么容易反编译? 或者,用新手逆向工程师来保护使用.NET语言编写的产品的最佳做法是什么?

如果我需要一个不同的工具,我更喜欢免费的东西,而不是Codewall 。

谢谢!

更新:我明白,我正在寻找可能会限制像reflection这样的语言的一些function,但我认为我很好。 我的代码没有任何显式的Assembly.Load调用或任何types的。 但是不能用GetProcAddress/LoadLibrary调用呢?

我只是在VS2015Windows 8.1validation了 .Net Native (当configuration正确时,检查.proj来validation)并为特定的架构(可能是矫枉过正,没有validation)生成一个本地文件,它会给你“ 更难以反向工程 “的代码,你正在寻找哪些我无法通过DotPeek (从JetBrains的免费.Net反编译)读取.dll

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

Ngen.exe加快了您的应用程序的热启动时间,就这些。

我对任何可能有兴趣拆解我的程序集的build议都是指向sourceforge.net。 它有TB级的源代码,由程序员编写和维护,通常比我好。 有时甚至有好评。 如果你的混淆器不能很好的工作,那就去逛一逛再买一个更好的。 有许多。

昨天,在Build 2014上 ,微软发布了.NET Native 。 根据常见问题解答 ,“最初,我们将重点放在使用.NET Native的Windowsapp store应用,从长远来看,我们将继续改善所有.NET应用的本地编译。”

如果你想保护你的代码,一个混淆器是典型的方法。 Dotfuscator一直在与reflection器的军备竞赛一段时间,我们使用它在我们的产品。 然而,在实践中,熟练的人可以容易地阅读混淆的代码。

编译为本地代码会破坏拥有托pipe语言的目的。 主要的好处是允许目标运行时间将IL快速地转换为目标CPU最适合的东西。 如果你想要的话,你可以使用单声道的提前选项 。

勺子(以前Xenocode)有一个产品,可能适合您的需求 。 我们将其用于基于WPF的安装程序UI,因此我们无需引导.net即可加载安装程序本身。

NGEN添加本地代码,但不会删除MSIL。 因此,在MSIL上运行的任何工具都可以工作。 你也需要这个reflection,对于一个真正的本地编译器来说是非常困难的。

这是一个免费的混淆器,这是一个安静的好处: eazfuscator

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

例如,如果你需要保护,因为你的系统中有一个algorithm,如果有人对它进行反向devise,会对安全造成破坏,那么你可能需要考虑一个不同的方法。 这意味着algorithm中存在一个缺陷,不会有大量的混淆或本机编译将帮助您。

如果是知识产权问题,那么我认为混淆可能是你最好的方法。 这有点像把门锁上。 有人可以破门而入,但他们故意这样做,而不是走在门口。

这终于可以使用微软的.NET Native编译器

它会自动编译以托pipe代码(C#或Visual Basic)编写的应用程序的发行版本,并将.NET Framework和Windows 10作为本机代码。

..

•您的应用程序将提供本机代码的卓越性能。

•您可以继续使用C#或Visual Basic进行编程。

•您可以继续利用.NET Framework提供的资源,包括其类库,自动内存pipe理和垃圾回收以及exception处理。

对于您的应用程序的用户,.NET Native提供了这些优势:

•执行时间快

•持续快速的启动时间

•低部署和更新成本

•优化应用程序内存使用情况

但是,.NET Native涉及的不仅仅是本地代码的编译。 它转换了.NET Framework应用程序的构build和执行方式。 尤其是:

•在预编译过程中,.NET Framework的必需部分静态链接到您的应用程序中。 这允许应用程序与.NET Framework的应用程序本地库一起运行,并且编译器执行全局分析以提供性能优势。 因此,甚至在.NET Framework更新之后,应用程序的启动速度也会更快。

.NET Native运行时为静态预编译进行了优化,因此能够提供卓越的性能。 同时,它保留了开发者如此高效的核心reflectionfunction。

•.NET Native使用与C ++编译器相同的后端,针对静态预编译scheme进行了优化。

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

这只适用于VS.NET 2015。

这可以使用IL2CPU编译器。 IL2CPU是由开发COSMOS(C#开放源代码pipe理操作系统)的人开发的,只能通过下载宇宙来使用。 IL2CPU生成可以通过Nasm编译的ASM文件(其他一些汇编程序也可以工作,但最好使用nasm)。 IL2CPU唯一的问题在于它是build立在宇宙计划之上的,它很难独立运行。