我认为我对将.NET字节码编译为本机代码感到有些困惑,或者我对最终结果感到困惑。因此,在我尝试整理我认为我理解的内容时,请多多包涵,以便您可以帮助我找出我所缺少的内容。
我想做的是将用C#编写的应用程序编译为常规的本机代码,就像用C编写时那样。我的推理与性能无关,而与某种程度的保护无关。我知道我的最终目标并非不可能(甚至确实如此困难),但是我只是觉得反转x86汇编比反转Reflector给我的东西更困难。
现在,如果将我的C#应用程序扔到Reflector中,我基本上会得到我的源代码。通常,当我将不受管理的C / C ++应用程序放入IDAPro并使用HexRays反编译器时,我得到的反编译程度并不太相同,我不得不诉诸于x86反汇编以了解逻辑流程。我的理解是,如此出色的反编译来自Reflector,这是因为应用程序位于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程序编译为Reflector不太容易反编译的本机二进制文件?或有什么最佳实践来保护以.NET语言编写的产品免受新手反向工程师的侵害?
如果我需要其他工具,我会选择免费的东西,而不是像Codewall这样的东西。
谢谢!
更新:我了解我在寻找的内容可能会限制该语言的某些功能,例如反射,但是我认为可以。我的代码都没有进行任何显式Assembly.Load
调用或任何类似的操作。但是,无论如何都不能将它们替换为GetProcAddress/LoadLibrary
通话吗?