我想我对编译有些困惑.NET字节码转换为本机代码,或者我对最终结果感到困惑.所以,请容忍我,因为我试图整理我认为我理解的东西,这样你就可以帮助我找出我遗漏了什么.
如果我用C语言编写,我会得到What I'd like to do is compile my application written in C# down to regular native code.我的推理与性能无关,而是与某种程度的保护无关.我知道我的最终目标并不是不可能绕过的(甚至不是真的那么难),但我只是觉得颠倒x86程序集比颠倒Reflector提供给我的东西更难.
现在,如果我把我的C#应用程序扔进Reflector,我基本上就能拿回我的源代码.通常,当我将我的非托管C/C++应用程序放入IDAPro并使用HexRays反编译器时,我并没有得到同样程度的反编译,我必须通过x86反编译来理解逻辑流程.据我所知,如此出色的反编译来自Reflector,因为应用程序在MSIL中,而不是HexRays试图反编译的更简洁的本机代码.
我不担心客户机仍然需要.NET运行时,我并没有试图回避任何问题.我想在我的程序上运行正常的软件模糊处理程序,比如upx
,并作为一个整体来做.NET二进制文件失败.
根据我对this个相关问题的理解,ngen
符合我的要求.我试过用ngen
.但在将输出文件从C:\Windows\assemblies\...\applicationName.ni.exe
目录复制到我可以双击的地方,并试图运行它之后,会产生一个错误,即它不是"有效的Win32应用程序".此外,当我把applicationName.ni.exe
投进反射器时,我得到的输出和applicationName.exe
的输出一样.既然applicationName.ni.exe
应该是本机代码,我希望Reflector会出错,但它没有.如果这是我应该做的,为什么Reflector仍然给我这么好的反编译?
所以,我想再次总结一下我的主要问题:如何编译我的.NET程序转换为本机二进制文件,而Reflector不会如此轻松地进行反编译?或者是什么样的保护产品的最佳实践.来自新手逆向工程师的NET语言?
如果我需要一个不同的工具,我更喜欢免费的,而不是像Codewall.
谢谢
UPDATE:我明白我所寻找的可能会限制语言的一些特性,比如反射,但我认为我可以接受.我的代码中没有一个执行任何显式的Assembly.Load
次调用或类似的操作.但这些电话不能换成GetProcAddress/LoadLibrary
个吗?