clr - 由于堆栈机 - 寄存器机的差异,混淆的 C# 或 Java 比 C 更容易反编译吗?还是有其他原因?

标签 clr obfuscation reverse-engineering decompiling

我看到有人说,通过调用框架 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/

相关文章:

c# - VC++属于托管类还是非托管类?

.net - 如何在 C++ 上从 CLR 捕获事件

.net - 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

javascript - 高级 Javascript 混淆

c# - 混淆引用第 3 方程序集的程序集

c# - 如何给 DLL 中的一行代码打补丁?

java - Hibernate3 Maven 插件错误 : Could not create or find "MyReverseStrategy.java" with one argument delegate constructor?

regex - 分数的 CLR 正则表达式

c - 内联汇编和函数覆盖导致段错误

c++ - 对返回前仅对 EAX 的低字节进行异或运算的虚方法进行逆向工程