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


14

不幸的是,我丢失了源代码,仅拥有在Linux中用gcc制作的输出文件,现在我无权访问我的PC。是否有任何方法可以将输出文件转换为源文件(在Linux下为C)?


您想要的就是反编译器。您可能会找到一些有关此答案的帮助:stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf

带有反编译器模块的IDA Pro是唯一实际可用于大型可执行文件的实用解决方案。
fpmurphy '17

@ fpmurphy1您已经获得了Hopper,它的质量可以与IDA Pro媲美,并且其许可证只是价格的一小部分。
Rui F Ribeiro '18

@ fpmurphy1我还没有看到Avast生成的代码的质量...谁又使用了Intel 32位平台?此外,我几十年来没有使用Wintel。参见unix.stackexchange.com/questions/418354/…价格差异非常明显,但是Hex-rays / IDA pro的个人许可证价格从1500USD开始,一些商业许可证的勒索价格较高,例如5000USD或更高的AFAIK,Hopper为100USD对于单个用户,则为130;对于单个计算机,则为130。
Rui F Ribeiro

@RuiFRibeiro。我检查的许多恶意软件的地狱仍然是32位。
fpmurphy

Answers:


25

因此,您有一头母牛,但是您无意间将其转换为汉堡包,现在您希望将其归还给您。

抱歉,那样行不通。

只需从备份中还原源文件即可。

啊,您没有备份。不幸的是,宇宙并没有给你带来休息。

您可以反编译二进制文件。那不会给您源代码,但是会给您一些行为相同的源代码。除非它是调试二进制文件,否则您不会获得变量名称。除非您进行了未经优化的编译,否则您将无法获得完全相同的逻辑。显然,您不会收到评论。

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


1
回旋镖看上去很整齐。羞愧文档引用了gcc -O4,因为如果内存正确,那绝对不会做任何事情(-O3以外)。当然,您的最后一个句子以及前五个句子非常有效。这并不是说其余的都是无效的,因为您非常强调定期备份的重要性。+1
Pryftan

6

逆向工程可执行文件中有几种常用工具。

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

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


1
#1:是的,尽管它也有缺点。#3:我猜那些是商业的吗?我只是从学术上很好奇(我有多余的备份,所以不需要那种东西)。#4:想到了cflow(尽管使用了源代码,但是有些东西可以在二进制文件上工作-当然有一些警告)。还有其他人,这取决于您所追求的。至于图形输出,我不喜欢那里,或者我需要图形输出来处理这类事情(我发现它实际上更分散了注意力)。#5:非常正确 当然,您也可以在此处使用文本文件。
Pryftan

3

您要执行的操作称为“反编译”。那里有很多反编译器,在这里将它们全部覆盖是不切实际的。

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

  • 评论不可撤消地丢失
  • 变量名不见了
  • 有时会展开循环以提高性能
  • 功能可能会重新安排

代码很少像编写的那样被编译。如今,大多数编译器都会彻底更改您的代码以对其进行优化。因此,当您进行反编译时,编译器只能猜测源代码看起来必须是什么样,它无法知道您的代码是什么,因为它已经消失了。如果反编译器良好,则您获得的代码至少可以编译回等效的可执行文件,然后可以开始缓慢地对其进行重构以使其可读。但是反编译器很可能会产生绝对无法读取的意大利面条代码,而将其解密将非常麻烦。有时,仅从头开始重写程序可能会减少工作量。


关于评论,我最近注意到的是-我不知道这是否会让反编译器阅读评论,也不希望反编译器甚至寻找这种类型的东西-这:-C不要丢弃评论。除了已处理指令中的注释会与指令一起删除外,所有注释都传递到输出文件。它突出显示了副作用以及-CC选项的副作用(这是针对gcc的,尽管可能是cpp)。我并不是希望它适用于OP,但有些人可能会对它感兴趣。
Pryftan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.