End*_*ies 3 clr obfuscation decompiling reverse-engineering
我已经看到它说通过调用框架api来简化对混淆的C#和Java的反编译,就像String一样.但是,这对我来说没有多大意义,因为C程序不应该对一些标准库有明显的调用,这相当于C#apis?
我也看到它说,不知何故,注册机器(将从C运行组件的硬件)和堆栈机器(将运行字节码的虚拟机)之间的区别对于反编译的复杂性很重要.
那么堆栈/注册机器在这里发出主要的一个吗?假设如果CLR虚拟机重新实现为注册机,C#字节码突然变得像C可执行文件一样难以反编译?或者还有一些其他主要的复杂性差异在这样的平台检修中不会消失?
堆栈和寄存器机器之间没有区别,从两个表示中解构表达式树相对容易.
.NET和JVM很容易反编译,主要是因为元数据:类型和方法名称等.
使用剥离的本机可执行文件,您将获得所有乐趣:函数没有有意义的名称,没有明确的数据类型,内联的加载(然后通过进一步优化严重破坏)代码,展开的循环,不可减少的控制流,展开的尾部电话等
在字节码中,大多数此类优化尚未完成(将它们留给JIT),因此它与删除元数据和应用优化时的原始源相比更接近原始源.无论如何,堆栈机器,基于寄存器,线程Forth代码或其他任何东西.