你能找出用于编译程序的编译器吗?
-
03-07-2019 - |
题
鉴于从C编译以在Solaris上运行的可执行文件,是否可以确定使用哪个编译器来编译关联的不完整可执行文件?
使用字符串或文件命令时,我看不到任何内容,而魔法似乎没有包含任何特定内容。
编译器通常会在可执行输出文件中添加指纹吗?
欢呼声,
解决方案
如果未剥离可执行文件,请尝试/ usr / ccs / bin mcs -p 这通常会显示编译器,链接器和使用的所有头文件
其他提示
是的,IDA非常适合这一点。它使用了一种名为 FLIRT 的技术。
PEID 可以解决问题。它通常很有效。显然PEID是一个Windows工具,但它应该没关系,应该向编译器显示(有时甚至是特定的版本信息)
使用您尝试识别的每个编译器构建小型测试应用程序。然后在十六进制编辑器中查看结果,并尝试查找模式。它可能会变得非常明显 - 例如“Rich”来自Microsoft链接器的签名。
未剥离:
$ cc -O hello.c
$ file a.out
a.out:ELF 32位MSB可执行文件SPARC32PLUS版本1,V8 +必需,动态链接,未剥离
$ strings -a a.out | grep cc
/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 Patch 148917-07 2013/10/18; backend; raw; cd;
剥去:
$ strip a.out
$ file a.out
a.out:ELF 32位MSB可执行文件SPARC32PLUS版本1,V8 +必需,动态链接,剥离
$ strings -a a.out | grep cc
(无)
Visual Studio和GCC通常遵循不同的启动例程(调用main)。这可能是一个暗示。我不知道其他人。对于dll来说,无法想到类似的东西。
编译器通常会添加自己的个人“签名”。在编译文件中作为明文。您可以使用诸如字符串之类的工具来输出明文。