如何从.so文件中提取C源代码?

21

我正在处理以前开发的软件,源代码编译为Linux共享库(.so),但没有源代码。是否有工具可以从Linux共享库中提取源代码?

谢谢, Ravi

5个回答

19

没有。一旦你编译你的代码,源代码就不会留在二进制文件中,只有机器码。

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


5
反编译器生成的代码质量很糟糕。变量名毫无意义,也没有有用的注释。看着跟汇编语言差不多。 - Chris Eberle
1
@Christ 我同意。我没有使用过Hex-rays(据说很好),但我尝试过的其他工具都很糟糕。 - cnicutar

6
你可以尝试反汇编目标代码并获取机器码助记符。
objdump -D --disassembler-options intel sjt.o获取Intel语法汇编。
objdump -D --disassembler-options att sjt.oobjdump -D sjt.o获取AT&T语法汇编。
但是原始源代码可能永远找不到。你可以尝试通过研究和重构各个部分来反向处理,但这将是一场噩梦。

5

免责声明:我是Hex-Rays SA的员工。

Hex-Rays反编译器是我所知道唯一能够很好地处理实际x86和ARM代码的商业化反编译器。虽然你不能得到原始源代码,但你可以获得等效的东西。如果你没有剥离二进制文件,你甚至可能得到函数名,或者有些时候还能得到类型和局部变量。不过,即使你没有符号信息,你也不必坚持第一轮反编译结果。Hex-Rays反编译器是交互式的——你可以重命名任何变量或函数,改变变量类型,创建结构类型以表示原始代码中的结构,添加注释等等。稍加努力,你就可以恢复很多信息。而且往往你所需要的并不是整个原始文件,而是一些关键的算法或函数——这正是Hex-Rays通常可以为你提供的。

请查看演示视频比较页面。你还认为“盯着汇编代码看”和使用Hex-Rays反编译器是一回事吗?


1
Hex-Rays似乎是商业反编译器。有没有开源的反编译器? - Ravi
1
有一些工具,例如REC或Boomerang,请参见这里。但在我看来,它们都不适合实际使用。 - Igor Skochinsky
IDA怎么样?据我所知,它在反编译方面非常出色,现在也有一个免费的(旧)版本。 - Bruce
2
我可以使用Hex-Rays反编译器的试用版吗? - Shirish Herwade

-2

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


-17

你不能这样做。但是你可以在7-Zip中将其打开作为一个存档文件。在那里,你可以单独查看每个文件的文件类型和大小。你可以用自定义文件替换其中的文件。


4
什么?你要在7-zip中打开一个.so文件? - devnull
在Linux中,.so与Windows中的.dll相同,您将无法在类似WinZip、7-zip或WinRAR之类的解压缩程序中打开它。 - SSpoke
你可以打开 .a 文件,但不确定 .so 文件。 - rsaxvc
2
编译共享对象和解压缩之间有什么关系?反编译!=解压缩。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接