我可以从调试二进制文件重构C ++源代码吗?

时间:2010-06-18 17:59:28

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

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

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

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

谢谢!

5 个答案:

答案 0 :(得分:10)

  

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

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

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

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

有些工具可以生成类似于C ++源文件的东西,但很可能它看起来与原始资源不同。

答案 1 :(得分:1)

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

当我真的非常绝望时,我尝试过这种方法,但我的情况则有点不同,更有利于“搜索和恢复”,因为当IDE崩溃并且整个源文件丢失时,我丢失了它( !!!!令人讨厌的惊喜!!!)

答案 2 :(得分:0)

我最近不得不通过将其反编译为汇编程序来重建MSVC编译程序 - 没有调试信息,源甚至没有进行版本控制。只有让我从头开始保存的东西才是之前的开发人员使用API​​的示例应用作为这个新应用的基础。

如果你有调试符号,你至少可以获得方法名称。

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

答案 3 :(得分:0)

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

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

通常,即使调试二进制文件也不能设计为能够重新创建原始源:这就是源的用途。它们确实有符号表和指令 - >行号图,它们可以提供帮助。

答案 4 :(得分:-2)

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