CFG控制流图提取

CFG控制流图提取

这里编写个简单的c语言程序,编译运行
··

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>

int sub_num(int a, int b) {
int s;
s = a + b;
printf("函数运算结果: %d\n", s);
return s;
}

int main() {
int i, m, n;
int result = 0;

scanf_s("%d %d",&m,&n);
printf("输入的数字为:%d %d", m, n);

//条件语句
if (m > 10) {
printf("数字大于10\n");
}
else {
printf("数字小于等于10\n");
}

//循环语句
for (i = 0; i <= 10; i++) {
result += i;
i++;
}
printf("1 + 2 + ... + 10 = %d\n", result);

//函数
result = result + sub_num(m, n);
printf("最终输出结果: %d\n", result);
return 0;
}

上面的代码中包含一个条件语句、循环语句和函数调用,输出结果如下

编译生成的文件如下

IDA手动提取CFG

首先打开IDA工具,将编译生成的exe文件拖入其中,可查看程序的控制流图和汇编代码,如下

接下来手动保存CFG函数调用图,在菜单栏中点击“view–>graphs–>Function calls”,查看函数调用图

在菜单栏中点击“view–>graphs–>flowt chart”,查看函数流程图,其显示效果与IDA自带的反汇编流程视图相似

在WinGraph中点击“file–>save as”,将调用关系另存为GDL(graph discription language)文本为test01.gdl,保存的文件如下,其中为节点标题,节点属性和信息

流程调用图转换为图片格式

使用EasyGraph扩展包可以将上面保存的gdl文件转换为DOT图片格式,或者利用GraphViz绘制图片

  • 这里在ubuntu上安装Graph:Easy
1
2
3
4
5
6
7
安装
执行:sudo apt-get install cflow graphviz
安装Graph::Easy
执行:sudo perl -MCPAN -e shell
输入y后即可进入以下界面:
执行:install Graph::Easy
等待片刻
1
./graph-easy --from gdl --input=test01.gdl --png --output=graph.png
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信