有没有C++反编译器?

140

我有一个程序,其中C++源代码丢失了。是否有好的C++反编译器可用?

我已经发现了Boomerang


Linux下的objdump - Stypox
4
为了获得出色的图形用户界面和出色的内置反编译器,建议使用 https://cutter.re/。 - Misiur
2022年是否有任何反编译器? - Thinker-101
5个回答

102
你可以使用Hex-Rays开发的IDA Pro。通常情况下,如果你没有在编译时添加调试信息,从二进制文件中得到良好的C++代码是不可能的。准备花费大量手动反向工程来翻译代码。
如果你没有剥离二进制文件,那么使用IDA Pro可以为你生成类似于C语言的代码,让你更方便地进行操作。但通常情况下,这些代码非常粗略,至少在我使用它几年前是这样的。

36
澄清一下,IDA仅提供反汇编结果。它有一个附加组件称为Hex-Rays,可以将其余部分反汇编为C/C++源代码,尽可能地实现这一点。 - davenpcj
2
根据我对文档的阅读,Hex-Rays 只能输出类似 C 的伪代码。这并不意味着它在反编译 C++ 时无用,只需要了解一些编译器如何转换 C++ 结构的知识即可。 - Michael Anderson
进一步澄清一下,反汇编是你可以使用Hex-Rays反编译的最多内容。ASM可以被翻译成任何编程语言,只要进行适当的工作,所有程序都可以作为ASM运行。 - Barkermn01
请注意,即使是最早的Hex-Rays插件版本也不兼容IDAFreeware 5.0版本。 - CODE-REaD
6
雪人(SNOWMAN)是一个很好的免费C++反编译器。 - Inga
3
对于“雪人”的评价我给出加一,但正如其他人所提到的,即使是一个简单的 "Hello, World" 在被反编译后也几乎无法阅读。 - bdetweiler

29

在编译过程中,信息会被丢弃。即使反编译器可以生成逻辑等效的代码和类(它可能做不到),但在优化后的发布代码中,自我记录部分已经消失了。没有变量名,没有例程名,没有类名 - 只有地址。


56
这个程序的“灵魂”已经消失了,现在只剩下一个空壳子,失去了原先的活力和内涵。 - Darshan Chaudhary

21

是的,但是它们都无法生成足够可读的代码来值得花费精力。你将会花更多时间尝试阅读反编译源码中的汇编块,而不是重写你的旧应用程序。


6

我没有看到任何生成C++代码的反编译器。我见过一些试验性的反编译器,它们会尝试生成C代码,但它们往往依赖于匹配特定编译器的代码生成模式(可能已经改变,因为我上次研究这个已经有一段时间了)。当然,任何符号信息都将消失。请搜索“反编译器”。


3

根据原始代码的大小和质量,如果值得的话,重新从你喜欢的语言开始(可能仍然是C++),并从上一个版本中学习任何错误。有人曾经说过写一份要扔掉的代码吗?

注:显然,如果这是一个庞大的产品,那么可能不值得花费时间。


http://www.joelonsoftware.com/articles/fog0000000069.html - Dustin Getz
26
乔尔是一位优秀的专栏作家,但有时会犯错。还有一些时候,他的引语不正确。就像这里一样,因为问题的核心是源代码的丢失。乔尔的文章解释了为什么源代码很有价值。 - MSalters
6
“有人曾经说过写作要扔掉第一稿,对吧?” “是的,但他改变了主意。” 1975年,我建议程序员们“扔掉第一个版本”,然后再构建第二个版本。到了20周年版时,我意识到不断进行渐进式迭代是更可靠的方法。 - ta.speot.is

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接