给定一个从 C 编译并在 Solaris 上运行的可执行文件,是否可以确定使用哪个编译器来编译相关的不完整可执行文件?
使用字符串或文件命令时我看不到任何内容,并且 magic 似乎不包含任何特定内容。
编译器通常会在其可执行输出文件中放置指纹吗?
是的,IDA 对此非常有用。它使用了一种名为 FLIRT 的技术。
PEID 就可以了。一般来说,它的效果很好。显然 PEID 是一个 Windows 工具,但它不重要,应该向编译器显示(有时甚至是特定的版本信息)
如果可执行文件未被删除,请尝试 /usr/ccs/bin mcs-p 这通常会显示编译器、链接器和所有使用的头文件
使用您尝试识别的每个编译器构建小型测试应用程序。然后在十六进制编辑器中查看结果,并尝试查找模式。 它可能会变得非常明显——例如来自微软链接器的“Rich”签名。
未剥离:
$ cc -O 你好.c
$ 文件a.out
a.out:ELF 32 位 MSB 可执行文件 SPARC32PLUS 版本 1,V8+ 必需,动态链接,未剥离
$ 字符串 -a a.out | grep 抄送
/opt/solarisstudio12.3/prod/bin/cc -O hello.c
$ dwarfdump -i a.out | dwarfdump -i a.out | dwarfdump -i a.out | grep 编译_o
DW_AT_SUN_compile_options Xa;O;R=Sun C 5.12 SunOS_sparc 补丁 148917-07 2013/10/18;后端;raw;cd;
剥离:
$ 剥离a.out
$ 文件a.out
a.out:ELF 32 位 MSB 可执行文件 SPARC32PLUS 版本 1,V8+ 必需,动态链接,已剥离
$ 字符串 -a a.out | grep 抄送
(无)
Visual Studio 和 GCC 通常遵循不同的启动例程(调用 main)。这也许是一个暗示。不过我不知道其他人的情况。对于 dll,我想不出类似的东西。
编译器通常会在编译后的文件中以明文形式添加自己的个人“签名”。您可以使用字符串等工具来提取明文。