idapro权威指南第二版阅读笔记-第九章 交叉引用和绘图功能
9.1 交叉引用
Xref 即一个地址引用另一个地址
分为
代码交叉引用
数据交叉引用
函数调用图
控制流图
从9.2看出,流程图以基本块为单位,流为边
而调用图以函数为单位,函数调用为边
右方注释 代码xref
Main函数中第0x2A字节处提出引用。。 箭头向下表示在高地址。 P表示类型,见后面
9.1.1 代码交叉引用
代码交叉引用表示一条指令将控制器交给另一条。
转交控制权的方式叫流:普通流、跳转流、调用流 采用分段地址时,还分近地址远地址
源程序如下
普通流(ordinary flow)即顺序指令。比如add
调用流 如此处的call callflow
在对应函数处有xref,表明了调用的位置。两条注释表面调用了两次,一次是上图中,还有一次没显示
由函数调用导致的交叉引用,后缀为 p (procedure)
跳转流:如分支指令引起的跳转。如图,后缀为 j (jump)
注意5 处虚线表示 并不存在普通流(即断了)
9.1.2 数据交叉引用
数据交叉引用表示 某个位置(地址) 的数据被读取、写入、引用。
读取交叉引用(read cross-reference)。结合两图看。Read_it 在7处被读取
后缀为r
ECX读取read_it,使IDA将read_it格式化为双字
写入交叉引用(write cross-reference)。后缀为w
8处eax 写入 write_it 确定该变量大小
10处省略号表示xref太多了。Options—general—cross reference—number of displays 修改显示数量
偏移量交叉引用(offset cross-reference)表示引用某处地址而非内容。后缀为o
图中9处,引用了 全局变量ref_it的地址。
通常代码、数据中的指针操作会导致【偏移量交叉引用。如数组访问。字符串也是数组(在cc++中
虚表相关详见指南
9.1.3 交叉引用列表
将光标放在 交叉引用目标地址,view—subview—cross reference
或选中某个符号,右键jump to xref //菜单 jump-jump to xref// 热键ctrl+x
查看每个引用,确定一些信息
9.1.4 函数调用
View—subview—function calls
显示光标所在函数的调用
9.2 IDA绘图
以·交叉引用为边,指令、基本块、函数为节点
基本块的定义
9.2.1 IDA外部图形
使用外部图形软件绘图。支持GDL,和graphviz的DOT语言
View-Graphs 可以查看:
1.外部流程图
光标放在函数中,view-graphs-flow charts(F12) 生成外部流程图,也可叫做控制流图行(因为此图将函数的指令划分为基本块,使用边表示块之间的流)
2. 外部调用图
以函数为节点
View-graph—function calls
紫色应该是外部调用的函数?
对动态链接的二进制文件,一般到库函数为止,因为库函数没有在文件中
3.外部交叉引用图
View –graphs –xref to/from
4.自定义交叉引用图
View-graph-user xrefs chart
可以指定起始位置。起始位置相同则只有起点
9.2.2 IDA的集成绘图
构建一个函数的控制流图形。(即一个函数内的基本块)
Ida-view 空格键或 右键 text/graph view
上面有三个按钮
更改节点颜色 在节点的标题栏右键—set node color to default可以还原默认
更改节点名称
访问该节点的xref。 ^符号表示以普通流指向该节点
分组: 按住ctrl,点击几个标题栏,然后任意一个右键 group nodes
Ungroup nodes 取消分组
Hide nodes 折叠分组,不取消