【发布时间】:2009-12-17 13:03:47
【问题描述】:
我想我对将 .NET 字节码编译为本机代码感到有些困惑,或者我对最终结果感到困惑。因此,请耐心等待我尝试整理我认为我理解的内容,以便您帮助我弄清楚我缺少什么。
我想做的是将我用 C# 编写的应用程序编译成常规的本机代码,就像我用 C 编写的那样。我的推理与性能无关,而是带有某种程度的保护。我知道我的最终目标并非不可能(甚至真的那么难以规避),但我只是觉得逆转 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 扔进Reflector 时,我得到的输出与我从applicationName.exe 得到的输出相同。由于applicationName.ni.exe 应该是本机代码,我预计 Reflector 会出错,但事实并非如此。如果这是我应该这样做的方式,为什么 Reflector 仍然给我这么好的反编译?
所以,再次总结一下我的主要问题:如何将我的 .NET 程序编译成 Reflector 不容易反编译的本机二进制文件?或者有哪些最佳实践可以保护用 .NET 语言编写的产品免受新手逆向工程师的攻击?
如果我需要不同的工具,我更喜欢免费的,而不是像 Codewall 这样的工具。
谢谢!
更新:我知道我正在寻找的内容可能会限制语言的某些功能,例如反射,但我认为我可以接受。我的代码都没有做任何明确的Assembly.Load 调用或任何类似的调用。但是这些就不能用GetProcAddress/LoadLibrary 电话代替吗?
【问题讨论】:
-
在代码保护器/障碍物上,如果您不是一家软件开发公司,它们中的大多数都是商业的,而且价格适中,但是即使是顶级的商业公司也可能会遇到很多问题,您的代码实际上在它完成后就可以正常工作是的。
-
我需要一个类似的功能,也是出于安全原因。我的 C# 应用程序需要解密一个单独分发给每个用户的配置文件(每个文件都不同)。问题当然是解密的代码和算法需要在 C# 中,如果可以如此轻松地重新创建,这是有风险的。我很难找到替代解决方案。
标签: c# .net compiler-construction native