当前位置:  开发笔记 > 编程语言 > 正文

将C#编译为Native?

如何解决《将C#编译为Native?》经验,为你挑选了8个好方法。

我认为我对将.NET字节码编译为本机代码感到困惑,或者我对最终结果感到困惑.因此,当我试图理解我认为理解的东西时,请耐心等待,这样你就可以帮我找出我所缺少的东西.

我想要做的是将我用C#编写的应用程序编译成普通的本机代码,就像我用C语言编写的那样.我的推理与性能无关,而是有一定程度的保护.我明白我的最终目标并非不可能(甚至真的那么难)规避,但我只是觉得逆转x86汇编比反转Reflector给我的更难.

现在,如果我把我的C#应用​​程序扔进Reflector,我基本上得到了我的源代码.通常,当我将非托管C/C++应用程序放入IDAPro并使用HexRays反编译器时,我不能完全获得相同程度的反编译,我不得不求助于通过x86反汇编来理解逻辑流程.我的理解是,由于应用程序位于MSIL而不是HexRays尝试反编译的更简洁的本机代码,因此这种出色的反编译来自Reflector.

我不担心客户端机器仍然需要.NET运行时,我不是想绕过任何一个.我想upx在我的程序上运行正常的软件混淆程序,并且以.NET二进制文件的形式运行失败.

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

所以,再次总结一下我的主要问题:如何将我的.NET程序编译成一个原生二进制文件,Reflector不会那么容易反编译?或者,从新手反向工程师那里保护用.NET语言编写的产品的最佳实践是什么?

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

谢谢!

更新:我明白我正在寻找的可能会限制像Reflection这样的语言的某些功能,但我认为我很好.我的代码都没有进行任何显式Assembly.Load调用或任何类型的调用.但GetProcAddress/LoadLibrary不管怎么说,那些只是被电话取代了吗?



1> Hans Passant..:

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

Ngen.exe加快了应用程序的温暖启动时间,就是这样.

我对任何可能有兴趣拆卸我的程序集的人的通常建议是将它们指向sourceforge.net.它有数TB的源代码,由程序员编写和维护,通常比我好.有时即使有好评.如果您的混淆器不能正常工作,那就去购买更好的混淆器.有许多.


谢谢!这正是我正在寻找关于'ngen`正在做什么的解释.你对一个好的,免费的混淆器有什么建议吗?

2> 小智..:

我刚刚在VS2015Windows 8.1验证了 .Net Native(正确配置后,检查.proj进行验证)并构建特定体系结构(可能过度,未经验证),将生成一个本机文件,它将为您提供" 更难以逆向工程 "你正在寻找的代码,因为我无法通过DotPeek读取.dll(来自JetBrains的免费.Net反编译器).


大!六年后,我的梦想终于实现了.;)
请注意,这适用于Windows 10 Universal应用程序,而不是WPF或WinForms.即,Windows 8.1及以上版本.
@EricEskildsen,所以你无法为WPF/WinForms编译为native?

3> Ðаn..:

昨天,在Build 2014,微软宣布推出.NET Native.根据常见问题解答,"......最初,我们专注于使用.NET Native的Windows应用商店应用程序.从长远来看,我们将继续改进所有.NET应用程序的本机编译."



4> plinth..:

如果您想保护您的代码,混淆器就是典型的方法. Dotfuscator与反射器进行了一段时间的军备竞赛,我们在我们的产品上使用它.然而,在实践中,技术人员可以容易地读取混淆的代码.

编译为本机代码会破坏托管语言的目的.主要好处是允许目标运行时将IL JIT转换为最适合目标CPU的东西.如果您不想要,可以使用单声道中的提前选项.


"编译为本机代码会破坏使用托管语言的目的" - 这不是真的.

5> dkackman..:

Spoon(以前的Xenocode)有一款可能满足您需求的产品.我们将它用于基于WPF的安装程序UI,因此我们不必引导.net以便加载安装程序本身.



6> MSalters..:

NGEN添加了本机代码,但它不会删除MSIL.因此,在MSIL上运行的任何工具仍然可以工作.你还需要这个用于反射,这对于真正的本机编译器来说是非常困难的.



7> 小智..:

这是一个免费的混淆器,它很安静: eazfuscator


免费使用30天.*

8> 小智..:

最终可以使用Microsoft的.NET Native编译器

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

..

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

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

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

对于您的应用程序用户,.NET Native具有以下优点:

•快速执行时间

•持续快速的启动时间

•低部署和更新成本

•优化的应用程序内存使用率

但是.NET Native不仅仅涉及对本机代码的编译。它改变了.NET Framework应用程序的构建和执行方式。特别是:

•在预编译期间,.NET Framework的必需部分已静态链接到您的应用程序中。这使该应用程序可以与.NET Framework的应用程序本地库一起运行,并且编译器可以执行全局分析以实现性能双赢。结果,即使.NET Framework更新后,应用程序的启动速度也始终保持一致。

•.NET Native运行时针对静态预编译进行了优化,因此能够提供卓越的性能。同时,它保留了开发人员发现如此高效的核心反射功能。

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

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

仅在VS.NET 2015中可用。

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有