将可执行文件转换回 C 源代码

将可执行文件转换回 C 源代码

不幸的是,我丢失了源代码,我只有在 Linux 中用 gcc 制作的输出文件,现在我无法访问我的电脑。有没有办法将输出文件转换为源文件(在 Linux 下的 c 中)?

答案1

所以你有一头牛,但你无意中把它变成了汉堡,现在你想要回你的牛。

抱歉,这样不行。

只需从备份中恢复源文件即可。

啊,你没有备份。不幸的是,宇宙不会给你喘息的机会。

你可以反编译二进制文件。这不会给你你的源代码,但它会给你一些具有相同行为的源代码。除非它是调试二进制文件,否则您不会获得变量名称。除非您在没有优化的情况下进行编译,否则您不会获得完全相同的逻辑。显然,你不会收到评论。

我用过回旋镖反编译一些程序,结果比机器代码更具可读性。我不知道这是否是最好的工具。无论如何,不​​要指望奇迹。

答案2

在对可执行文件进行逆向工程时,有几种常用的工具。

  1. 命令“file”将文件路径作为第一个参数,以便您可以确定(在大多数情况下)您拥有的可执行文件类型。
  2. 反汇编程序准确地显示了可执行文件的功能,但对于那些没有在特定体系结构上编写汇编代码或具有反汇编经验的人来说很难阅读。
  3. Boomerang、Hex-rays 和 Snowman 等反编译器可以提供更高的可读性,但它们无法恢复原始程序的实际变量名称或语法,并且它们不是 100% 可靠,特别是在创建可执行文件的工程师使用以下命令进行测试的情况下这些软件包并试图进一步混淆安全性。
  4. 数据流程图或表格。我知道没有免费的工具可以自动执行此操作,但是位于程序集输出的文本解析器顶部的 Python 或 Bash 脚本(可以用 sed 或 Perl 编写)可能会有所帮助。
  5. 不管你信不信,铅笔和纸是用来记录流程和想法的。

在我见过的大多数情况下,代码需要从头开始重写,作为汇编语言程序进行维护,或者通过将更改请求重新应用到旧版本来重新构建。

答案3

你想做的事情叫做“反编译”。那里有很多反编译器,在这里涵盖所有反编译器是不切实际的。

然而,一般来说:从 C 源代码到可执行机器代码的转换是有损的。例如:

  • 评论将不可逆转地丢失
  • 变量名不见了
  • 有时为了性能而展开循环
  • 功能可能会重新安排

代码很少能按照编写的方式进行编译。现在大多数编译器都会彻底改变你的代码来优化它。所以当你反编译时,编译器只能猜测源代码一定是什么样子,它无法知道源代码是什么你的代码是,因为那已经消失了。如果反编译器很好,您获得的代码至少可以编译回等效的可执行文件,然后您可以开始慢慢地将其重构为可读。但反编译器很可能会产生完全不可读的意大利面条代码,并且破译它将是一件非常头疼的事情。有时,它可能最终会成为较少的努力从头开始重写程序。

相关内容