编译 C # 到原生?

我想我对编译有点困惑。NET 字节码到本机代码,或者可能我对最终结果感到困惑。所以,请耐心等待我,因为我试图整理出我认为我理解的东西,这样你就可以帮助我找出我错过了什么。

我想要做的是将用 C # 编写的应用程序编译成普通的本机代码 ,就像我用 C 编写的应用程序那样。我的推理与性能无关,而是与某种程度的保护有关。我知道我的最终目标不是不可能(甚至真的很难)规避,但我只是觉得逆转 x86组装比逆转什么反射器给我更困难。

现在,如果我将 C # 应用程序放入反射器,基本上就可以得到源代码了。通常,当我将非托管的 C/C + + 应用程序放入 IDAPro 并使用 HexRays 反编译器时,我并没有得到相同程度的反编译,我不得不费力地通过 x86反汇编来理解逻辑流。我的理解是,这样伟大的反编译来自反射器,因为应用程序在 MSIL 中,而不是 HexRays 试图反编译的更简洁的本机代码。

我不担心客户机仍然需要。NET 运行时,我没有试图绕过任何这些。我想运行正常的软件混淆程序,如 upx对我的程序,并做到这一点作为一个。NET 二进制文件失败。

这是我从 这个相关问题的理解,ngen做我想要的。我试过用 ngen。但是,在将输出文件从 C:\Windows\assemblies\...\applicationName.ni.exe目录复制到某个可以双击的位置之后,如果尝试运行它,就会产生一个错误,即它不是“一个有效的 Win32应用程序”。此外,当我将 applicationName.ni.exe抛入反射器中时,我得到的输出与仅从 applicationName.exe得到的输出相同。因为 applicationName.ni.exe应该是本机代码,所以我预计会出错,但它没有。如果这是我应该这样做,为什么反射器仍然给我这样一个伟大的反编译?

所以,再次总结一下我的主要问题: 如何编译我的。NET 程序变成一个本机二进制,反射器不会这么容易反编译?或者保护编写在。NET 语言从新手反向工程师?

如果我需要一个不同的工具,我希望一些免费的,而不是像 代码墙

谢谢!

更新: 我知道我在寻找的东西可能会限制语言的一些特性,比如反射,但是我认为我可以接受。我的代码中没有一个执行任何明确的 Assembly.Load调用或类似的任何操作。但是这些不能用 GetProcAddress/LoadLibrary调用代替吗?

67347 次浏览

如果您想要保护您的代码,模糊处理器是典型的方法。Dotfuscator一直在与反射器的军备竞赛一段时间,我们使用它在我们的产品。然而,在实践中,一个熟练的人可以很容易地阅读模糊的代码。

编译为本机代码会破坏托管语言的目的。主要的好处是允许目标运行时将 IL JIT 到最适合目标 CPU 的位置。如果需要其他选项,可以使用类似于 单声道提前选项的工具。

NGEN 添加了本机代码,但是没有删除 MSIL。因此,在 MSIL 上操作的任何工具仍然可以工作。反射也需要这样做,这对于真正的本机编译器来说是非常困难的。

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

Exe 可以加快应用程序的启动时间,仅此而已。

对于任何可能有兴趣分解我的程序集的人,我通常的建议是将它们指向 sourceforge.net。它有大量的源代码,由通常比我更好的程序员编写和维护。有时甚至是好评。如果你的模糊处理器不能很好地工作,那么就四处寻找一个更好的。有很多。

Spoon (以前是 Xenocode)具有 适合你需要的产品。我们使用它作为一个基于 WPF 的安装程序用户界面,所以我们不必引导。Net 来加载安装程序本身。

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

例如,如果您想要保护,因为您的系统中有一个算法,如果有人对其进行逆向工程,那么它将对安全性造成破坏,那么您可能需要考虑一种不同的方法。这意味着算法存在缺陷,任何模糊处理或本地编译都无法帮助您解决这个问题。

如果是知识产权的问题,那么我认为混淆可能是你在这里的最佳方法。这有点像给你的门上锁。有人可以撬开锁进来,但他们是故意这样做的,而不是直接走进门。

这是一个免费的模糊处理器,非常好: Eazfuscator

使用 IL2CPU 编译器可以做到这一点。IL2CPU 是由制造 COSMOS (C # 开源管理操作系统)的同一批人开发的,只有通过下载 mos 才能使用。IL2CPU 生成可以通过 Nasm 编译的 ASM 文件(其他一些汇编程序也许可以工作,但最好使用 Nasm)。IL2CPU 的唯一问题是它是内置在宇宙项目中的,很难让它自己运行。

昨天,在 构建2014大会上,微软宣布了 .NET 原生。根据 常见问题,“ ... 最初,我们关注的是 Windows 应用程序商店与。NET 原生。从长远来看,我们将继续改进针对所有用户的本地编译。NET 应用程序。”

我只是 有效 。网络本地VS2015视窗8.1(当配置正确,检查。验证)和构建一个特定的架构(可能是过度的,没有验证) ,将生成一个本机文件,这将给你“ 难以逆向工程”代码,你正在寻找,我是无法读取 。 dll通过 DotPeek(免费)。来自 JetBrains 的 Net 反编译器)。

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

它自动编译用托管代码(C # 或 VisualBasic)编写的应用程序的发布版本,这些应用程序的目标是。NETFramework 和 Windows10转换为本机代码。

..

•你的应用程序将提供优秀的本地代码性能。

•您可以继续使用 C # 或 VisualBasic 编程。

‧你可继续利用。NET Framework,包括其类库、自动内存管理和垃圾收集以及异常处理。

对于应用程序的用户来说,.NET 本机提供了以下优势:

•快速执行时间

•始终如一的快速启动时间

* 部署和更新费用低

•优化应用程序内存使用

但是。NET 原生代码涉及的不仅仅是对原生代码的编译。它改变了。NET 框架应用程序的生成和执行。特别是:

‧在预编译期间,必需的。NET 框架静态链接到您的应用程序。这允许应用程序使用。NET 框架,编译器执行全局分析,以提供性能优胜。因此,应用程序的启动始终更快,甚至在。NET 框架更新。

‧。NET 本机运行时针对静态预编译进行了优化,因此能够提供更好的性能。同时,它保留了开发人员认为非常有效的核心反射特性。

.NET 本机使用与 C + + 编译器相同的后端,该编译器针对静态预编译场景进行了优化。

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

这只能在 VS.NET 2015中使用。

其他答案提到了微软的 .NET本地编译器,但没有告诉你如何做到这一点。

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

注: 为了让一切顺利进行,我还不得不注释掉下面这句话:

<!-- <add key="helloworld" value="https://api.helloworld.org/v3/index.json" /> -->

输出是一个大约 4MB大小的可执行文件:

实际上,使用 .NET反编译器,代码不再具有可读性,而 IDA Pro(本机代码反汇编程序)将其识别为本机代码。