怎么创建一个自己的网站semir是什么品牌
- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
一、汇编指令格式基础
二、操作数类型详解
1. 立即数(Immediate)
2. 寄存器操作数(Register)
3. 内存操作数(Memory)
4. 端口操作数(Port)
三、汇编指令格式分类
1. 零操作数指令
2. 单操作数指令
3. 双操作数指令
4. 三操作数指令
四、逆向工程中的指令解析技巧
五、拓展知识点
一、汇编指令格式基础
汇编指令由操作码(Opcode)和操作数(Operand)组成,是计算机执行的最底层命令。
格式为:
操作码 [目标操作数], [源操作数]
MOV EAX, EBX ; 将EBX的值复制到EAX ADD DWORD [ESI], 0x10 ; 将ESI指向的内存地址的值加0x10
二、操作数类型详解
操作数决定了指令操作的数据来源和去向,主要分为以下四类:
1. 立即数(Immediate)
-
定义:直接编码在指令中的常数(数值或地址)。
-
特点:不可修改,常用于赋值或运算。
-
示例:
MOV EAX, 1234h ; EAX = 0x1234 ADD ECX, 0x55AA ; ECX += 0x55AA
2. 寄存器操作数(Register)
-
定义:使用CPU寄存器(如EAX、EBX等)作为数据源或目标。
-
特点:速度最快,无内存访问开销。
-
示例:
XOR EDX, EDX ; EDX = 0(清零) SHL EAX, CL ; EAX左移CL次(CL为寄存器操作数)
3. 内存操作数(Memory)
-
定义:通过内存地址访问数据,需指定地址计算方式。
-
语法:
-
直接寻址:
[地址]
MOV EAX, [0x401000] ; 将0x401000地址处的值读入EAX
-
寄存器间接寻址:
[基址寄存器 + 偏移量]
MOV EBX, [ESI + 8] ; EBX = ESI指向地址+8处的值
-
比例因子寻址(x86特有):
[基址 + 索引寄存器 * 比例因子 + 偏移]
MOV ECX, [EAX + EDX*4 + 0x10] ; 常用于数组操作
-
4. 端口操作数(Port)
-
定义:通过I/O端口与硬件交互(如键盘、磁盘控制器)。
-
指令:
IN
和OUT
。 -
示例:
IN AL, 0x60 ; 从键盘端口0x60读取一个字节到AL OUT 0x20, AL ; 将AL的值写入中断控制器端口0x20
三、汇编指令格式分类
根据操作数数量和类型,指令格式可分为以下类别:
1. 零操作数指令
-
特点:仅操作码,无显式操作数(隐含操作数)。
-
示例:
NOP ; 空操作(占用1字节) RET ; 函数返回(操作数隐含为栈顶地址)
2. 单操作数指令
-
特点:仅有一个操作数(目标或源)。
-
示例:
INC EAX ; EAX += 1 NOT DWORD [EBX] ; 对EBX指向的DWORD取反
3. 双操作数指令
-
特点:最常见格式,支持寄存器、内存、立即数组合。
-
规则:
-
目标操作数不能是立即数。
-
源和目标不能同时为内存操作数(x86限制)。
-
-
示例:
MOV EAX, [EDI] ; 合法:内存到寄存器 ADD DWORD [EBP-4], 5 ; 合法:内存 + 立即数 CMP ESI, EDX ; 合法:寄存器比较
4. 三操作数指令
-
特点:现代SIMD指令(如AVX)或特殊指令支持。
-
示例:
IMUL EAX, ECX, 16
四、逆向工程中的指令解析技巧
-
识别操作数类型
-
立即数:直接数值(如
0x401000
)。 -
寄存器:EAX、EBX等寄存器名称。
-
内存地址:方括号
[]
包裹的表达式。
-
-
内存寻址模式分析
-
静态地址:
MOV EAX, [0x404000]
(可能访问全局变量)。 -
动态计算:
MOV ECX, [EBX + ESI*4 + 8]
(典型数组或结构体访问)。
-
-
指令副作用分析
-
隐式操作数:如
MUL ECX
会修改EDX:EAX 。 -
标志寄存器影响:
CMP
指令会设置ZF、CF等标志位。
-
五、拓展知识点
-
指令编码格式(Opcode Encoding)
-
Opcode:1~3字节,决定操作类型(如
MOV
的Opcode为0x8B
)。 -
ModR/M字节:指定操作数类型(寄存器/内存)和寻址模式。
-
SIB字节(Scale-Index-Base):扩展复杂内存寻址(如比例因子)。
-
示例:
机器码:8B 45 FC 反汇编:MOV EAX, [EBP-4]
-
-
CISC与RISC架构差异
-
CISC(x86):指令长度可变,支持复杂内存操作(如
MOV [EAX+EBX*4], EDX
)。 -
RISC(ARM):指令长度固定(32位),内存操作需专用加载/存储指令(如
LDR R0, [R1]
)。
-
-
高级指令集(SIMD与特权指令)
-
SIMD指令(SSE/AVX):
PADDB XMM0, XMM1 ; 对XMM0和XMM1按字节相加
-
特权指令:
CLI ; 关闭中断(Ring 0权限) MOV CR0, EAX ; 修改控制寄存器(内核模式)
-
-
调试与反汇编工具技巧
-
动态调试(x64dbg):
-
单步执行观察指令对寄存器和内存的影响。
-
使用“内存映射”窗口查看内存操作数指向的实际数据。
-
-
静态分析(IDA Pro):
-
按
F5
生成伪代码时,注意内存寻址的变量名推断。 -
使用“交叉引用(Xref)”追踪内存或寄存器的使用路径。
-
-
-
高级语言与汇编的对应关系
-
C/C++代码:
int arr[10]; arr[3] = arr[2] + 1;
-
对应汇编:
MOV EAX, [arr + 8] ; arr[2] INC EAX MOV [arr + 12], EAX ; arr[3]
-