记录一下 idapython 里面一些常用的数据类型
op.type 类型和值对应表
类型名称 | 整数值 | 描述 |
---|
o_void | 0 | 没有操作数。 |
o_reg | 1 | 寄存器直接操作数。 |
o_mem | 2 | 内存地址直接操作数(内存变量/全局变量地址)。 |
o_phrase | 3 | 寄存器间接寻址。 |
o_displ | 4 | 寄存器加偏移量(带偏移的间接寻址)。 |
o_imm | 5 | 立即数操作数。 |
o_far | 6 | 远跳转地址。 |
o_near | 7 | 近跳转地址。 |
o_idpspec0 | 8 | 处理器特定的操作数类型 0(取决于 CPU 架构)。 |
o_idpspec1 | 9 | 处理器特定的操作数类型 1。 |
o_idpspec2 | 10 | 处理器特定的操作数类型 2。 |
o_idpspec3 | 11 | 处理器特定的操作数类型 3。 |
o_idpspec4 | 12 | 处理器特定的操作数类型 4。 |
o_idpspec5 | 13 | 处理器特定的操作数类型 5。 |
o_last | 14 | 保留类型,不用于实际指令。 |
op 的常用字段
字段名 | 描述 |
---|
op.type | 操作数的类型(整数值,对应 o_reg, o_imm 等类型)。 |
op.addr | 内存地址(适用于 o_mem, o_displ, o_far, o_near 类型)。 |
op.value | 立即数值(适用于 o_imm 类型)。 |
op.reg | 寄存器编号(适用于 o_reg, o_phrase, o_displ 类型)。 |
op.specval | 特殊值,通常与处理器架构相关,用于表示附加信息。 |
op.offb | 偏移量的字节偏移(适用于 o_displ 和 o_phrase 类型)。 |
op.dtype | 数据类型(例如 dt_byte, dt_word, dt_dword 等,用于区分数据的大小)。 |
op.n | 操作数编号(0 表示第一个操作数,1 表示第二个操作数,以此类推)。 |
每种 op.type 对应的字段说明
op.type | 类型名称 | 关键字段使用 |
---|
o_void | 无操作数 | 无字段使用。 |
o_reg | 寄存器 | op.reg: 寄存器编号。例如 eax。 |
o_mem | 内存地址 | op.addr: 内存地址(全局变量/内存变量)。 |
o_phrase | 寄存器间接寻址 | op.reg: 基础寄存器编号。 op.offb: 偏移量字节的偏移。 |
o_displ | 带偏移间接寻址 | op.reg: 基础寄存器编号。 op.addr: 偏移地址。 op.offb: 偏移量字节的偏移。 |
o_imm | 立即数 | op.value: 立即数值。 |
o_far | 远跳转 | op.addr: 跳转地址。 op.specval: 可能包含额外段选择器信息(视处理器架构而定)。 |
o_near | 近跳转 | op.addr: 跳转地址。 |
o_idpspec0-5 | 处理器特定类型 | op.specval: 通常与具体的处理器架构相关,存储附加信息。 |
insn_t 的主要字段
字段名 | 类型 | 描述 |
---|
ea | ea_t | 指令的有效地址(Effective Address),即指令在程序中的位置。 |
size | uint32 | 指令的字节长度,以字节为单位。 |
itype | uint16 | 指令类型/编号,表示该指令的操作(例如 mov, add 等)。 |
auxpref | uint32 | 指令的辅助属性,用于存储与处理器架构相关的额外信息。 |
segpref | uint16 | 段相关属性,通常与分段架构的指令有关(例如 x86 分段寄存器)。 |
insnpref | uint8 | 指令前缀,表示指令的修饰信息(例如 rep, lock 等 x86 前缀)。 |
flags | uint16 | 指令标志,表示该指令的一些状态(例如是否已被反汇编)。 |
ops | op_t[UA_MAXOP] | 操作数数组,最多包含 UA_MAXOP(通常是 6 个)操作数。 |
insn_t 的关键字段详解
- ea (Effective Address):
- 指令在内存中的地址。
- 对于每条指令,ea 是其所在代码段中的偏移地址。
- 例如,0x401000 表示该指令位于地址 0x401000。
- size:
- 当前指令的字节长度。
- 例如,mov eax, ebx 在 x86 上可能占用 2 个字节(89 D8)。
- itype:
- 指令类型,表示当前指令的操作。
- 对应处理器架构定义的指令集枚举值,例如 x86 的 NN_mov(值为某个整数)。
- 通过 idaapi.get_canon_mnem(insn.itype) 获取指令的助记符字符串。
- auxpref:
- 辅助属性,用于存储指令的额外信息。
- 例如,在 ARM 架构中,这可能包含条件码(如 EQ, NE)。
- segpref:
- 与分段架构相关的属性。
- 在 x86 架构中,这可能表示段寄存器(如 CS, DS)。
- insnpref:
- 指令前缀信息。
- 例如,x86 架构中使用的 rep 或 lock 前缀。
- flags:
- 指令的标志信息。
- 表示一些状态位,例如指令是否是合法的机器码。
- ops:
- 操作数数组,每个操作数是一个 op_t 类型。
- 包含所有操作数的信息,如类型、值、地址等。
- 最多支持 UA_MAXOP 个操作数(通常是 6 个)。
寄存器编号与名称列表 (x86)
编号 | 寄存器名称 |
---|
0 | eax |
1 | ecx |
2 | edx |
3 | ebx |
4 | esp |
5 | ebp |
6 | esi |
7 | edi |
8 | eip |
9 | ax |
10 | cx |
11 | dx |
12 | bx |
13 | sp |
14 | bp |
15 | si |
16 | di |
17 | al |
18 | cl |
19 | dl |
20 | bl |
21 | ah |
22 | ch |
23 | dh |
24 | bh |
寄存器编号与名称列表 (x64)
编号 | 寄存器名称 |
---|
0 | rax |
1 | rcx |
2 | rdx |
3 | rbx |
4 | rsp |
5 | rbp |
6 | rsi |
7 | rdi |
8 | r8 |
9 | r9 |
10 | r10 |
11 | r11 |
12 | r12 |
13 | r13 |
14 | r14 |
15 | r15 |
16 | rip |
17 | eax |
18 | ecx |
19 | edx |
20 | ebx |
21 | esp |
22 | ebp |
23 | esi |
24 | edi |
25 | r8d |
26 | r9d |
27 | r10d |
28 | r11d |
29 | r12d |
30 | r13d |
31 | r14d |
32 | r15d |
33 | ax |
34 | cx |
35 | dx |
36 | bx |
37 | sp |
38 | bp |
39 | si |
40 | di |
41 | r8w |
42 | r9w |
43 | r10w |
44 | r11w |
45 | r12w |
46 | r13w |
47 | r14w |
48 | r15w |
49 | al |
50 | cl |
51 | dl |
52 | bl |
53 | ah |
54 | ch |
55 | dh |
56 | bh |
57 | r8b |
58 | r9b |
59 | r10b |
60 | r11b |
61 | r12b |
62 | r13b |
63 | r14b |
64 | r15b |