c - 使用 Objdump 的结果构建控制流图

标签 c assembly x86-64 objdump control-flow-graph

我正在尝试构建通过调用 objdump -d 返回的汇编结果的控制流图。目前我想出的最好的方法是将每一行结果放入一个链表中,并将每一行的内存地址、操作码和操作数分开。我依靠 objdump 结果的常规性质将它们分开(内存地址是表示每一行的字符串中的字符 2 到字符 7)。

完成后,我开始实际的 CFG 指令。 CFG 中的每个节点都有一个起始和结束内存地址,一个指向前一个基本 block 的指针,以及指向任何子基本 block 的指针。然后,我将查看 objdump 结果并将操作码与 x86_64 中所有控制流操作码的数组进行比较。如果操作码是控制流操作码,我将地址记录为基本 block 的末尾,并根据操作码添加两个子指针(条件操作码)或一个(调用或返回)。

我正在用 C 实现它,它似乎可以工作,但感觉非常脆弱。有没有人有任何建议,或者我没有考虑到的任何事情?

感谢您花时间阅读本文!

编辑:

我的想法是用它来比较 DynamoRIO 生成的系统调用的堆栈跟踪与目标二进制文件的预期 CFG,我希望像这样构建它会促进这一点。我没有重新使用可用的内容,因为 A) 我没有真正考虑过它,并且 B) 我需要将图形放入可用的数据结构中,以便我可以进行路径比较。我将查看您排到的页面上的一些实用程序,感谢您为我指明了正确的方向。感谢您的评论,我真的很感激!

最佳答案

您应该使用专为程序分析而设计的 IL。有几个。

DynInst 项目 (dyninst.org) 有一个提升器,可以将 ELF 二进制文件转换为函数/程序的 CFG(或者我上次看的时候它做了)。 DynInst 是用 C++ 编写的。

BinNavi 使用 IDA(交互式反汇编程序)的输出构建 IDA 识别的 IL 失控流图。我还推荐 IDA 的副本,它可以让您直观地抽查 CFG。一旦你在 BinNavi 中有了一个程序,你就可以获得它的函数/CFG 的 IL 表示。

函数指针只是静态识别控制流图的麻烦的开始。跳转表(在某些情况下为 switch case 语句生成的类型,在其他情况下是手动生成的)也会带来麻烦。我所知道的每个代码分析框架都以非常启发式的方法处理这些问题。然后你有异常和异常处理,还有自修改代码。

祝你好运!您已经从 DynamoRIO 跟踪中获取了大量信息,我建议您尽可能多地利用该跟踪中的信息...

关于c - 使用 Objdump 的结果构建控制流图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4273836/

相关文章:

c - memcpy 和二维数组

c - 如何理解这种函数声明?

c - 直接从栈中获取可变参数

c - sprintf(array, "%4d\n", int),将其转回 int

c++ - 在 __asm 中插入注释导致 C2400 错误 (VS2012)

assembly - mov r64,m64是一个周期还是两个周期的延迟?

assembly - call *(%rax, %rcx,8) 在循环中是什么意思?为什么RAX和RCX之后要变?

c - 尝试制作自己的加载器,但无法实现数据部分

c - 二进制炸弹阶段 5 - 寻找两个整数作为输入

assembly - 什么是 i.h.ah、o.h.ah 和 int86?