Pau*_*aul 7 assembly parsing control-flow-graph
我想使用 C 语言从汇编文件创建控制流图(CFG)。我一直在思考这个问题,这些是我的想法: 1.创建块 - 逐行处理汇编文件 - 找到重要的指令,如函数名称、块名称、跳转指令、调用指令或 left/ret 以及其他一些指令 - 找到它们也许用正则表达式?但我还没有在 Windows 上找到 C 的正则表达式实现。- 匹配上述指令后,在匹配某些结构之前保存指令,这是我的块 2. 创建 CFG - 不知如何从块创建 CFG,但我不知道
谁能给我一些建议如何去做?另外,如果有更好的语言可以做到这一点,如果您告诉我,我将不胜感激。
感谢您的时间和帮助。
OP 需要的是一种严格的方法来完成这项任务。
他需要一个好的汇编源代码解析器,这样他就知道他可以准确地表示它。除了纯粹的解析部分之外,他还必须相当完全地模拟汇编器,包括所有的复杂性,例如宏、条件块、多位置计数器、绝对/相对/外部符号等。(仅依赖于构建一个好的解析器在正则表达式上是行不通的。)
然后,他需要通过检查机器指令和分支的序列来计算控制流图的第一个估计。这可能比看起来更难做到;在大型、复杂的汇编代码中,人们滥用程序的入口点,因此有时很难区分什么是指令,什么是数据。
(这是我在大型 x86 应用程序中使用的一个技巧。我想在代码的很多地方添加健全性检查。健全性测试如下所示:
<test for some sane condition>
jf location+3 ; this branchs to a breakpoint in the middle of the next instruction
cmp al, 0xCC ; the immediate value is a BREAKPOINT opcode
Run Code Online (Sandbox Code Playgroud)
它们很紧凑,当出现一些问题时就会出现断点。但是,在分析该程序的控制流时,“jmp false”有时会分支到看似指令中间的部分。OP 将如何建模?)
下一个复杂问题是指向代码的指针。汇编代码通常会生成许多指向其他指令的指针,然后将这些指针隐藏在各个位置(调用指令将它们推送到 x86 的数据堆栈上),检索它们,然后执行“间接跳转”。如果你想知道 jmp 可能会去哪里,你需要跟踪内存位置可能包含的可能值,这意味着你需要进行数据流分析(值如何到达那里,从哪里到达)并与调用图结合起来构造(无法到达该函数?好吧,那么它的去向不会影响此代码)来计算合理的答案。
通过临时方法完成所有这些操作最终会产生不准确(无用)的答案。如果OP希望得到好的结果,他需要找到一个框架来构建他的解析器,并实现高质量的点分析算法。
C 并不是专门为支持此任务而设计的。它可以通过足够的额外努力来做到这一点,但对于任何编程语言都是如此。
(检查我的简历是否有这样的框架。OP 可以使用任何适合他的框架)。