我有点困惑如何将.NET字节码编译成本地代码,或者说我对最终结果感到困惑。请您耐心等待,我会尽力梳理我所理解的内容,让您帮忙找出我可能遗漏的部分。
我想要做的是将用C#编写的应用程序编译为常规本地代码,就像我如果用C语言编写一样。我的理由与性能无关,而与一定程度的保护有关。我知道我的最终目标不是不可能(甚至并不是很困难)被绕过,但我只是觉得反汇编x86汇编比反汇编Reflector给我的内容更加困难。
现在,如果我将我的C#应用程序放入Reflector中,我基本上会得到我的源代码。通常情况下,当我将未编译的C/C++应用程序放入IDAPro中并使用HexRays反编译器时,我没有完全得到相同程度的反编译,并且必须沉浸在x86反汇编中以理解逻辑流程。据我所知,这种优秀的反编译是因为应用程序处于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
调用吗?