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 折叠分组,不取消

原文地址:https://www.cnblogs.com/lqerio/p/15527717.html