- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
7.1 名称与命名
到现在为止,我们已经在 IDA 反汇编窗口中遇到了两类名称:与虚拟地址(已命名的位置)有关的名称和与栈帧变量有关的名称。在绝大多数情况下,IDA 会根据前面讨论的指导原则,自动生成所有这些名称。IDA 把这些自动生成的名称叫做 哑名 。
遗憾的是,这些名称很少能够帮助我们了解一个位置或变量的用途,因此也无法帮助我们了解程序的行为。在分析一个程序时,操作反汇编代码清单的最主要和最常使用的一个方法,是将默认名称更改为更有意义的名称。好在 IDA 允许你随意修改任何名称,并处理在整个反汇编代码清单中扩散名称变更的所有细节。多数情况下,要修改一个名称,只需单击你希望修改的名称(使其突出显示),并使用热键 N 打开更名对话框。另外,右击需要修改的名称,并在出现的上下文菜单中选择 Rename 选项(如图 6-5 所示),也可以更改名称。栈变量和已命名的位置的更名过程稍有不同,我们将在后续几节中详细说明这些差异。
7.1.1 参数和局部变量
与栈变量有关的名称是反汇编代码清单中最简单的名称,这主要是因为它们与特定的虚拟地址无关,因而从未出现在名称窗口中。和在许多编程语言中一样,根据给定栈帧所属的函数,这类名称的作用域会受到限制。因此,程序中的每个函数可能都有一个名为 arg_0
的栈变量,但没有一个函数拥有一个以上的 arg_0
变量。图 7-1 所示的对话框用于重命名栈变量。
图 7-1 重命名栈变量
提供一个新名称后,IDA 会对当前函数上下文中的每一个旧名称进行修改。在 demo_stackframe
中,将 var_5C
更名为 y
,将得到如下所示的新代码清单,➊处的名称已发生变化。
.text:00401090 ; =========== S U B R O U T I N E ========================= .text:00401090 .text:00401090 ; Attributes: bp-based frame .text:00401090 .text:00401090 demo_stackframe proc near ; CODE XREF: sub_4010C1+41↓p .text:00401090 .text:00401090 var_60 = dword ptr -60h .text:00401090 ➊y = dword ptr -5Ch .text:00401090 var_58 = byte ptr -58h .text:00401090 var_C = dword ptr -0Ch .text:00401090 arg_4 = dword ptr 0Ch .text:00401090 arg_8 = dword ptr 10h .text:00401090 .text:00401090 push ebp .text:00401091 mov ebp, esp .text:00401093 sub esp, 112 .text:00401096 mov eax, [ebp+arg_8] .text:00401099 mov [ebp+var_C], eax .text:0040109C mov eax, [ebp+arg_4] .text:0040109F mov [ebp+y], eax .text:004010A2 mov [ebp+var_60], 0Ah .text:004010A9 mov [ebp+var_58], 41h .text:004010AD mov eax, [ebp+➊y] .text:004010B0 mov [esp+4], eax .text:004010B4 mov eax, [ebp+var_60] .text:004010B7 mov [esp], eax .text:004010BA call bar .text:004010BF leave .text:004010C0 retn .text:004010C0 demo_stackframe endp
如果你希望恢复某个变量的默认名称,打开更名对话框,在输入框中输入一个空白名称,IDA 将为你生成默认的名称。
7.1.2 已命名的位置
重命名一个已命名的位置或给一个未命名的位置取名,这个过程与修改栈变量的名称略有不同。打开更名对话框的方法(利用热键 N)完全相同,但随后的操作则明显不同。与已命名的位置有关的更名对话框如图 7-2 所示。
图 7-2 重命名某个位置
该对话框显示你命名的具体地址,以及一些与该名称有关的特性。最大名称长度对应于 IDA 的一个配置文件(/cfg/ida.cfg)中的某个值。你可以使用任何超出这个长度的名称,这时,IDA 会显示警告消息,提醒你已经超出了最大名称长度,并要求为你增加最大名称长度设置。如果你选择这样做,IDA 将仅在当前数据库中采用新设置的最大名称长度值,而你创建的任何新数据库仍将继续采用配置文件中指定的最大名称长度。
下面的特性可能与某个已命名的位置有关。
Local names (局部名称) 。局部名称的作用域仅限于当前函数,因此,局部名称的唯一 性仅在某个给定的函数中有效。与局部变量一样,两个不同的函数可能含有完全相同的 局部名称,但一个函数不可能包含两个完全相同的局部名称。在函数边界以外的已命名 的位置不能被指定为局部名称,这包括表示函数及全局变量的名称。局部名称最常用于 为函数中的跳转目标提供符号名称,如那些与分支控制结构有关的名称。
Include in names list (包含在名称列表中) 。选择这个选项将有一个名称被添加到名称窗 口中,这样,当你需要返回该名称所在位置时,就更容易找到这个名称。默认情况下, 自动生成的名称(哑名)不包含在名称窗口中。
Public name(公共名称) 。通常,公共名称是指由二进制文件(如共享库)输出的名称。 在最初加载数据库的过程中,IDA 的解析器会在解析文件头的同时查找公共名称。选择这 个特性,你可以强制 IDA 将一个符号看成是公共名称。一般来说,这样做除了给反汇编代 码清单和名称窗口中的名称添加公共注释外,不会对反汇编代码造成任何影响。
Autogenerated name(自动生成的名称) 。这个特性似乎不会对反汇编代码产生任何明显 的影响。选择它并不会使 IDA 自动生成一个名称。
Weak name(弱名称) 。弱符号(weak symbol)是公共符号的一种特殊形式,只有没有 找到相同名称的公共符号来重写时,才会使用弱符号。将一个符号标记为弱符号对汇编 器有一定意义,但对 IDA 反汇编代码却没有任何意义。
Create name anyway (无论如何都要创建名称) 。如前所述,一个函数中不会有两个位 置使用相同的名称。同样,在函数以外(全局范围内),也不能有两个位置使用相同的名 称。这个选项比较容易引起混淆,因为你创建的名称的类型不同,它的行为也不一样。
如果你正在全局范围内编辑一个名称(如函数名称或全局变量),并且尝试分配一个数据库中已经存在的名称,这时,IDA 将会显示名称冲突对话框,如图 7-3 所示。同时,IDA 会自动生成一个唯一的数字后缀,以解决冲突。无论你是否选择 Create name anyway 选项,这个对话框都会出现。
但是,如果你正编辑某个函数中的一个局部名称,并且尝试分配一个已经存在的名称,这时,默认情况下,IDA 会拒绝这种尝试。如果你决心要使用这个名称,必须选择 Create name anyway 选项,以强制 IDA 为局部名称生成一个唯一的数字后缀。当前,解决名称冲突的最简单方法,是选择一个从未使用的名称。
图 7-3 名称冲突对话框
7.1.3 寄存器名称
第三类常被忽略的名称为寄存器名称。在函数边界内,IDA 允许对寄存器进行重命名。如果编译器选择将变量分配到寄存器中,而不是程序栈上,并且你希望使用一个比 EDX 更恰当的名称来引用这个变量,这时重命名寄存器才有用处。重命名寄存器与重命名其他位置的方法几乎完全相同。使用热键 N,或右击寄存器名称并在出现的菜单中选择 Rename,打开“寄存器重命名”对话框。重命名寄存器时,你实际上是提供了一个别名,并使用它在当前函数执行期间引用该寄存器(IDA 甚至在函数开始部分用 alias=register
语法来表示这个别名)。然后,IDA 会用你提供的别名替代该寄存器的名称。如果一段代码不属于某个函数,那么,重命名这段代码中的寄存器是不可能的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论