为什么没有精确的C++;反编译器? 为什么不可能创建一个C++的反编译器,它将像java和C++的.< /p>

为什么没有精确的C++;反编译器? 为什么不可能创建一个C++的反编译器,它将像java和C++的.< /p>,c++,reverse-engineering,decompiler,C++,Reverse Engineering,Decompiler,那样精确地运行,因为C++编译器一般不把任何信息放进可执行文件中,而不是绝对必须的(特别是如果它们在发布模式而不是调试构建中编译),因此,准确反编译程序所需的信息根本不存在于可执行文件中 当然,C++编译器可以包含可执行文件中的所有必要信息(例如在最简单的实现中,它可以简单地包括源代码本身在可执行文件中的副本),但是这样做会使可执行文件明显更大,大多数非开源的C++开发人员都希望其他人无法对可执行文件进行反编译,所以对该功能的需求不多。,因为C++编译器一般不将更多的信息放入可执行文件中,而不是

那样精确地运行,因为C++编译器一般不把任何信息放进可执行文件中,而不是绝对必须的(特别是如果它们在发布模式而不是调试构建中编译),因此,准确反编译程序所需的信息根本不存在于可执行文件中


当然,C++编译器可以包含可执行文件中的所有必要信息(例如在最简单的实现中,它可以简单地包括源代码本身在可执行文件中的副本),但是这样做会使可执行文件明显更大,大多数非开源的C++开发人员都希望其他人无法对可执行文件进行反编译,所以对该功能的需求不多。

,因为C++编译器一般不将更多的信息放入可执行文件中,而不是绝对需要。(尤其是当它们是在发布模式下编译而不是在调试版本中编译时),因此,精确反编译程序所需的信息根本不存在于可执行文件中


当然,可以编译一个C++编译器,它包含了可执行文件中的所有必要信息(例如在最简单的实现中,它可以简单地包括源代码本身在可执行文件中的副本)。但是,这样做会使可执行文件明显变大,并且大多数非开源的C++开发人员都希望其他人无法对可执行文件进行反编译,因此对该功能的需求不多。
  • 内联。许多C++代码在优化的构建中被内联。这会对任何形式的反编译器造成严重破坏。为了找出一个函数是内联的,反编译器必须分析内联代码的细节并将它们匹配起来。而内联优化步骤可以使代码非常不同,这取决于内联的位置。

  • 模板。模板仅使用#1,但会产生其他问题。至少从理论上讲,在两个位置内联的函数可能会编译为相同的汇编指令序列。但对于使用不同模板参数实例化的模板代码,则会使用不同的实例化y必须编译成不同的指令序列。这变得更加困难,因为模板代码可以根据模板参数调用不同的函数集。这些函数本身可以内联

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

  • <> L.>P.>缺乏全面的运行时反射。C++和java都用字节码来绑定原始代码的本质。对象定义很容易被检测到,对象名、成员变量类型和名称等。C++编译成机器语言,不需要任何此类信息。因为它不是必需的,编译器不生成它。即使是ISO C++委员会的反射研究组也集中在编译时反射,这是在运行时不可用的信息。 即使
    std::type_info
    也不提供任何内容。原因是,如果编译器没有检测到某个特定类型将调用
    typeid
    ,那么编译器就不需要为它生成
    std::type_info
    对象。即使它提供了,给你的只是一个对象的名称(和标识符).没别的了


    有几个原因:

  • 内联。许多C++代码在优化的构建中被内联。这会对任何形式的反编译器造成严重破坏。为了找出一个函数是内联的,反编译器必须分析内联代码的细节并将它们匹配起来。而内联优化步骤可以使代码非常不同,这取决于内联的位置。

  • 模板。模板仅使用#1,但会产生其他问题。至少从理论上讲,在两个位置内联的函数可能会编译为相同的汇编指令序列。但对于使用不同模板参数实例化的模板代码,则会使用不同的实例化y必须编译成不同的指令序列。这变得更加困难,因为模板代码可以根据模板参数调用不同的函数集。这些函数本身可以内联

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

  • <> L.>P.>缺乏全面的运行时反射。C++和java都用字节码来绑定原始代码的本质。对象定义很容易被检测到,对象名、成员变量类型和名称等。C++编译成机器语言,不需要任何此类信息。因为它不是必需的,编译器不生成它。即使是ISO C++委员会的反射研究组也集中在编译时反射,这是RunTi无法获得的信息。