给定一个从 C 编译以在 Solaris 上运行的可执行文件,是否可以确定使用哪个编译器来编译相关的不完整的可执行文件?
使用字符串或文件命令时,我什么都看不到,而且魔法似乎不包含任何特定内容。
编译器通常会在其可执行输出文件中添加指纹吗?
干杯,
给定一个从 C 编译以在 Solaris 上运行的可执行文件,是否可以确定使用哪个编译器来编译相关的不完整的可执行文件?
使用字符串或文件命令时,我什么都看不到,而且魔法似乎不包含任何特定内容。
编译器通常会在其可执行输出文件中添加指纹吗?
干杯,
是的,IDA 非常适合这个。它使用一种称为FLIRT的技术。
PEID可以解决问题。它通常工作得很好。显然,PEID 是一个 Windows 工具,但它不重要,应该向编译器展示(有时甚至是特定的版本信息)
如果可执行文件没有被剥离,试试 /usr/ccs/bin mcs -p 这通常会显示编译器、链接器和所有使用的头文件
使用您尝试识别的每个编译器构建小型测试应用程序。然后在十六进制编辑器中查看结果,并尝试查找模式。结果可能非常明显——例如来自微软链接器的“Rich”签名。
未剥离:
$ cc -O hello.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 | grep compile_o
DW_AT_SUN_compile_options Xa;O;R= Sun C 5.12 SunOS_sparc 补丁 148917-07 2013/10/18;backend;raw;cd;
剥离:
$ 剥离 a.out
$文件a.out
a.out:ELF 32 位 MSB 可执行 SPARC32PLUS 版本 1,V8+ 必需,动态链接,剥离
$ 字符串-a a.out | grep 抄送
(没有任何)
Visual Studio 和 GCC 通常遵循不同的启动例程(调用 main)。这也许是一个暗示。虽然我不知道其他人。对于 dll,我想不出类似的东西。
编译器通常将自己的个人“签名”作为明文添加到编译文件中。您可以使用诸如字符串之类的工具来提取明文。