【问题标题】:How does a debug build make reverse engineering easy?调试构建如何使逆向工程变得容易?
【发布时间】:2011-05-21 11:50:11
【问题描述】:

这里的一些答案表明,调试信息可以更轻松地对软件进行逆向工程。当我使用 Visual C++ 并分发带有调试信息但没有其他文件 (.pdb) 的可执行文件时,它会包含任何有趣的东西吗?

我用十六进制编辑器查看了可执行文件,没有发现任何类似符号名称的东西,现在我假设 .exe 文件只是链接到 .pdb 文件中的信息,对吧?

你知道它是否包含

  • 变量名?
  • 函数/成员名称?
  • 行号?
  • 有什么有趣的事情吗?

【问题讨论】:

    标签: c++ debugging reverse-engineering


    【解决方案1】:

    调试版本倾向于生成可以轻松与高级语言结构相关联的输出。您可以通过查看机器代码来识别变量、测试、循环等。您不会得到变量的名称,但这通常是逆向工程时最不重要的考虑因素之一。

    优化的代码,OTOH,重新排列指令,展开循环,为多个变量重用槽,在函数之间共享代码块,内联小函数等等,使得辨别原始意图变得相当困难。即使您拥有代码,这也使得调试变得更加困难,因为当前行标记通常非常具有误导性,并且变量往往会消失或显示随机废话。

    不过,这一切都使得逆向工程成为不可能。只是需要更多的工作来梳理其含义。

    【讨论】:

      【解决方案2】:

      使用调试信息构建不是“调试构建”。

      “调试构建”是定义_DEBUG符号时的构建。如果是这样,有很多字符串可用于逆向工程(断言等)。

      所以你可以在.pbd中使用调试信息进行Release构建,并且反编译程序将与没有调试信息一样困难。

      【讨论】:

        【解决方案3】:

        可执行文件不应包含变量名或行号。对于导出的任何此类名称,它可能包含函数/成员名称(更可能是 lib/dll 而不是 exe)。

        代码的结构将“更接近”类似于原始源代码 - 代码不太可能被内联、语句重新排序、循环展开等。

        【讨论】:

          【解决方案4】:

          优化使代码更难理解(并且在使用符号和源代码调试您自己的代码时也更难在源代码和程序集之间建立关联)。

          调试版本不包括行号、函数名或行号,这些属于 PDB。但是,每次使用 assert() 时,代码都会包含一个包含文件名和行号的字符串。

          【讨论】:

            【解决方案5】:

            很久以前调试信息被附加到可执行文件(以所谓的 CodeView 格式)。如今,它大多单独出现在 PDB 文件中。 exe 本身确实只包含一个指向 PDB 的链接。

            PDB 通常有两种形式:私有和公共(也称为剥离)。公共(例如 Microsoft 提供的那些)通常只有函数和全局变量的名称。私有的(例如,当您使用调试信息构建应用程序时生成的)还可以包括类型信息(结构、枚举、类、变量类型)函数原型、局部变量名称和类型以及行号信息。

            如果要检查 PDB,请检查 Visual Studio 安装中“DIA SDK”文件夹中的 DIA2Dump。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-10-30
              • 1970-01-01
              • 2019-11-08
              • 2010-12-14
              • 2015-02-21
              • 2011-03-09
              • 1970-01-01
              • 2017-03-29
              相关资源
              最近更新 更多