我想我对将 .NET 字节代码编译为 native 代码有些困惑,或者我可能对最终结果感到困惑。因此,请耐心等待我尝试整理我认为我理解的内容,以便您可以帮助我找出我遗漏的内容。
我想做的是将我用 C# 编写的应用程序编译成常规的 native 代码,就像我用 C 编写的一样。我的推理与性能无关,而是具有一定程度的保护。我明白我的最终目标并非不可能(甚至真的那么难)规避,但我只是觉得逆向 x86 汇编比逆向 Reflector 给我的东西更难。
现在,如果我将我的 C# 应用程序放入 Reflector,我基本上可以取回我的源代码。通常,当我将我的非托管 C/C++ 应用程序放入 IDAPro 并使用 HexRays 反编译器时,我并没有完全得到相同程度的反编译,我不得不求助于 x86 反汇编来理解逻辑流程。据我了解,如此出色的反编译来自 Reflector,因为应用程序是在 MSIL 中,而不是 HexRays 尝试反编译的更简洁的 native 代码。
我不担心客户端机器仍然需要 .NET 运行时,我不会试图规避这些。我想在我的程序上运行普通的软件混淆程序,如 upx
,但作为 .NET 二进制文件失败。
这是我对this的理解ngen
做我想做的相关问题。我试过使用 ngen
。但是将输出文件从 C:\Windows\assemblies\...\applicationName.ni.exe
目录复制到我可以双击的地方后,尝试运行它会产生错误不是“有效的 Win32 应用程序”。此外,当我将 applicationName.ni.exe
放入 Reflector 时,我得到的输出与仅从 applicationName.exe
得到的输出相同。由于 applicationName.ni.exe
应该是 native 代码,我预计 Reflector 会出错,但事实并非如此。如果这是我应该做的,为什么 Reflector 仍然给我这么好的反编译?
所以,再次总结一下我的主要问题:如何将我的 .NET 程序编译成 Reflector 不会轻易反编译的 native 二进制文件?或者有哪些最佳实践可以保护用 .NET 语言编写的产品免受新手逆向工程师的攻击?
如果我需要一个不同的工具,我更喜欢免费的东西而不是像 Codewall 这样的东西.
谢谢!
更新:我知道我正在寻找的东西可能会限制该语言的某些功能,例如反射,但我认为我可以接受。我的代码都没有执行任何显式 Assembly.Load
调用或任何类似的操作。但总不能将它们替换为 GetProcAddress/LoadLibrary
调用吗?
最佳答案
这不是 ngen.exe 的工作原理。它只是预先运行 JIT 编译器来生成 .ni.exe 或 .ni.dll 模块。该二进制文件不包含元数据,仅包含从 IL 为方法体生成的机器代码。 CLR 仍然必须找到原始程序集。只有这样它才能确定是否有可用的 ngen-ed 图像,以便它可以使用其中的机器代码,而不是从程序集的 IL 中生成它。
Ngen.exe 可以加快应用的热启动时间,仅此而已。
对于可能对反汇编我的程序集感兴趣的任何人,我通常的建议是将他们指向 sourceforge.net。它有数 TB 的源代码,由通常比我优秀的程序员编写和维护。有时甚至有很好的评论。如果您的混淆器效果不佳,请四处寻找更好的混淆器。有很多。
关于c# - 将 C# 编译为 Native?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1921656/