- 献词
- 致谢
- 前言
- 第一部分 IDA 简介
- 第 1 章 反汇编简介
- 第 2 章 逆向与反汇编工具
- 第 3 章 IDA Pro 背景知识
- 第二部分 IDA 基本用法
- 第 4 章 IDA 入门
- 第 5 章 IDA 数据显示窗口
- 第 6 章 反汇编导航
- 第 7 章 反汇编操作
- 第 8 章 数据类型与数据结构
- 第 9 章 交叉引用与绘图功能
- 第 10 章 IDA 的多种面孔
- 第三部分 IDA 高级应用
- 第 11 章 定制 IDA
- 第 12 章 使用 FLIRT 签名来识别库
- 第 13 章 扩展 IDA 的知识
- 第 14 章 修补二进制文件及其他 IDA 限制
- 第四部分 扩展 IDA 的功能
- 第 15 章 编写 IDA 脚本
- 第 16 章 IDA 软件开发工具包
- 第 17 章 IDA 插件体系结构
- 第 18 章 二进制文件与 IDA 加载器模块
- 第 19 章 IDA 处理器模块
- 第五部分 实际应用
- 第 20 章 编译器变体
- 第 21 章 模糊代码分析
- 第 22 章 漏洞分析
- 第 23 章 实用 IDA 插件
- 第六部分 IDA 调试器
- 第 24 章 IDA 调试器
- 第 25 章 反汇编器/ 调试器集成
- 第 26 章 其他调试功能
- 附录 A 使用 IDA 免费版本 5.0
- 附录 B IDC/SDK 交叉引用
5.2 次要的 IDA 显示窗口
除反汇编、函数和输出窗口外,IDA 还在桌面上打开了其他许多选项卡式的窗口。这些选项卡就在导航带下面(见图 4-9 的➌处)。这些窗口用于提供备选或专门的数据库视图。是否使用这些显示窗口,取决于你所分析的二进制文件的特点,以及你应用 IDA 的熟练程度。其中一些窗口非常特殊,我们将在后面几章中详细介绍。
5.2.1 十六进制窗口
将这个窗口称做“十六进制窗口”其实是一种误称,因为 IDA 十六进制窗口可以配置为显示各种格式,并可作为十六进制编辑器使用。默认情况下,十六进制窗口显示程序内容和列表的标准十六进制代码,每行显示 16 个字节,以及其对应的 ASCII 字符。和在反汇编窗口中一样,用户也可以同时打开几个十六进制窗口。第一个十六进制窗口叫做 Hex View-A ,第二个十六进制窗口叫做 Hex View-B,接下来的窗口叫做 Hex View-C ,依次类推。默认情况下,第一个十六进制窗口会与第一个反汇编窗口同步。如果一个反汇编窗口与一个十六进制窗口同步,在一个窗口中滚动鼠标,另一个窗口也会滚动到相同的位置(同一个虚拟地址)。此外,如果在反汇编窗口中选中一个项目,十六进制窗口中的对应字节也将突出显示。如图 5-5 所示,在反汇编窗口中,光标指向地址 0040108C
,这是一个调用指令,那么,在十六进制窗口中,构成这个指令的全部 5 个字节均突出显示。
图 5-5 同步的十六进制窗口和反汇编窗口
另外,在图 5-5 中还可以看到十六进制窗口上下文菜单,右击十六进制窗口的任何位置,这个菜单就会出现。使用这个菜单,可以指定与某个特殊的十六进制窗口同步的反汇编窗口(如果有的话)。如果取消选中同步选项,那么在滚动十六进制窗口时,将不会有任何反汇编窗口随之滚动。选择 Edit 菜单项可将十六进制窗口转变为十六进制编辑器。完成编辑后,你必须提交或取消更改才能返回查看模式。你可以使用 Data Format 菜单项选择各种显示格式,如 1、2、4、8 字节十六进制,带签名的十进制,或不带签名的十进制整数及各种浮点格式。你可以使用 Columns 菜单项更改显示的列数,使用 Text 选项打开或关闭文本块。
有时候,十六进制窗口中显示的全部是问号,这表示 IDA 无法识别给定的虚拟地址范围内的值。如果程序中包含一个 bss 节1 ,就会出现这种情况。通常,bss 节并不占用文件的空间,但加载器会扩展这一节,以适应程序的静态存储要求。
1. bss 节由编译器创建,用于保存程序的所有未初始化的静态变量。既然没有为这些变量指定初始值,那么,就没有必要在程序的文件镜像中为它们分配空间;只需在程序的一个头文件中注明它的大小。当程序执行时,加载器会为其分配所需的空间,并将整个数据块的初始值设为 0 。
5.2.2 导出窗口
导出窗口列出文件的入口点。这包括程序的执行入口点(在程序的文件头部分指定),以及任何由文件导出给其他文件使用的函数和变量。通常,用户可在共享库(如 Windows DLL 文件)中找到导出的函数。导出的项目按名称、虚拟地址和序数2 (如果可用)排列。对于可执行文件,导出窗口中至少包含一个项目:程序的执行入口点。IDA 将这个入口点取名为 start。导出窗口中的常见条目如下所示:
2. 共享库可能会使用导出序数,以方便用户通过序数而非名称访问函数。使用序数可以加快地址查询速度,并允许程序员隐藏函数的名称。Windows DLL 即使用导出序数。
LoadLibraryA 7C801D77 578
与许多其他 IDA 窗口一样,双击导出窗口中的一个条目,IDA 将会跳转到反汇编窗口中与该项目有关的地址。导出窗口提供与 objdump (-T)
、 readelf (-s)
和 dumpbin (/EXPORTS)
等命令行工具类似的功能。
5.2.3 导入窗口
导入窗口的功能与导出窗口的功能正好相反。它列出由被分析的二进制文件导入的所有函数。只有在二进制文件使用共享库时,IDA 才需要用到导入窗口。静态链接的二进制文件不存在外部依赖关系,因此不需要导入其他内容。导入窗口中的每个条目列出一个导入项目(函数或数据)的名称,以及包含该项目的库的名称。由于被导入的函数的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目3 的虚拟地址。以下是导入窗口中的一个条目:
3. 导入表为加载器提供空间,用于在加载所需的库并获知导入函数的地址后保存导入函数的地址。一个导入表条目保存一个导入函数的地址。
0040E108 GetModuleHandleA KERNEL32
双击这个条目,IDA 将跳转到反汇编窗口的 0040E108
地址处。在十六进制窗口中,这个内存位置的内容显示为 ?? ?? ?? ??
。IDA 是一种静态分析工具,它无法获知程序在执行时会在这个内存位置输入什么地址。导入窗口还提供与 objdump (-T)
、 readelf (-s)
和 dumpbin (/IMPORTS)
等命令行工具类似的功能。
对于导入窗口,需要记住的一点是:导入窗口仅显示二进制文件想要动态加载器自动处理的符号,二进制文件选择使用 dlopen/dlsym
或 LoadLibrary/GetProcAddress
等机制自行加载的符号将不会在导入窗口中显示。
5.2.4 结构体窗口
结构体窗口用于显示 IDA 决定在一个二进制文件中使用的任何复杂的数据结构(如 C 结构体和联合)的布局。在分析阶段,IDA 会查询它的函数类型签名扩展库,设法将函数的参数类型与程序使用的内存匹配起来。如图 5-6 所示的结构体窗口表明,IDA 认为程序使用了 sockaddr
4 数据结构。
4. sockaddr
结构是 C 标准库中的一种数据类型,常用于表示网络连接中的一个端点。在与远程计算机建立 TCP 连接时, sockaddr
变量可用于保存 IP 地址和端口号。
图 5-6 结构体窗口
至于 IDA 为什么会得出这样的结论,可能有许多原因。其中一个原因是:IDA 发现,程序为建立新的网络连接调用了 C 库函数 connect
5 。双击数据结构的名称(本例中为 sockaddr
), IDA 将展开该结构,这样你就可以查看该结构的详细布局,包括每个字段的名称和大小。
5. int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
。
结构体窗口的两个主要用途包括:为标准数据结构的布局提供现成的参考;为你提供一种方法,在你发现程序使用的自定义数据结构时,帮助你创建自己的、可用作内存布局模板的数据结构。我们将在第 8 章详细讨论结构体的定义及结构体在反汇编过程中的应用。
5.2.5 枚举窗口
枚举窗口有点类似于结构体窗口。如果 IDA 检测到标准枚举数据类型(C enum
),它将在枚举窗口中列出该数据类型。你可以使用枚举来代替整数常量,提高反汇编代码的可读性。像结构体窗口一样,在枚举窗口中也可以定义自己的枚举类型,并将其用在经过反汇编的二进制代码中。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论