我正在尝试构建通过调用 objdump -d 返回的装配结果的控制流图。目前我想出的最好的方法是将结果的每一行放入一个链表中,并将每一行的内存地址、操作码和操作数分开。我依靠 objdump 结果的常规性质将它们分开(内存地址是代表每一行的字符串中的字符 2 到字符 7)。
完成此操作后,我将启动实际的 CFG 指令。CFG 中的每个节点都拥有一个起始和结束内存地址、一个指向前一个基本块的指针以及指向任何子基本块的指针。然后,我将检查 objdump 结果并将操作码与 x86_64 中所有控制流操作码的数组进行比较。如果操作码是控制流,我将地址记录为基本块的结尾,并根据操作码添加两个子指针(条件操作码)或一个(调用或返回)。
我正在用 C 语言实现它,它似乎可以工作,但感觉非常脆弱。有没有人有任何建议,或者我没有考虑到的任何事情?
感谢您抽时间阅读!
编辑:
这个想法是使用它来比较 DynamoRIO 生成的系统调用的堆栈跟踪与目标二进制文件的预期 CFG,我希望像这样构建它会促进这一点。我没有重新使用可用的东西,因为 A) 我并没有真正考虑过它和 B) 我需要将图表转换为可用的数据结构,以便我可以进行路径比较。我将查看您所排的页面上的一些实用程序,感谢您为我指明了正确的方向。感谢您的评论,我真的很感激!