Sam*_*Sam 9 c assembly x86-64 objdump control-flow-graph
我正在尝试构建一个通过调用objdump -d返回的汇编结果的控制流图.目前我提出的最好的方法是将结果的每一行放入链表中,并将每行的内存地址,操作码和操作数分开.我依靠objdump结果的常规性质将它们分开(内存地址是字符串2到字符串中代表每一行的字符7).
完成后,我启动实际的CFG指令.CFG中的每个节点都包含一个起始和结束内存地址,一个指向前一个基本块的指针,以及指向任何子基本块的指针.然后我将浏览objdump结果并将操作码与x86_64中所有控制流操作码的数组进行比较.如果操作码是控制流操作码,我将地址记录为基本块的末尾,并根据操作码添加两个子指针(条件操作码)或一个(调用或返回).
我正在用C实现这个过程,看起来它会起作用但感觉非常脆弱.有没有人有任何建议,或者我没有考虑的任何事情?
感谢您抽时间阅读!
编辑:
我的想法是使用它来比较DynamoRIO生成的系统调用的堆栈跟踪与目标二进制文件的预期CFG,我希望像这样构建它会促进这一点.我没有重复使用可用的东西,因为A)我真的没有关于它和B)我需要将图形转换为可用的数据结构,以便我可以进行路径比较.我将看一下您排行的页面上的一些实用程序,感谢您指出我正确的方向.感谢您的评论,我真的很感激!
小智 5
您应该使用专为程序分析设计的 IL。有几个。
DynInst 项目 (dyninst.org) 有一个提升器,可以将 ELF 二进制文件转换为函数/程序的 CFG(或者我上次看的时候它做到了)。DynInst 是用 C++ 编写的。
BinNavi 使用来自 IDA(交互式反汇编器)的输出来构建 IDA 识别的 IL 失控流图。我还推荐一份 IDA,它可以让您直观地检查 CFG。一旦你在 BinNavi 中有一个程序,你就可以得到它的函数/CFG 的 IL 表示。
函数指针只是静态识别控制流图麻烦的开始。跳转表(在某些情况下为 switch case 语句生成的种类,在其他情况下手动生成)也很麻烦。我所知道的每个代码分析框架都以非常启发式的方法来处理那些代码分析框架。然后你有异常和异常处理,还有自修改代码。
祝你好运!您已经从 DynamoRIO 跟踪中获得了大量信息,我建议您尽可能多地利用该跟踪中的信息......