我看到有人说,通过调用框架 api(例如 String)来简化混淆的 C# 和 Java 的反编译。但是,这对我来说不太有意义,因为 C 程序不应该也明显调用一些标准库,这相当于 C# apis 吗?
我还看到它说寄存器机(将从 C 运行汇编的硬件)和堆栈机(将运行字节码的虚拟机)之间的区别对于反编译的复杂性很重要。
那么堆栈/注册机问题是这里的主要问题吗?假设如果 CLR 虚拟机被重新实现为注册机,那么 C# 字节码会突然变得像 C 可执行文件一样难以反编译吗?或者还有其他一些主要的复杂性差异不会在这种平台大修中消失?
最佳答案
堆栈机和寄存器机之间没有区别,从两种表示中解构表达式树相对容易。
.NET 和 JVM 很容易反编译,主要是因为元数据:类型和方法名称等。
使用剥离的 native 可执行文件,您将获得所有乐趣:函数没有有意义的名称,没有明确的数据类型,加载内联(然后被进一步优化严重破坏)代码,展开的循环,不可约的控制流,展开的尾部电话等。
在字节码中,大多数此类优化尚未完成(将它们留给 JIT),因此与移除元数据并应用优化相比,它更接近原始源。无论是堆栈机、基于寄存器、线程化的 Forth 代码还是其他任何代码。
关于clr - 由于堆栈机 - 寄存器机的差异,混淆的 C# 或 Java 比 C 更容易反编译吗?还是有其他原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10533903/