我有文本格式的已编译C代码。我需要通过反编译机器代码来提取源代码。该怎么做?
答案 0 :(得分:1)
基本上,“ True”反编译是不可能的。首先,您不能“反编译”本地名称(在函数和源代码文件/模块中)。对于那些int
局部变量,您将得到类似的东西:i1
,i2
...当然,除非您也有调试信息,这种情况并不常见。
可以反编译为“某种东西”(可能不太可读),但是它通常依赖于某些启发式方法,可以识别出编译器生成的代码模式,并且可以欺骗 生成奇怪的代码(可能甚至错误)的C代码。实际上,这意味着对于具有某些(默认)编译选项的某些编译器,反编译器通常可以正常工作,但与其他编译器的配合则不太好。
话虽如此,反编译器确实存在,您可以尝试使用Snowman
答案 1 :(得分:0)
正如Srdjan所说,通常不可能对C(或C ++)程序进行反编译。在编译过程中丢失了太多信息。例如,考虑一个诸如int x
之类的声明,因为它不会直接产生任何机器级指令,所以它是“丢失的”。编译器只需要这些信息即可进行类型检查。
但是,现在可以反汇编,这会将已编译的可执行文件重新升级到汇编语言。但是,对程序集的解释可能会很困难并且肯定会很耗时。有几种可用的反汇编程序,如果您有钱,IDA-Pro可能是反汇编程序的行业标准,并且如果您要进行此类工作,则每个许可证很值几千美元。有许多可用的开源反汇编程序,谷歌可以找到它们。
现在,据说已经努力创建一个反编译器,IDA-Pro拥有一个,并且除了上面链接的Snowman之外,您还可以查看http://boomerang.sourceforge.net/。
最后,其他语言在反编译方面比C或C ++更友好。例如,C#程序可使用dotPeek
或ilSpy
之类的工具进行反编译。与Java类似,有很多工具可以将Java字节码转换回Java源代码。
答案 2 :(得分:-1)
请发布“以文本格式编译的C代码”的示例。
也许那样会更容易看到您要实现的目标。
通常,将汇编语言反向转换为C是不切实际的,因为在编译过程中永久丢失了许多标签和变量名形式的人类可读信息。