你能从调试编译的二进制文件中检索源吗?

时间:2011-01-26 15:03:12

标签: c++ visual-c++ decompiling debug-symbols backup-strategies

我正在挖掘并发现了大约8年前我在Visual C ++ 6.0中编写的可执行文件。我从来没有备份源代码,但我想我总是在调试模式下编译所有内容。我还隐约记得在某个地方听说过,除非你有编译器的调试符号或其他东西,否则你不能将可执行文件反编译成源代码。"代码会有感情价值,但我检索它并不是关键任务。

这是背景;以下是问题:

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

    - Michael Burge

3 个答案:

答案 0 :(得分:2)

  1. 我不相信有一面旗帜虽然您可能会发现使用PEDUMP会丢弃COFF文件格式(Windows EXE和DLL)。您可以通过运行Dependecy Walker并查看您的EXE是否链接到任何调试DLL(以D为后缀,例如MSVCRT5D.DLL)来推断是否可以快速编译可执行文件以进行调试。

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

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