IDAPython 小记
carbofish

记录一下 idapython 里面一些常用的数据类型

op.type 类型和值对应表

类型名称整数值描述
o_void0没有操作数。
o_reg1寄存器直接操作数。
o_mem2内存地址直接操作数(内存变量/全局变量地址)。
o_phrase3寄存器间接寻址。
o_displ4寄存器加偏移量(带偏移的间接寻址)。
o_imm5立即数操作数。
o_far6远跳转地址。
o_near7近跳转地址。
o_idpspec08处理器特定的操作数类型 0(取决于 CPU 架构)。
o_idpspec19处理器特定的操作数类型 1。
o_idpspec210处理器特定的操作数类型 2。
o_idpspec311处理器特定的操作数类型 3。
o_idpspec412处理器特定的操作数类型 4。
o_idpspec513处理器特定的操作数类型 5。
o_last14保留类型,不用于实际指令。

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 的主要字段

字段名类型描述
eaea_t指令的有效地址(Effective Address),即指令在程序中的位置。
sizeuint32指令的字节长度,以字节为单位。
itypeuint16指令类型/编号,表示该指令的操作(例如 mov, add 等)。
auxprefuint32指令的辅助属性,用于存储与处理器架构相关的额外信息。
segprefuint16段相关属性,通常与分段架构的指令有关(例如 x86 分段寄存器)。
insnprefuint8指令前缀,表示指令的修饰信息(例如 rep, lock 等 x86 前缀)。
flagsuint16指令标志,表示该指令的一些状态(例如是否已被反汇编)。
opsop_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)

编号寄存器名称
0eax
1ecx
2edx
3ebx
4esp
5ebp
6esi
7edi
8eip
9ax
10cx
11dx
12bx
13sp
14bp
15si
16di
17al
18cl
19dl
20bl
21ah
22ch
23dh
24bh

寄存器编号与名称列表 (x64)

编号寄存器名称
0rax
1rcx
2rdx
3rbx
4rsp
5rbp
6rsi
7rdi
8r8
9r9
10r10
11r11
12r12
13r13
14r14
15r15
16rip
17eax
18ecx
19edx
20ebx
21esp
22ebp
23esi
24edi
25r8d
26r9d
27r10d
28r11d
29r12d
30r13d
31r14d
32r15d
33ax
34cx
35dx
36bx
37sp
38bp
39si
40di
41r8w
42r9w
43r10w
44r11w
45r12w
46r13w
47r14w
48r15w
49al
50cl
51dl
52bl
53ah
54ch
55dh
56bh
57r8b
58r9b
59r10b
60r11b
61r12b
62r13b
63r14b
64r15b
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
总字数 54k 访客数 访问量