前言

笔者曾经用过 7.7(继承了来自学长55桑的诸多插件)8.3,但都只是草草用过,近日沉迷于pwn之乐趣,使用频率大大增加,恰巧自己新提了全新款IDA Pro 9.0 SP1(似乎是首个不用使用者自己判断32位/64位的版本),深入了解后也被IDA的强大功能折服。
遂从零开始记录使用笔记

常用快捷键

空格键: 切换 文本视图图表视图
ESC: 返回上一个操作地址。(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)
G: 直接跳转到某个地址
N: 对符号重命名 Y: 更改变量的类型
H: 转换16进制
T: 解析结构体偏移 M: 转换为枚举类型常量
冒号键: 常规注释
分号键: 可重复注释。在反汇编后的界面中写下注释
/ : 在反编译后伪代码的界面中写下注释
\: 在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多
Alt+M: 添加 标签
Ctrl+M: 查看 标签
ctrl+w: 保存 ida 数据库
ctrl+shift+w:拍摄 IDA 快照
Ctrl+S: 查看 段信息。选择某个数据段,直接进行跳转
ctrl+鼠标滚轮:能够调节流程视图的大小
shift+f12:可以打开 string 窗口,一键找出所有的字符串。
X ( ctrl+X ): 对着某个函数、变量按该快捷键,可以查看它的交叉引用。
F5: 查看 伪代码,即 一键反汇编
Shift +F5:打开签名窗口
ALT+L:标记(Lable)
ALT+G:转换局部变量为结构体 ALT+Enter:跳转到新的窗口
Alt+T: 文本搜索
Alt+B: 二进制搜索
shift + f7 显示段窗口

Hex View 窗口

显示16进制,默认为只读状态,可以用快捷键F2对数据区域(绿色字符区域)在只读和编辑两种状态切换。

image-20250327203731853

常用操作

创建数组

在操作IDA的时候,经常会遇到需要创建数组的情况,尤其是为了能方便我们看字符串的时候,创建数组显得非常必要,以下我随便找了个数据来创建数组

首先点击选中你想要转换成数组的一块区域:

image-20250327204318565

  • Array element size 这个值表示各数组元素的大小(这里是1个字节),是根据你选中的数据值的大小所决定的
  • Array size 表示数组元素的数量,一般都根据你选定的自动产生默认值
  • Items on a line 这个表示指定每个反汇编行显示的元素数量,它可以减少显示数组所需的空间
  • Element print width 这个值用于格式化,当一行显示多个项目时,他控制列宽
  • Use “dup” construct :使用重复结构,这个选项可以使得相同的数据值合并起来,用一个重复说明符组合成一项
  • Signed elements 表示将数据显示为有符号数还是无符号数
  • Display indexes 显示索引,使得数组索引以常规的形式显示,如果选了这个选项,还会启动右边的Indexes选项栏,用于选择索引的显示格式
  • Create as array 创建为数组,这个一般默认选上的

创建好了以后,就变成了这样:image-20250327204404132

分支块

  • 重命名
  • 折叠

创建结构体

快捷键Insert

image-20250327204713332

在弹出的窗口中,可以编辑结构体的名字
这底下有三个复选框,

  • 第三个表示是否创建联合体。
    需要注意的是,结构体的大小是它所包含的字段大小的总和,而联合体的大小则等于其中最大字段的大小

在单击ok以后,就定好了一个空的结构体:

image-20250327214552718

image-20250328084202610

void **heap_list
void *heaplist[]
//选其一

IDA常见命名意义

IDA 经常会自动生成假名字。他们用于表示子 “函数,程序地址和数据”。

根据不同的类型和值假名字有不同前缀

sub 指令和子函数起点
locret 返回指令
loc 指令

off 数据,包含偏移量
seg 数据,包含段地址值

asc 数据,ASCII字符串
byte 数据,字节(或字节数组)

word 数据,16位数据(或字数组)
dword 数据,32位数据(或双字数组)

qword 数据,64位数据(或4字数组)
flt 浮点数据,32位(或浮点数组)

dbl 浮点数,64位(或双精度数组)
tbyte 浮点数,80位(或扩展精度浮点数)

stru 结构体(或结构体数组)
algn 对齐指示unk 未处理字节

IDA 中有常见的说明符号,如 db、dw、dd 分别代表了1个字节、2个字节、4个字节

  • sub_xxxxxx:地址xxxxxx处的子例程
  • loc_xxxxxx:地址xxxxxx处的一个指令。
  • byte_xxxxxx:位置xxxxxx处的8位数据。
  • word_xxxxxx:位置xxxxxx处的16位数据
  • dword_xxxxxx:位置xxxxxx处的32位数据,
  • unk_xxxxxx:位置xxxxxx处的大小未知的数据。