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

mah*_*hsa 15 c source-code reverse-engineering

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

Gil*_*il' 32

所以你有一头牛,但你不经意间把它变成了汉堡包,现在你想要你的牛回来。

对不起,它只是不能那样工作。

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

啊,你没有备份。不幸的是,宇宙不会让你休息一下。

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

我用Boomerang反编译了一些程序,结果比机器码可读性更好。我不知道它是否是最好的工具。无论如何,不​​要期待奇迹。


小智 6

有几种工具在对可执行文件进行逆向工程中很常见。

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

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

  • #1:没错,虽然它也有缺点。#3:我猜那些是商业用途?我只是在学术上很好奇(我有多余的备份,所以不需要那种东西)。#4:cflow(虽然使用源代码,但有一些可以处理二进制文件 - 当然有一些警告)浮现在脑海中。还有其他人,这取决于你追求什么。至于图形输出,我无能为力,因为我不喜欢或不需要那种类型的图形输出(实际上我会发现它更分散注意力)。#5:非常真实。当然,您也可以在此处使用文本文件。 (2认同)