【问题标题】:How to extract C source code from .so file?如何从 .so 文件中提取 C 源代码?
【发布时间】:2011-08-21 10:36:39
【问题描述】:

我正在开发以前开发的软件,源代码被编译为 linux 共享库 (.so),源代码不存在。有没有什么工具可以从linux共享库中提取源代码?

谢谢, 拉维

【问题讨论】:

    标签: c linux extract decompiling shared-libraries


    【解决方案1】:

    没有。一旦你编译了你的代码,二进制文件中就没有它的痕迹,只有机器码。

    有些人可能会提到反编译器,但它们不会提取源代码,它们会分析可执行文件并生成一些应该与原始版本具有相同效果的源代码。

    【讨论】:

    • 反编译器会产生一些非常糟糕的代码。变量名没有意义,也没有有用的 cmets。你还不如盯着大会。
    • @Christ 我同意。我没有使用 Hex-rays(我听说它非常好),但我尝试过的其他的都很糟糕。
    【解决方案2】:

    您可以尝试反汇编目标代码并获取机器码助记符。

    objdump -D --disassembler-options intel sjt.o 获取 Intel 语法汇编

    objdump -D --disassembler-options att sjt.oobjdump -D sjt.o 获取 AT&T 语法汇编

    但始终找不到原始源代码。您可能会尝试通过研究和重建这些部分来扭转这个过程。这将是地狱般的痛苦。

    【讨论】:

      【解决方案3】:

      免责声明:我在 Hex-Rays SA 工作。

      Hex-Rays 反编译器是我所知道的唯一可与 real-life x86 和 ARM 代码配合使用的商用反编译器。确实,您没有获得原始来源,但是您得到了与之等效的东西。如果您没有剥离二进制文件,您甚至可能会获得函数名称,或者,如果运气好的话,甚至可能获得类型和局部变量。但是,即使您没有符号信息,也不必拘泥于第一轮反编译。 Hex-Rays 反编译器是交互式 - 您可以重命名任何变量或函数、更改变量类型、创建结构类型以表示原始代码中的结构、添加 cmets 等等。通过一点工作,您可以恢复很多。而且很多时候你需要的不是整个原始文件,而是一些关键的算法或函数——而这个 Hex-Rays 通常可以提供给你。

      看看demovideoscomparisonpages。还觉得“盯着大会”是一回事吗?

      【讨论】:

      • Hex-Rays 似乎是商业反编译器。有没有开源的反编译器?
      • 有一些,比如 REC 或 Boomerang,见here。但它们都不适合在现实生活中使用 IMO。
      • IDA 怎么样? AFAIK,它非常擅长反编译,现在有一个免费(旧)版本
      • 我可以使用 Hex-Rays 反编译器的试用版
      【解决方案4】:

      没有。一般来说,这是不可能的。源代码未打包在已编译的对象或库中。

      【讨论】:

        【解决方案5】:

        你不能。但是您可以在 7-Zip 中将其作为存档打开。您可以在其中分别查看每个文件的文件类型和大小。您可以将其中的文件替换为您的自定义文件。

        【讨论】:

        • 什么?您会在 7-zip打开 .so 吗?
        • .so 在 Linux 中与 Windows 中的 .dll 相同,您将无法在 WinZip 或 7-zip 或 WinRAR 等解压缩器中打开它
        • 可以打开.a文件,不确定.so
        • 编译共享对象和解压有什么关系?反编译 !== 解压
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 2011-06-10
        • 1970-01-01
        • 2011-11-20
        • 2017-01-26
        • 1970-01-01
        相关资源
        最近更新 更多