【问题标题】:Can I reconstruct C++ source code from debug binaries?我可以从调试二进制文件重建 C++ 源代码吗?
【发布时间】:2011-03-05 13:31:03
【问题描述】:

我有一个在调试中编译的 C++ 应用程序(使用 MinGW 和 Qt),但我丢失了一些重大更改,因为我的团队中有人忘记在源代码控制管理器中提交他的更改,并用其他更改覆盖了源代码。

当我在调试中(在 Qt Creator 中)运行程序时,我可以在 main 中设置一个断点,然后查看源代码。

有没有办法仅使用调试二进制文件来重建所有丢失的源文件?手动或自动。

谢谢!

【问题讨论】:

  • 您不会因为其他人忘记提交更改而丢失您的源代码。
  • @Hans 您可能会丢失“某人”的中间更改。虽然你想要它们的原因没有实际意义。
  • 正是汉斯。在某些时候,我们对程序员给我们的应用程序(调试二进制文件)感到满意。我们期待他提交他的代码,但他没有。现在,两周后,程序员“改进”了他的代码,并没有发生重大变化(阅读:废话代码)。不幸的是,我们没有他的电脑的备份。我们只有二进制文件...
  • 获得两周前源代码的最佳机会是从程序员的头脑中提取它,因为这是唯一存在的地方。
  • 是的,对,但他的脑袋一团糟,他不合作...... :)

标签: c++ gdb g++ reverse-engineering mingw


【解决方案1】:

当我在调试中(在 Qt Creator 中)运行程序时,我可以在 main 中设置一个断点,然后查看源代码。

真的吗?找出您的调试器从哪里获取源代码,然后从那里复制它。

您的调试器更有可能只是在您的系统上抓取与原始文件名具有相同名称/路径的文件(可能是更新的版本或旧版本等),而事情恰好排成一行。

您不能真正从已编译的二进制文件中重新生成原始源代码,因为从 C++ 源代码到已编译二进制文件的转换不是一对一的关系。有许多(无限......)不同的源文件将编译为相同的二进制文件。无法通过查看二进制文件来知道原始源的样子。

有些工具可以生成类似于 C++ 源文件的内容,但很可能它看起来与您的原始源文件完全不同。

【讨论】:

  • 你是对的。我在自己的机器上重命名了项目源代码目录,现在只看到汇编代码。谢谢。
  • @TerryMahaffey:“有些工具可以生成类似于 C++ 源文件的东西”,有没有可能得到它们?
【解决方案2】:

我认为您实际上可以恢复源代码的可能性很小,但不能从二进制文件本身恢复:如果您真的非常绝望,您可以使用搜索应用程序(例如 Agent Ransack)并在整个驱动器中搜索字符串模式你知道存在于源代码中。特别是,如果有的话,请在您的页面文件 (pagefile.sys) 中搜索 - 可能它被埋在某个地方。

当我真的很绝望时,我曾经尝试过这种方法,但我的情况有点不同,更适合“搜索和恢复”,因为我在不知何故 IDE 崩溃并且整个源文件丢失时丢失了它( !!!!令人讨厌的惊喜!!!)

【讨论】:

    【解决方案3】:

    我最近不得不通过将 MSVC 编译程序反编译为汇编程序来重建它 - 没有调试信息,源代码甚至没有进入版本控制。唯一让我免于从头开始的事情是以前的开发人员使用 API 的示例应用程序作为这个新应用程序的基础。

    如果你有调试符号,你至少可以希望得到方法名。

    我发现 rec22 (recstudio.exe) 是我反编译的最佳选择(免费下载) idaPro 和 hexrays 看起来可能会更好(但买不起)

    【讨论】:

      【解决方案4】:

      如果通过“当我在调试中(在 Qt Creator 中)运行程序时,我可以在 main 中设置一个断点,然后查看源代码。”您实际上的意思是,在调试器中您可以看到旧版本的代码,那么这意味着该源代码的副本仍然存在于调试器能够获取的某个地方。您应该能够(在最坏的情况下)捆绑调试器以找出文件的位置。

      如果这不是你的意思,我所知道的最好的方法是尝试使用调试器进行某种反汇编。根据更改的复杂性,可能可以从程序集中推断出源代码。

      通常,即使是调试二进制文件也无法重新创建原始源:这就是源的用途。他们确实有符号表和指令->行号映射,可能会有所帮助。

      【讨论】:

        【解决方案5】:

        使用strings 程序提取所有 ASCII 字节,然后对它们进行置换。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-26
          • 1970-01-01
          • 2015-09-08
          • 2014-04-27
          • 2017-05-28
          • 2010-10-30
          • 2017-10-06
          相关资源
          最近更新 更多