【问题标题】:How to get a c source code from the compiled code如何从编译后的代码中获取c源代码
【发布时间】:2019-02-17 12:52:40
【问题描述】:

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

【问题讨论】:

  • 从二进制文件中,您可以生成相应的汇编源代码,并带有一些相关信息,以防出现调试数据(二进制文件未剥离),但不要期望更容易。此外,您可以从多个初始 C 源获得相同的二进制文件,因此即使您能够逆向编译以生成 C 代码,它也不会是初始的,并且可能不容易阅读
  • 请详细描述您的期望。并不是说您将从可执行文件中获得可读的源代码,是吗? “以文本格式编译的 C 代码”是什么意思? “文本格式”听起来像是人类可读的东西,但“编译”则相反。请注意,即使是人类也不是非常擅长为完全相同的目的编写可读甚至类似的代码。此外,总是有几种方法可以编写不同的代码,从而产生相同的二进制文件。并且只包含在二进制文件中找到的信息肯定不是通常被认为是可读的。
  • 这方面的通俗说法是“把汉堡变回奶牛”。从编译的机器代码中恢复原始源代码实际上是不可能的。反编译器会给你一些功能上等价的东西,但它不会是原始源代码。

标签: c compilation decompiling


【解决方案1】:

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

反编译为“某物”(可能不太可读)是可能的,但它通常依赖于一些启发式方法,识别编译器生成的代码模式,可能被愚弄生成奇怪的(甚至可能不正确)C 代码。实际上,这意味着反编译器通常适用于具有某些(默认)编译选项的特定编译器,但与其他编译器不太好。

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

【讨论】:

    【解决方案2】:

    正如 Srdjan 所说,通常无法对 C(或 C++)程序进行反编译。编译过程中丢失了太多信息。例如,考虑诸如int x 之类的声明,这是“丢失”,因为它不直接产生任何机器级指令。编译器只需要这些信息来进行类型检查。

    然而,现在可以进行反汇编,将编译后的可执行文件恢复到汇编语言的水平。但是,对程序集的解释可能(会?)很困难,而且肯定很耗时。有几个反汇编器可用,如果你有钱 IDA-Pro 可能是反汇编器的行业标准,如果你在做这种类型的工作,每个许可证几千美元是值得的。有很多开源反汇编程序可用,google 可以找到它们。

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

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

    【讨论】:

      【解决方案3】:

      请发布“文本格式的编译 C 代码”示例。

      也许这样更容易看到你想要实现的目标。

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

      【讨论】:

        猜你喜欢
        • 2011-09-28
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2023-02-12
        • 1970-01-01
        • 2018-02-26
        • 2021-02-14
        相关资源
        最近更新 更多