idapro权威指南第二版阅读笔记-第五章 IDA数据显示窗口
IDA不提供撤销操作
大部分操作可以通过 菜单//工具栏//热键,鼠标右键实现
5.1 IDA主要的数据显示窗口
ESC关闭窗口
5.1.1 反汇编窗口
IDA-VIEW /disassembly
空格切换列表、图形视图
图形视图将 一个函数 分解成基本块(基本块是连续执行的指令序列,通常开头是分支指令的目标,最后一条指令是分支指令)
IDA用 流 描述指令执行。正常流(普通流)表示默认执行连续执行,跳转流跳转(或可能跳转)到非连续位置。调用流表示调用子例程
基本块后,红色边(no)表示不执行跳转时,绿色边yes表示执行时。(IDA是静态分析工具,只是提供不同情况时的执行,不是说真的只走yes)。只有一个后续块的用蓝色
列表视图,完整显示程序(不像图形视图只显示一个函数)
Options general disassembly 可以修改显示形式
下图中,前面为虚拟地址(格式为[区域名称]:虚拟地址),2处表示IDA对函数栈帧的判断,详见第六章。
下图中,注释表示交叉引用。详见第九章
下图中虚线表示条件跳转,实线表示非条件跳转。加粗的,向上的线,逆向跳转,通常表示循环
5.1.2 函数窗口
在那个部分(.init)的哪个虚拟地址(80000),找到了该函数。函数长度为0x34 字节。R表示返回调用方,其他可参考IDA--HELP
5.2 次要的IDA显示窗口
5.2.1 16进制窗口
对应IDA VIEW-A,有HEX VIEW-A。可以右键取消绑定。
右键可以设置数据格式。
右键Edit可以修改内容。
通常,在绑定时,选定反汇编窗口的内容,对应的16进制窗口的字节也会高亮显示。滚动一个窗口,对应窗口也会随之调整位置。如图,光标指向0040108C,构成该地址指令的5个字节高亮显示
若16进制窗口显示问好,表示无法识别。如.bss节
5.2.2 exports
列出文件的入口点。包括程序的执行入口点(在程序文件头部分指定),和文件导出给其他文件使用的 函数 和 变量
通常可在共享库找到到处的函数。
名称 虚拟地址 序数(Ordinal)
Export一般至少包含一个项目 start,即程序执行的入口点。标注[main entry]
export还提供objdump -T、readelf -s、dumpin 、EXPORTS类似的功能
5.2.3 imports
显示动态链接的函数。地址为相关导入表条目的虚拟地址。
仅显示动态加载器自动处理的符号,对dlopen/dlsym或LoadLibrary/GetProcessAddress等机制自行加载的符号不显示在此表
5.2.4 结构体窗口
一方面,IDA自动分析函数参数类型和使用的内存,根据签名库匹配,判断二进制文件中使用了哪种结构体。
如图
右键 list 可以看到具体的使用这个结构体的函数
另一方面,可以自定义结构体,用以表示在分析过程中我们自己发现的,程序使用的结构体。在第八章详细讨论
5.2.5 Enums
类似Structures窗口。open-subviews
5.3 其他IDA窗口
5.3.1 strings窗口
提供类似strings 的功能,每次打开都重新扫描数据库,搜索字符串并显示。右键setup 可以更改搜索的字符串的条件(比如长度、风格(windows程序常用的unicode))
结合交叉引用可以追踪字符串、哪里引用了该字符串
Ignore instruction definitions可以忽略数据/代码的定义,扫描全部的字符串。类似strings -a
5.3.2 names窗口
列举IDA识别的所有 全局名称。名称即虚拟地址的符号描述
需要注意的是,IDA在反汇编过程中,会为直接作为代码(分支或调用目标)和数据(读取的、写入到、使用的地址)引用的位置生成名称。
即将某位置命名为函数或数据。
然而有些数据/函数已经在程序符号表命名,IDA会直接使用该表中的名称。若没有,则自动生成。自动生成的名称不会列在Names table
自动命名的规则是类型+虚拟地址
5.3.3 segment 段窗口
IDA常将段(segment)称为节(section)。不要和内存分配搞混
提供了objdump -h,readelf -s,dumpbin /headers 类似的功能
5.3.4 Signatures 签名窗口
IDA使用签名识别函数。如图表示使用vc32rtf签名,识别了501个函数
右键,apply new sig 可以应用新签名,详见12章
5.3.5 类型库type library 窗口
见13章
5.3.6 functions calls函数调用窗口
谁调用,调用谁。
IDA使用交叉引用(xrefs)生成此窗口,见第9章
Graphs-function calls可以看见完整的调用图
5.3.7 问题窗口
参考IDA-HELP--Problem List
标注分析过程中遇到的问题
BOUNDS 无法确定调用/跳转的目标,或超出地址范围等等
PS
可以随时使用IDA->Help搜索查看不明白的问题、定义
虚拟地址:与物理地址间的区别
栈帧 程序运行时栈中分配的内存块。包含传递的函数参数和函数的局部变量。栈帧在函数入口点分配,在函数退出时释放
交叉引用
bss节 由编译器创建,保存程序未初始化的静态变量。在程序的文件镜像中没有为它分配空间。只需在程序的一个头文件注明大小,程序执行时,加载器为其分配空间,初始化为0
序数 Ordinal:一些共享库(DLL)可能使用导出序数,使用户可以通过序数而非函数名访问函数。从而加快地址查询速度,隐藏函数名称
导入表:为加载器提供空间,用于在加载所需库并获知导入函数的地址后保存导入函数的地址。一个导入表条目保存一个导入函数的地址。目前的理解是:类似于数组,程序根据所需函数访问相应条目,得到所需调用函数的真实地址。
程序符号表