是否混淆了C#或Java比C更容易反编译因为堆栈机 - 注册机器的区别?还是有其他原因?

End*_*ies 3 clr obfuscation decompiling reverse-engineering

我已经看到它说通过调用框架api来简化对混淆的C#和Java的反编译,就像String一样.但是,这对我来说没有多大意义,因为C程序不应该对一些标准库有明显的调用,这相当于C#apis?

我也看到它说,不知何故,注册机器(将从C运行组件的硬件)和堆栈机器(将运行字节码的虚拟机)之间的区别对于反编译的复杂性很重要.

那么堆栈/注册机器在这里发出主要的一个吗?假设如果CLR虚拟机重新实现为注册机,C#字节码突然变得像C可执行文件一样难以反编译?或者还有一些其他主要的复杂性差异在这样的平台检修中不会消失?

SK-*_*gic 6

堆栈和寄存器机器之间没有区别,从两个表示中解构表达式树相对容易.

.NET和JVM很容易反编译,主要是因为元数据:类型和方法名称等.

使用剥离的本机可执行文件,您将获得所有乐趣:函数没有有意义的名称,没有明确的数据类型,内联的加载(然后通过进一步优化严重破坏)代码,展开的循环,不可减少的控制流,展开的尾部电话等

在字节码中,大多数此类优化尚未完成(将它们留给JIT),因此它与删除元数据和应用优化时的原始源相比更接近原始源.无论如何,堆栈机器,基于寄存器,线程Forth代码或其他任何东西.