【问题标题】:Can you find out which compiler was used to compile a program?你能找出哪个编译器被用来编译一个程序吗?
【发布时间】:2014-03-06 04:37:16
【问题描述】:

给定一个从 C 编译并在 Solaris 上运行的可执行文件,是否可以确定使用哪个编译器来编译相关的不完整的可执行文件?

在使用字符串或文件命令时,我什么都看不到,而且魔法似乎不包含任何具体内容。

编译器通常会在其可执行输出文件中添加指纹吗?

干杯,

【问题讨论】:

  • 好问题。我认为存在差异(即使在版本和编译器设置之间),但检测编译器并非易事。
  • 有趣的问题。你在想什么操作系统?
  • 这还取决于您必须使用多少。例如 gcc 创建的 o 文件与 cc 不同。如果您有静态程序或动态可加载程序,您还可以查看使用了哪些库。换句话说,你的指纹是逻辑而不是字符串。

标签: compiler-construction identification


【解决方案1】:

是的,IDA 非常适合这一点。它使用一种称为FLIRT 的技术。

【讨论】:

    【解决方案2】:

    PEID 可以解决问题。它通常工作得很好。显然,PEID 是一个 Windows 工具,但它不重要,应该向编译器显示(有时甚至是特定版本信息)

    【讨论】:

    • 仅适用于 PE 文件。 Solaris 是 ELF 或可能是 a.out
    【解决方案3】:

    如果可执行文件没有被剥离,请尝试 /usr/ccs/bin mcs-p 这通常会显示编译器、链接器和所有使用的头文件

    【讨论】:

      【解决方案4】:

      使用您尝试识别的每个编译器构建小型测试应用。然后在十六进制编辑器中查看结果,并尝试查找模式。结果可能非常明显——例如来自微软链接器的"Rich" signatures

      【讨论】:

        【解决方案5】:

        未剥离:

        $ cc -O hello.c

        $ 文件 a.out

        a.out:ELF 32 位 MSB 可执行 SPARC32PLUS 版本 1,V8+ 必需,动态链接,未剥离

        $ 字符串-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 补丁 148917-07 2013/10/18;backend;raw;cd;

        剥离:

        $ 剥离 a.out

        $ 文件 a.out

        a.out:ELF 32 位 MSB 可执行 SPARC32PLUS 版本 1,V8+ 必需,动态链接,剥离

        $ 字符串-a a.out | grep cc

        (无)

        【讨论】:

          【解决方案6】:

          Visual Studio 和 GCC 通常遵循不同的启动例程(调用 main)。这也许是一个暗示。虽然我不知道其他人。对于 dll,我想不出类似的东西。

          【讨论】:

            【解决方案7】:

            编译器通常在编译文件中添加他们自己的个人“签名”作为明文。您可以使用字符串等工具来提取明文。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-09-18
              • 1970-01-01
              • 1970-01-01
              • 2013-03-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多