17

如果此二进制文件已分发,则每个 c 程序都将转换为机器代码。既然计算机的指令集是人尽皆知的,那有没有可能找回C原程序呢?

4

9 回答 9

20

您永远无法回到完全相同的源,因为没有与已编译代码一起保存的元数据。

但是您可以从汇编代码中重新创建代码。

如果您对以下内容感兴趣,请查看这本书:逆向:逆向工程的秘密

编辑

这里的一些编译器-101,如果你用另一个词定义一个编译器,而不是像“编译器”那样技术,它会是什么?

答:译者

编译器将您编写的语法/短语翻译成另一种语言,C 编译器将其翻译成汇编甚至机器代码。C# 代码被翻译成 IL 等等。

您拥有的可执行文件只是原始文本/语法的翻译,如果您想“反转它”因此“将其翻译回来”,您很可能不会得到与开始时相同的结构。

一个更现实的例子是,如果您将英语翻译成德语,然后将德语翻译回英语,句子结构很可能会有所不同,可能会使用其他词,但含义和上下文很可能不会改变。

如果您从 C 转到 ASM,编译器/翻译器也是如此,逻辑是相同的,只是阅读方式不同(当然还有优化)。

于 2010-02-16T11:48:12.600 回答
5

这取决于原始C程序的含义。诸如局部变量名称、注释等内容不包含在二进制文件中,因此无法获得与用于生成二进制文件的源代码完全相同的源代码。IDA Pro等工具可能会帮助您反汇编二进制文件。

于 2010-02-16T11:48:25.760 回答
4

我估计一个真正熟练的黑客每天大约 1 KB 的机器代码的转换率。以西方的普通工资计算,例如,一个 100 KB 的可执行文件的价格约为 25,000 美元。在花了那么多钱之后,所获得的只是一大块 C 代码,它完全按照你的方式工作,减去了注释和诸如此类的好处。它与您的版本没有任何竞争力,您将能够更快地提供更新和改进。对这些更新进行逆向工程也是一项艰巨的工作。

如果这个价格标签没有给你留下深刻印象,你可以通过添加更多代码来任意提高转换成本。请记住,能够处理此类大型程序的熟练黑客有更好的工作要做。他们编写自己的代码。

于 2010-02-16T13:10:58.163 回答
4

我所知道的关于这个主题的最佳作品之一是:

香肠里的猪?通过 FermaT 从汇编程序重新设计为C。

声称你得到了一个合理的 C 程序,即使原始的 asm 代码不是用 C 编写的!许多警告适用。

于 2010-02-18T16:21:40.593 回答
3

使用执行此操作的工具是一项研究活动。也就是说,有可能在简单的情况下得到一些东西(例如,除非存在调试符号,否则您不会恢复局部变量名称)。对于大型程序,或者如果程序员决定让它变得困难,这在实践中几乎是不可能的。

于 2010-02-16T11:49:01.867 回答
3

Hex-Rays反编译器(IDA Pro的扩展)可以做到这一点。它仍然是最近的和即将到来的,但显示出巨大的希望。这需要一点时间来适应,但可能会加速逆转过程。它不是“灵丹妙药”——没有 c 反编译器,但它是一项巨大的资产。

于 2010-02-16T14:55:19.167 回答
3

该程序的通用名称是“将汉堡包变回奶牛”。可以将二进制代码逆向工程为功能等效的 C 程序,但该 C 代码是否与原始代码非常相似是一个悬而未决的问题。

于 2010-02-16T17:44:14.150 回答
2

C 程序和它将产生的 ASM/机器代码之间没有 1:1 的映射——一个 C 程序可以在不同的编译器或不同的设置下编译成不同的结果),有时 C 的两个不同位可以产生相同的结果机器码。

您绝对可以从已编译的 EXE 生成 C 代码。您只是无法知道它在结构上与原始代码有多么相似——除了变量/函数名称丢失之外,我认为它不会知道代码在许多文件中拆分的原始方式。

于 2010-02-16T12:01:40.123 回答
2

你可以试试 hex-rays.com,它有一个非常好的反编译器,它可以以 99% 的准确率将汇编代码反编译成 C。

于 2010-03-15T22:05:51.857 回答