- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
1. 串流操作指令简介
2. 串流指令及其操作解析
2.1 DF(方向标志)
设置和清除
2.2 STOS(存储串操作)
指令格式
操作过程
应用场景
示例汇编
2.3 MOVS(移动串操作)
指令格式
操作过程
应用场景
示例汇编
2.4 CMPS(比较串操作)
指令格式
操作过程
应用场景
示例汇编
2.5 SCAS(扫描串操作)
指令格式
操作过程
应用场景
示例汇编
2.6 LODS(加载串操作)
指令格式
操作过程
应用场景
示例汇编
3. 串流指令在逆向工程中的应用
3.1 高效字符串操作
示例:优化 strstr
3.2 数据解密和加密
3.3 内存块分析
利用 MOVS 和 STOS 检测内存块清零或拷贝
4. 拓展知识点
4.1 Flag 标志的作用
串流操作指令是一类通过处理器支持的大量数据操作指令,用于快速实现字符串处理、内存块复制、比较、查找等操作。
1. 串流操作指令简介
串流操作指令主要用于字符串和内存数据块的操作,在汇编层级上它们可以显著提高操作效率:
-
串流操作依赖方向标志(DF):
- DF = 0:地址递增(从低地址到高地址)。
- DF = 1:地址递减(从高地址到低地址)。
- DF 可通过
CLD
(清除 DF) 和STD
(设置 DF)指令控制。
-
指令作用范围:
- 数据存储(
STOS
指令)。 - 数据加载(
LODS
指令)。 - 数据传输(
MOVS
指令)。 - 数据比较(
CMPS
指令)。 - 数据扫描(
SCAS
指令)。
- 数据存储(
2. 串流指令及其操作解析
2.1 DF(方向标志)
设置和清除
DF
是 EFLAGS 寄存器中的一个标志位:DF=0
:地址递增。DF=1
:地址递减。
- 设置和清除方式:
cld ; 清除DF,设置为递增。
std ; 设置DF,变为递减。
2.2 STOS(存储串操作)
指令格式
STOSB / STOSW / STOSD
操作过程
- 将通用寄存器(
AL
、AX
或EAX
)的内容存储到ES:DI
指定的内存位置。 - 根据
DF
将DI
地址增加或减少。
应用场景
- 数据块填充,例如初始化字符串或内存。
示例汇编
mov eax, 0x41414141 ; 将 'AAAA' 填充到 EAX
mov edi, dest ; 指向目标内存地址 mov ecx, 10 ; 循环计数器,填充10个单位
rep stosd ; 重复存储 EAX 的值到目标内存
2.3 MOVS(移动串操作)
指令格式
MOVSB / MOVSW / MOVSD
操作过程
- 将
DS:SI
指向的内容移动到ES:DI
指向的地址。 - 根据
DF
自动调整SI
和DI
(增加或减少)。
应用场景
- 内存块拷贝操作,例如复制字符串或数组。
示例汇编
mov esi, src ; 源数据地址
mov edi, dest ; 目标数据地址
mov ecx, 20 ; 要复制的字节数 cld ; 地址递增模式
rep movsb ; 重复逐字节移动数据
2.4 CMPS(比较串操作)
指令格式
CMPSB / CMPSW / CMPSD
操作过程
- 比较
DS:SI
和ES:DI
指向的两个内存值。 - 设置 ZF 标志:
ZF = 1
:源和目标数据相等。ZF = 0
:源和目标数据不相等。
- 根据
DF
更新SI
和DI
。
应用场景
- 字符串或数据块比较,例如验证数据相等性。
示例汇编
mov esi, str1 ; 源字符串地址
mov edi, str2 ; 目标字符串地址
mov ecx, 10 ; 要比较的字节数
cld
repe cmpsb ; 按字节比较,ZF 设置表示相等 jz equal ; 如果相等,跳转到 equal 标签
2.5 SCAS(扫描串操作)
指令格式
SCASB / SCASW / SCASD
操作过程
- 将
AL
(或AX
、EAX
)与ES:DI
指向的数据比较。 - 设置标志位:
ZF=1
:表示目标数据等于寄存器数据。
- 根据
DF
自动调整DI
。
应用场景
- 字符串中查找特定字符或模式。
示例汇编
mov eax, 0x00 ; 查找字节值 0x00
mov ecx, length ; 要扫描的字节数
cld
repne scasb ; 按字节扫描,直到找到匹配的值 jnz not_found ; 未找到值则跳转到 not_found
2.6 LODS(加载串操作)
指令格式
LODSB / LODSW / LODSD
操作过程
- 将
DS:SI
指向的数据加载到通用寄存器(AL
、AX
、EAX
)。 - 根据
DF
自动调整SI
。
应用场景
- 从内存中逐字节、逐字或逐双字加载数据到寄存器。
示例汇编
mov esi, src ; 指向数据源地址 lodsb ; 加载下一个字节到 AL
3. 串流指令在逆向工程中的应用
3.1 高效字符串操作
串流指令在字符串复制、查找字符等操作中使用频繁,在逆向工程中解析字符串处理逻辑时,它们是重要的分析目标。
示例:优化 strstr
strstr
(查找字符串子串)的内部实现可以基于 LODS
和 CMPS
实现:
search_loop: lodsb ; 加载源字符串中的下一个字符 cmp al, [edi] ; 与目标模式字符比较 jne not_equal repe cmpsb ; 匹配模式串中的所有字节 je found not_equal: jmp search_loop
3.2 数据解密和加密
在逆向工程中,加密过程可能通过移动、加载、比较操作结合实现:
- 通过
MOVS
实现加密后的内存复制。 - 通过
CMPS
检查数据完整性。
3.3 内存块分析
利用 MOVS
和 STOS
检测内存块清零或拷贝
例如:
memset_zero: mov edi, dest ; 指向目标内存 mov ecx, size / 4 ; 循环次数(4字节单位) xor eax, eax ; 准备清零值 rep stosd ; 重复清零内存
4. 拓展知识点
4.1 Flag 标志的作用
串流操作受 DF(方向标志) 控制:
CLD
(Clear Direction Flag):地址递增。STD
(Set Direction Flag):地址递减。