5

我四处挖掘,发现了一个我在大约 8 年前用 Visual C++ 6.0 编写的东西的可执行文件。我从不备份源代码,但我认为我总是在调试模式下编译所有内容。我还隐约记得在某处听到“除非你有编译器的调试符号或其他东西,否则你不能将可执行文件反编译成源代码”。该代码将具有情感价值,但我检索它并不是关键任务。

这就是背景;以下是问题:

  1. 如何检查可执行文件是否在调试模式下编译?
  2. 如果是,调试模式可执行文件附带什么信息?
  3. 我可以检索完整的源代码吗?如果做不到这一点,与发布版本相比,我在反编译时可以获得任何实质性的改进吗?如果是这样,怎么做?

谢谢,

——迈克尔·伯格

4

3 回答 3

2
  1. 我不相信有一个标志,尽管您可能会通过使用 PEDUMP 找到一些会转储 COFF 文件格式(Windows EXE 和 DLL)的东西。您可以通过运行Dependecy Walker并查看您的 EXE 是否链接到任何调试 DLL(以 D 为后缀,例如 MSVCRT5D.DLL)来推断是否为调试而编译了可执行文件。

    VC6 调试和发布中的仅供参考是简单的命名构建,而不是每个模式,每个构建编译器和链接器设置的集合。EXE 只是代码,调试 exe 通常没有经过优化,这使得使用调试器很容易(与调试优化代码相比)。因此,您可以使用调试符号编译发布二进制文件,这有时对跟踪优化的代码错误很有用。

  2. 调试 EXE 和 DLL 不包含任何调试信息,而是有一个边车 PDB 文件,该文件位于同一文件夹中,包含编译期间生成的所有调试符号信息。

  3. 不,源是源,而不是编译到符号文件或可执行文件中。有一些令人惊叹的反编译器可以重新生成体面的 C 代码版本,但它们令人惊叹的只是 C 语言的好坏,而不是它们重新创建源代码的能力。

于 2011-01-26T15:22:53.447 回答
0

使用 Visual Studio,恐怕你不能,因为调试可执行文件不包含源代码。Visual Studio 生成的 pdb 文件仅包含二进制文件和源文件名和行号之间的映射,但您仍然需要源代码和它们。这可能与 gcc 不同,我认为将源代码本身集成到二进制文件中。

于 2011-01-26T15:12:14.383 回答
-2

我认为如果在调试模式下编译二进制文件,许多反汇编程序可以显示源代码。例如,我使用 OllyDBG,它有一个显示源的选项,尽管我从未尝试过。

于 2011-01-26T15:06:19.947 回答