我正在尝试构建一个通过调用objdump -d返回的汇编结果的控制流图.目前我提出的最好的方法是将结果的每一行放入链表中,并将每行的内存地址,操作码和操作数分开.我依靠objdump结果的常规性质将它们分开(内存地址是字符串2到字符串中代表每一行的字符7).
完成后,我启动实际的CFG指令.CFG中的每个节点都包含一个起始和结束内存地址,一个指向前一个基本块的指针,以及指向任何子基本块的指针.然后我将浏览objdump结果并将操作码与x86_64中所有控制流操作码的数组进行比较.如果操作码是控制流操作码,我将地址记录为基本块的末尾,并根据操作码添加两个子指针(条件操作码)或一个(调用或返回).
我正在用C实现这个过程,看起来它会起作用但感觉非常脆弱.有没有人有任何建议,或者我没有考虑的任何事情?
感谢您抽时间阅读!
编辑:
我的想法是使用它来比较DynamoRIO生成的系统调用的堆栈跟踪与目标二进制文件的预期CFG,我希望像这样构建它会促进这一点.我没有重复使用可用的东西,因为A)我真的没有关于它和B)我需要将图形转换为可用的数据结构,以便我可以进行路径比较.我将看一下您排行的页面上的一些实用程序,感谢您指出我正确的方向.感谢您的评论,我真的很感激!
所以我试图使用objdump实用程序从程序集构建一个控制流图,我遇到了一个问题.基本上,每当分支发生且目标地址相对时,我不知道如何知道下一个基本块的起始位置.我不确定我是否清楚,所以我会添加一个例子.假设我的程序正在通过objdump输出,并记录了第一个基本块的起始地址.然后它命中一个跳转命令,该命令使用相对寻址指向要跳转到的正确地址.我知道我的第一个基本块的结束就在那里,但是如何在下一个基本块的开头找到正确的地址呢?任何人都可以提供的任何指导都会非常感激,我最多只是x86的新手,过去一周我一直在反对这个问题.