c# - 将 C# 编译为 Native?

标签 c# .net compiler-construction native

我想我对将 .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/

相关文章:

c# - StackExchange.Redis:关于交易的几个问题

c# - Windows 窗体 StatusStrip 控件中的纯图像

compiler-construction - 如何解决语法中的移位减少冲突?

c# - Blazor 服务器端,razor 页面 : Object reference not set to an instance of an object

c# - Entity Framework 7 自引用表返回 null

c# - 如何从 X509Store 加载受密码保护的证书?

c++ - 常量引用优于非常量引用的性能

c++ - 当它在 Visual Studio 2010 中成功编译时,c++ 源代码是否可以移植到 linux

c# - 如何最好地响应开放 HTTP 范围请求

c# - Unity wiki 的 Singleton 是如何工作的?