我想我对编译有些困惑.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个吗?

推荐答案

我刚刚在VS2015&;Windows 8.1上运行了validated .Net Native(如果配置正确,请判断.proj以进行验证),并为特定的体系 struct (可能是过度使用,尚未验证)构建,将生成一个本机文件,该文件将给出您正在寻找的"harder to reverse engineer"代码,而对于我来说,这是无法通过DotPeek(JetBrains免费的.Net反编译器)读取.dll的代码.

.net相关问答推荐

节省用户在整个应用程序中使用的Flutter

为什么DotNet新的webapi;命令会为我生成不同的文件夹

如何在AutoMapper中添加自定义方法到项目中?

DotNet COM初始化问题

无法对.NET MAUI类库进行单元测试

等待时 Blazor 服务器按钮刷新

如何在 MSBuild 脚本中获取当前目录?

为什么 C# 不允许像 C++ 这样的非成员函数

JavaScript 中的IsNullOrWhitespace?

将 DataRowCollection 转换为 IEnumerable

是否有任何 x 次的 for 循环的更短/更简单的版本?

无法加载文件或程序集WebGrease,版本=1.5.1.25624,Culture=neutral,PublicKeyToken=31bf3856ad364e35或其依赖项之一

[DllImport("QCall")] 是什么?

如何将时间设置为当天的午夜?

如何正确和完全关闭/重置 TcpClient 连接?

.NET Framework SDK 和 Targeting 包有什么区别

如何仅在需要时提升权限?

在 .NET 中获取默认打印机的最佳方法是什么

在不使用while循环的情况下找到最里面的异常?

没有科学记数法的双精度字符串转换