有机会了解 Linux 下二进制文件是如何构建的吗? (和/或其他 Unix)
编译器、版本、时间、标志等...
我查看了readelf
但找不到太多,但可能还有其他方法来分析二进制代码/部分等......
你知道如何提取吗?
答案1
没有一种通用的方法,但您可以通过查找仅由一个编译器完成的事情来做出有根据的猜测。
GCC 是最简单的;它写入一个.comment
包含 GCC 版本字符串的部分(与运行时得到的字符串相同gcc --version
)。我不知道是否有办法用 来显示它readelf
,但用objdump
它是:
objdump -s --section .comment /path/binary
我刚刚意识到我忽略了你问题的其余部分。标志通常不会保存在任何地方;他们很可能会出现在评论部分,但我从未见过这样做。 COFF 标头中有一个位置用于时间戳,但 ELF 中没有相应的位置,因此我认为编译时间也不可用
答案2
怎么样:
readelf -p .comment a.out
答案3
您可以尝试使用该strings
命令。它将创建大量文本输出;通过检查你可能会猜到编译器。
pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3
在这里我知道它是用它编译的,gcc
但您始终可以将strings
输出重定向到文件并检查它。
有一个非常好的实用程序叫做peid
对于 Windows,但我在 Linux 上找不到任何替代方案。
答案4
readelf
或者objdump
两者都可以做到这一点。
gcc编译的ELF文件会添加.note.ABI-tag
和.note.gnu.build-id
部分。两者都可以通过以下方式显示:
objdump -sj .note.ABI-tag ELFFILE
objdump -sj .note.gnu.build-id ELFFILE
选项“s”表示显示完整内容,“j”表示部分名称。此样式获取该部分的十六进制内容。
该命令readelf -n
将显示一次 ELFFILE 的人类可读内容。选项“n”表示注释。选择您喜欢的一款。
顺便说一句,使用objcopy
,您可以在 elf 文件中添加您自己的部分。