为什么没有准确的C++反编译器?

Vic*_*748 1 c++ reverse-engineering decompiler

为什么不可能创建一个能够像Java和C#那样准确运行的C++反编译器?

Nic*_*las 9

有几个原因:

  1. 内联.很多C++代码都在优化的构建中内联.这对任何形式的反编译都会造成严重破坏.要弄清楚函数是内联的,反编译器必须分析内联代码的细节并将它们匹配起来.后内联优化步骤可以使代码变得非常不同,具体取决于内联的位置.

  2. 模板.模板仅使用#1,但它们会产生其他问题.至少在理论上,在两个地方内联的函数将编译为相同的汇编指令序列.但对于使用不同模板参数实例化的模板代码?不同的实例化通常必须编译成不同的指令序列.这变得更加困难,因为模板代码可以根据模板参数调用不同的函数集.这些功能本身可以内联.

  3. 编译时执行.模板元编程允许编译器实际执行代码.但是C++ 11 constexpr提供了一种在编译时进行一些计算的更自然的方法.显然,编译时函数调用或元函数实例化不能成为已编译可执行文件的一部分.只有他们的结果将是(因为这有点重要).

  4. 缺乏全面的运行时反射.C#和Java都使用大量有关原始源代码性质的信息来保护它们的字节码.对象定义很容易检测,对象名称,成员变量类型和名称等也是如此.C++编译为机器语言,不需要任何此类信息.由于它不是必需的,编译器不会生成它.甚至ISO C++委员会的反思研究小组也专注于编译时反射,这是在运行时无法获得的信息.

    甚至std::type_info没有提供任何东西.原因是,如果编译器没有检测到特定类型将typeid调用它,那么编译器不需要std::type_info为它生成对象.即使它确实如此,所有这些都是对象的名称(和标识符).而已.