IDAPython 小记
carbofish

记录一下 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 的关键字段详解

  1. ea (Effective Address):
    • 指令在内存中的地址。
    • 对于每条指令,ea 是其所在代码段中的偏移地址。
    • 例如,0x401000 表示该指令位于地址 0x401000。
  2. size:
    • 当前指令的字节长度。
    • 例如,mov eax, ebx 在 x86 上可能占用 2 个字节(89 D8)。
  3. itype:
    • 指令类型,表示当前指令的操作。
    • 对应处理器架构定义的指令集枚举值,例如 x86 的 NN_mov(值为某个整数)。
    • 通过 idaapi.get_canon_mnem(insn.itype) 获取指令的助记符字符串。
  4. auxpref:
    • 辅助属性,用于存储指令的额外信息。
    • 例如,在 ARM 架构中,这可能包含条件码(如 EQ, NE)。
  5. segpref:
    • 与分段架构相关的属性。
    • 在 x86 架构中,这可能表示段寄存器(如 CS, DS)。
  6. insnpref:
    • 指令前缀信息。
    • 例如,x86 架构中使用的 rep 或 lock 前缀。
  7. flags:
    • 指令的标志信息。
    • 表示一些状态位,例如指令是否是合法的机器码。
  8. 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
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
访客数 访问量