如何从编译的代码中获取c源代码

问题描述 投票:1回答:3

我有文本格式的编译C代码。我需要通过反编译机器代码来提取源代码。怎么做?

c compilation decompiling
3个回答
1
投票

“真正的”反编译基本上是不可能的。最重要的是,您无法“反编译”本地名称(在函数和源代码文件/模块中)。对于那些,你会得到类似的,对于int局部变量:i1i2 ......当然,除非你也有调试信息,这通常不是这种情况。

可能会反编译为“某些东西”(可能不是非常易读),但它通常依赖于一些启发式方法,识别编译器生成的代码模式,并且可能被欺骗以生成奇怪的(甚至可能是不正确的)C代码。在实践中,这意味着反编译器通常可以为具有某些(默认)编译选项的某个编译器工作,但是,对其他编译器不太好。

话虽如此,反编译确实存在,你可以试试运气,比如Snowman


0
投票

正如Srdjan所说,一般来说,C(或C ++)程序的反编译是不可能的。在编译过程中丢失了太多信息。例如,考虑一个声明,例如int x这是'丢失',因为它不直接产生任何机器级指令。编译器需要此信息才能进行类型检查。

然而,现在可以反汇编,它将编译后的可执行文件备份到汇编语言。但是,对装配的解释可能(将?)是困难的并且肯定是耗时的。有几个可用的拆卸器,如果你有钱,IDA-Pro可能是拆卸器的行业标准,如果你正在做这种类型的工作,每个许可证值得几千美元。有许多开源反汇编可用,谷歌可以找到它们。

现在,据说有创建反编译器的努力,IDA-Pro有一个,除了上面链接的Snowman之外你还可以看看http://boomerang.sourceforge.net/

最后,其他语言对C或C ++的反编译更友好。例如,C#程序可以使用dotPeekilSpy等工具进行编译。与Java类似,有许多工具可以将Java字节码转换回Java源代码。


-1
投票

请以文本格式发布“已编译的C代码”的样本。

也许那时你会更容易看到你想要实现的目标。

通常,将汇编语言反向工程为C是不切实际的,因为标签和变量名形式的人类可读信息在编译过程中会永久丢失。

© www.soinside.com 2019 - 2024. All rights reserved.