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

  • 相关阅读:
    四叉树编码存储的实现
    窗体之间传递值的几种方法
    常见的六种排序算法实现
    OracleHelper类
    c#动态加载dll文件
    STL学习系列九:Map和multimap容器
    STL学习系列八:Set和multiset容器
    STL学习系列七:优先级队列priority_queue容器
    STL学习系列六:List容器
    STL学习系列五:Queue容器
  • 原文地址:https://www.cnblogs.com/lqerio/p/15527717.html
Copyright © 2020-2023  润新知