记录一下 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 |