【问题标题】:Building complete control flow graph for Linux kernel binary为 Linux 内核二进制构建完整的控制流图
【发布时间】:2018-07-12 09:28:17
【问题描述】:

是否有任何工具可以为整个 Linux 内核二进制文件构建控制流图?例如,考虑为 x86 架构编译的 Linux 内核(vmlinux 文件)。 是否可以仅使用静态分析来确定所有执行路径(忽略间接分支或其他需要运行时信息的控制流)?有没有适合这个的工具?

【问题讨论】:

  • 如果这样的东西存在就好了,但考虑到小得多的自动化控制流图变得多么混乱,无论如何它可能无法用于代码理解。
  • 实际上,Doxygen 可能和这里提到的任何工具一样好(尽管我个人觉得它没那么有用)。

标签: linux-kernel binaryfiles static-analysis disassembly control-flow-graph


【解决方案1】:

我们的DMS Software Reengineering Toolkit 及其C Front End 可以做到这一点。

DMS 提供通用解析、控制流图和调用图构造; C 前端提供特定于 C 的解析细节,构建特定于 C 的流程图的逻辑包括间接 goto 以及已在大约 1600 万行代码系统上使用的指向分析,因此它应该处理 Linux内核。每个编译单元生成一个流程图;调用图用于一组链接的编译单元。所有这些信息都可以作为 DMS 数据结构使用,和/或可以导出为 XML,如果您坚持并且可以承受千兆字节的输出。

您可以查看Control flow, Data Flow, and Call graphs 的示例。

【讨论】:

  • 投反对票的人知道这个工具不能完成任务吗?如果他告诉我们他是怎么知道的,那就太好了。
  • 1.问题是关于二进制分析,而不是从 c 文件构建 cfg。 2. 答案不是针对问题的,而只是提供商业工具的功能(听起来不相关)
  • 从源代码构建 CFG 比从二进制文件更容易。在二进制文件中,您可能有一些无法确定是代码还是数据的数据。在源代码中,您不能对此感到困惑。在源代码中,您有机会确定可以从 CFG 中消除的路径和无效路径的公式;您从二进制文件中执行此操作的机会要少得多。所以,是的,这不是从二进制文件中执行的,而是从可能为您提供更好答案的源中执行的。
【解决方案2】:

你可以试试CppDepend,它提供了一个强大的dependency graph,有很多功能。 但是,您必须分析源代码而不是二进制文件。

【讨论】:

    【解决方案3】:

    有两个工具(CodeVizEgypt)可以在编译过程中生成调用图。

    我认为学习 Linux 内核对你没有多大帮助。很多执行路径依赖于宏和运行时条件,所以静态分析器生成的调用图不是很实用。您仍然需要使用printkdmesg 来弄清楚某些函数中发生了什么。比起使用这些工具,printk 更有用。

    【讨论】:

    • 我实际上是在寻找从内核二进制文件生成cfg,而不是从编译。不过谢谢你的回答。
    【解决方案4】:

    GrammaTech CodeSonar 可以对二进制代码 (https://www.grammatech.com/products/binary-analysis) 执行静态分析,它允许您可视化和导航控制流图。虽然这是一个商业工具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-07
      • 2012-10-25
      • 2017-03-09
      • 2021-03-14
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 2012-07-15
      相关资源
      最近更新 更多