IDA Pro 权威指南学习笔记(七) - 其他 IDA 显示窗口
默认情况下 IDA 不会打开这些窗口,可通过 View -> Open Subviews 命令打开
Strings 窗口(Strings)
Strings 窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址
双击 Strings 窗口中的任何字符串,反汇编窗口和十六进制窗口将跳转到该字符串所在的地址
将 Strings 窗口与交叉引用相结合,可迅速定位感兴趣的字符串,并追踪到程序中任何引用该字符串的位置
例如,看到 SOFTWARE\Microsoft\Windows\CurrentVersion\Run 这个字符串,并想知道应用程序为什么会引用这个特殊的 Windows 注册表项
每次打开 Strings 窗口,IDA 都会扫描或重新扫描整个数据库,查找其中的字符串
扫描字符串的操作遵照 Strings 窗口的设置来完成,右击该窗口,在出现的菜单中选择 Setup,即可开始设置
Setup Strings 窗口用于指定 IDA 应扫描的字符串类型
IDA 默认扫描的字符串类型为至少包含 5 个字符的 C 风格、以 null 结尾的 7 位 ASCII 字符串
每次单击 OK 按钮关闭 Setup Strings 窗口后,IDA 都会根据新的设置重新扫描数据库,查找相应的字符串
Display only defined strings(仅显示已定义的字符串),这个选项使 Strings 窗口仅显示 IDA 自动创建或用户手动创建的已命名字符串数据项
在选中这个选项的同时禁用所有其他选项,IDA 将不会自动扫描其他类型的字符串
Ignore instructions/data definitions(忽略指令/数据定义),这个选项会使 IDA 扫描指令和现有数据定义中的字符串
使用这个选项,可以让 IDA 扫描二进制代码中错误地转换成指令的字符串,或扫描数据中非字符串格式(如字节数组或整数)的字符串
这个选项还会导致 IDA 生成许多垃圾字符串,即那些由 5 个或更多 ASCII 字符构成的字符串(无论其是否合法)
使用这个选项的效果类似于使用 strings -a 命令
Names 窗口(Names)
Names 窗口简要列举了一个二进制文件的所有全局名称
名称是指对一个程序虚拟地址的符号描述
名称可以按字母排序,也可以按虚拟地址排序(升序或降序)
双击 Names 窗口中的名称,可跳转到显示该名称的反汇编视图
Names 窗口中显示的名称采用了颜色和字母编码:
f 为常规函数,IDA 认为这些函数不属于库函数
i 为导入的名称,通常为共享库导入的函数名称
它与库函数的区别在于:导入的名称没有代码,而库函数的主体将在反汇编代码清单中显示
D 为数据,已命名数据的位置通常表示全局变量
C 为命名代码,这些是已命名的程序指令位置,IDA 认为它们不属于任何函数
当 IDA 在程序的符号表中找到一个名称,但没发现对程序位置的任何调用时,就会出现这种情况
A 为字符串数据,这是一个被引用的数据位置,其中包含的一串字符符合 IDA 的某种已知的字符串数据类型,如以 '\0' 字节结束的 ASCII 字符串
在对一个程序进行反汇编的过程中,IDA 会为所有直接作为代码(分支或调用目标)或数据(读取的、写入的或使用的地址)引用的位置生成名称
如果一个位置已在程序符号表中命名,IDA 将采用该名称
如果符号表中某一程序位置没有名称,则 IDA 会生成一个默认的名称,以在反汇编过程中使用
在 IDA 给某个位置命名时,它会使用该位置的虚拟地址和一个表示该位置的类型的前缀进行命名
将虚拟地址合并到生成的名称中,可确保生成的所有名称的唯一性,因为没有两个位置的虚拟地址是相同的,这种自动生成的名称并不在 Names 窗口中显示
用于自动生成名称的一些常用前缀:
sub_xxxxxx:地址 xxxxxx 处的子例程
loc_xxxxxx:地址 xxxxxx 处的一个指令
byte_xxxxxx:位置 xxxxxx 处的 8 位数据
word_xxxxxx:位置 xxxxxx 处的 16 位数据
dword_xxxxxx:位置 xxxxxx 处的 32 位数据
unk_xxxxxx:位置 xxxxxx 处的大小未知的数据
段窗口(Segments)
段窗口显示的是在二进制文件中出现的段的简要列表
在讨论二进制文件的结构时,IDA 术语段(segment)常称为节(section)
段窗口中显示的信息包括段名称、起始和结束地址以及许可标志
起始和结束地址代表程序段在运行时对应的虚拟地址范围
双击段窗口中的任何条目,IDA 将跳转到反汇编窗口中该段的起始位置
右击一个条目,IDA 将显示一个上下文菜单,你可以选择添加新段、删除现有段、或者编辑现有段的属性
段窗口所对应的命令行工具包括 objdump (-h) 、 readelf (-s) 和 dumpbin (/HEADERS)
签名窗口(Signatures)
签名窗口显示的是 IDA 对打开的二进制文件所使用的签名
签名用于识别由编译器生成的常用启动顺序,以确定可能已被用来构建给定二进制文件的编译器
签名还可用于将函数划归为由编译器插入的已知库函数,或者因为静态链接而添加到二进制文件中的函数
IDA 对该二进制文件应用了 vcseh 签名(来自<IDADIR>/sigs目录),并在这个过程中将 0 个函数识别为库函数
至少在两种情况下,需要知道如何对二进制文件应用其他签名:
第一种情况:IDA 无法识别用于构建二进制文件的编译器,因而无法选择所需的相应签名
这时,需要根据自己的初步分析,确认 IDA 应尝试使用的签名,并迫使 IDA 使用一个或几个签名
第二种情况:IDA 中没有针对某些库的现成签名,这时需要自己为这些库创建你自己的签名
类型库窗口(Type libraries)
类型库保存 IDA 积累的一些信息,即 IDA 从最常用的编译器的头文件中搜集到的有关预定义数据类型和函数原型的信息
通过处理头文件,IDA 可确定常用库函数所需的数据类型,并为反汇编代码提供相应的注释
IDA 还可从这些头文件中了解复杂数据结构的大小和布局所有这些信息都收集在 TIL 文件(<IDADIR/til 目录>)中,并可在任何时候应用于分析的二进制文件
与应用签名时一样,在选择加载一组适当的 TIL 文件之前,IDA 必须首先确定一个程序所使用的库
要请求 IDA 加载其他类型库,可以在类型库窗口中按下 INSERT 键,或右击窗口并在出现的菜单中选择 Load Type Library(加载类型库)
函数调用窗口(Function calls)
如果 Y 函数直接调用 X 函数,或者 X 函数直接调用 Y 函数,则称 Y 函数是 X 函数的近邻
打开函数调用窗口时,IDA 会确定光标所在位置的函数的“近邻”
函数 ___pow5mult_D2A 被 ___gdtoa 从 3 个不同的位置调用,被 ___strtodg 从 2 个不同的位置调用,而这个函数又调用了另外 9 个函数
双击函数调用窗口中的任何一行,IDA 将跳转到反汇编窗口中对应的调用或被调用函数(即调用方或被调用方)
IDA 交叉引用(xrefs)是用于生成函数调用窗口的机制
问题窗口(Problems)
IDA 在问题窗口中显示它在反汇编二进制文件时遇到的困难,以及它如何处理这些困难
每个问题都注明了问题发生的地址、问题的类型以及问题所在位置的指令
在上图中,有一个 NODISASM 问题和一个 DECISION 问题
DECISION 问题通常表示 IDA 决定将一个地址上的字节作为指令而非数据进行反汇编,即使这个地址在递归下降指令遍历过程中从未被引用也是如此