我认为我对将.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
不管怎么说,那些只是被电话取代了吗?
这不是ngen.exe的工作原理.它只是预先运行JIT编译器来生成.ni.exe或.ni.dll模块.该二进制文件不包含元数据,只包含IL为方法体生成的机器代码.CLR仍然必须找到原始程序集.只有这样才能确定有一个可用的图像,以便它可以使用它的机器代码而不是从程序集的IL生成它.
Ngen.exe加快了应用程序的温暖启动时间,就是这样.
我对任何可能有兴趣拆卸我的程序集的人的通常建议是将它们指向sourceforge.net.它有数TB的源代码,由程序员编写和维护,通常比我好.有时即使有好评.如果您的混淆器不能正常工作,那就去购买更好的混淆器.有许多.
我刚刚在VS2015和Windows 8.1上验证了 .Net Native(正确配置后,检查.proj进行验证)并构建特定体系结构(可能过度,未经验证),将生成一个本机文件,它将为您提供" 更难以逆向工程 "你正在寻找的代码,因为我无法通过DotPeek读取.dll(来自JetBrains的免费.Net反编译器).
昨天,在Build 2014,微软宣布推出.NET Native.根据常见问题解答,"......最初,我们专注于使用.NET Native的Windows应用商店应用程序.从长远来看,我们将继续改进所有.NET应用程序的本机编译."
如果您想保护您的代码,混淆器就是典型的方法. Dotfuscator与反射器进行了一段时间的军备竞赛,我们在我们的产品上使用它.然而,在实践中,技术人员可以容易地读取混淆的代码.
编译为本机代码会破坏托管语言的目的.主要好处是允许目标运行时将IL JIT转换为最适合目标CPU的东西.如果您不想要,可以使用单声道中的提前选项.
Spoon(以前的Xenocode)有一款可能满足您需求的产品.我们将它用于基于WPF的安装程序UI,因此我们不必引导.net以便加载安装程序本身.
NGEN添加了本机代码,但它不会删除MSIL.因此,在MSIL上运行的任何工具仍然可以工作.你还需要这个用于反射,这对于真正的本机编译器来说是非常困难的.
这是一个免费的混淆器,它很安静: eazfuscator
最终可以使用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中可用。