IDA Pro 权威指南学习笔记(十三) - 基本代码转换
IDA提供的代码转换包括:
1.将数据转换为代码
2.将代码转换为数据
3.指定一个指令序列为函数
4.更改现有函数的起始或结束地址
5.更改指令操作数的显示格式
代码显示选项
通过 Options -> General 命令打开“IDA Options”对话框,并选择“Disassembly”选项卡
右上角的 Display disassembly line parts(显示反汇编行部分)区域提供的选项,可以对反汇编行进行自定义
IDA 反汇编文本视图会默认选择行前缀、注释和可重复注释
Line prefixes 为行前缀,行前缀是每个反汇编行的 section:address 部分
如果不选这个选项,每个反汇编行将不会显示行前缀(图形视图的默认设置)
Stack Pointer 为栈指针
选择该选项,IDA 将会显示栈指针在每个函数执行过程中的相对变化
这有助于识别调用约定方面的差异(例如,IDA 可能不知道某个特殊的函数使用的是 stdcall 调用约定),或者确定对栈指针的不寻常操纵
Comments 为注释,Repeatable comments 为可重复注释
取消任何一个选项,IDA 将不会显示相应类型的注释
Auto comments 为自动注释
IDA 可能会为某些指令类型自动添加注释,这种注释可以作为一种提醒,以帮助用户了解特殊指令的行为
IDA 不会为 x86 mov 等简单的指令添加注释
用户注释优先于自动注释
Bad instructions <BAD> marks 为无效指令 <BAD> 标记
IDA 可以标记出处理器认为合法,但一些汇编器可能无法识别的指令,如未记入文档的 CPU 指令(而非非法指令)
IDA 会将这种指令作为一个数据字节序列进行反汇编,并将未记入文档的指令显示为一段以 <BAD> 开头的注释,目的是生成大多数汇编程序都可以处理的反汇编代码
Numbers of opcode bytes 为操作码字节数
指定 IDA 应为每个指令显示的机器语言字节的数量,选择性地查看与汇编语言指令混杂在一起的机器语言字节
不管指令多长,IDA 都会在反汇编代码清单中为指定的字节数预留显示空间,而将反汇编代码行的剩余部分移向右边,从而为指定的操作码字节数提供空间
+ 号表示:根据当前设置,该位置的指令过长,因而无法完整显示
格式化指令操作数
右击反汇编窗口中的任何常量
菜单提供的选项可将常量 41h 重新格式化成十进制、八进制或二进制值
常量 41h 属于 ASCII 可打印常量,菜单中还提供了一个选项,可将该常量格式化成一个字符常量,快捷键为 R
常量可能是使用了 #define 语句(或其等效语句)的结果,也可能属于一组枚举常量
如果编译器已经完成对源代码的编译,它就不再可能确定源代码使用的是符号常量、文字常量还是数字常量
可以通过常量值的上下文菜单中的 Use standard symbolic constant(使用标准符号常量)选项来访问这些常量
快捷键为 M
这是所有 IDA 认为与 0AH 相等的常量
根据我们尝试格式化的常量值进行过滤后,这个对话框中的常量从IDA的内部常量列表导入
标准常量列表可用于确定某个特殊的常量是否与一个已知的名称有关,使我们免于在 API 文档中搜索潜在的匹配项
数据与代码互相转换
数据字节可能被错误地归类为代码字节,并被反汇编成指令
代码字节可能被错误地归类为数据字节,并被格式化成数据值
对反汇编代码重新格式化之前,首先必须删除其当前的格式(代码或数据)
右击想要取消定义的项目,选择 Undefine,即可取消函数、代码或数据的定义,快捷键为 U
可以使用 Edit -> Undefine
取消某个项目的定义后,其基础字节将作为原始字节值重新格式化
在执行取消定义操作之前,使用“单击并拖动”操作选择一个地址范围,可以取消大范围内的定义
取消这个函数的定义将得到下面这些未分类的字节
要反汇编一组未定义的字节,右击其中的第一个字节,在菜单中选择 Code,快捷键为 C,也可以使用 Edit -> Code
可以使用 Edit -> Data 将代码转换为数据,快捷键为 D