我想我对编译有点困惑。NET 字节码到本机代码,或者可能我对最终结果感到困惑。所以,请耐心等待我,因为我试图整理出我认为我理解的东西,这样你就可以帮助我找出我错过了什么。
我想要做的是将用 C # 编写的应用程序编译成普通的本机代码 ,就像我用 C 编写的应用程序那样。我的推理与性能无关,而是与某种程度的保护有关。我知道我的最终目标不是不可能(甚至真的很难)规避,但我只是觉得逆转 x86组装比逆转什么反射器给我更困难。
现在,如果我将 C # 应用程序放入反射器,基本上就可以得到源代码了。通常,当我将非托管的 C/C + + 应用程序放入 IDAPro 并使用 HexRays 反编译器时,我并没有得到相同程度的反编译,我不得不费力地通过 x86反汇编来理解逻辑流。我的理解是,这样伟大的反编译来自反射器,因为应用程序在 MSIL 中,而不是 HexRays 试图反编译的更简洁的本机代码。
我不担心客户机仍然需要。NET 运行时,我没有试图绕过任何这些。我想运行正常的软件混淆程序,如 upx
对我的程序,并做到这一点作为一个。NET 二进制文件失败。
这是我从 这个相关问题的理解,ngen
做我想要的。我试过用 ngen
。但是,在将输出文件从 C:\Windows\assemblies\...\applicationName.ni.exe
目录复制到某个可以双击的位置之后,如果尝试运行它,就会产生一个错误,即它不是“一个有效的 Win32应用程序”。此外,当我将 applicationName.ni.exe
抛入反射器中时,我得到的输出与仅从 applicationName.exe
得到的输出相同。因为 applicationName.ni.exe
应该是本机代码,所以我预计会出错,但它没有。如果这是我应该这样做,为什么反射器仍然给我这样一个伟大的反编译?
所以,再次总结一下我的主要问题: 如何编译我的。NET 程序变成一个本机二进制,反射器不会这么容易反编译?或者保护编写在。NET 语言从新手反向工程师?
如果我需要一个不同的工具,我希望一些免费的,而不是像 代码墙。
谢谢!
更新: 我知道我在寻找的东西可能会限制语言的一些特性,比如反射,但是我认为我可以接受。我的代码中没有一个执行任何明确的 Assembly.Load
调用或类似的任何操作。但是这些不能用 GetProcAddress/LoadLibrary
调用代替吗?