Windows逆向工程入门之串流操作指令解析与拓展
- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
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):地址递减。
相关文章:
Windows逆向工程入门之串流操作指令解析与拓展
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 1. 串流操作指令简介 2. 串流指令及其操作解析 2.1 DF(方向标志) 设置和清除 2.2 STOS(存储串操作) 指令格式 操作过程 应用场景 …...
【论文解读】《Training Large Language Models to Reason in a Continuous Latent Space》
论文链接 1. 背景与动机 语言空间与推理的矛盾 目前大多数大语言模型(LLMs)在解决复杂问题时采用链式思维(Chain-of-Thought, CoT)方法,即利用自然语言逐步推导出答案。然而,论文指出: 自然语言…...
topN 相似度 torch实现
目录 优化版,去重相似度 topN 欧式距离版 没有去重复, 优化版,去重相似度 import torch import torch.nn.functional as F torch.manual_seed(42) # 假设 10 条数据,每条数据的特征维度是 128 data = torch.randn(10, 128)# 计算所有数据对之间的余弦相似度 cosine_simi…...
深度剖析 C 语言函数递归:原理、应用与优化
在 C 语言的函数世界里,递归是一个独特且强大的概念。它不仅仅是函数调用自身这么简单,背后还蕴含着丰富的思想和广泛的应用。今天,让我们跟随这份课件,深入探索函数递归的奥秘。 一、递归基础:概念与思想 递归是一种…...
goredis常见基础命令
基本操作 //删除键 exists,err: rdb.Exists(ctx,"key").Result() if err!nil{panic(err) } if exists>0{err rdb.Del(ctx,"key").Err()if err!nil{panic(err)} }string类型 //设置一个键值对 //0表示没有过期时间 err:rdb.Set(ctx,"key1",…...
【Linux网络】序列化、守护进程、应用层协议HTTP、Cookie和Session
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、序列化和反序列化2、守护进程2.1 什么是进程组?2.2 什么是会话? 3、应用层协议HTTP3.1 HTTP协议3.2 HT…...
JavaScript函数-arguments的使用
在JavaScript编程语言中,函数是构建复杂逻辑和实现代码复用的关键组件。虽然现代JavaScript(尤其是ES6及之后版本)提供了更多灵活的方式来处理函数参数(如剩余参数、默认参数等),但arguments对象仍然是一个…...
Hadoop常用操作命令
在NameNode节点格式化集群 初始化集群 hdfs namenode -format启动HDFS sbin/start-dfs.sh启动yarn sbin/start-yarn.sh启动NodeManager yarn-daemon.sh start nodemanager启动DataNode hadoop-daemon.sh start datanode启动SecondaryNameNode hadoop-daemon.sh start se…...
system verilog的流操作符
流操作符,有分为操作对象是一整个数组和单独的数据两种,例如bit [7:0] a[4]和bit [31:0] b,前者操作对象是数组,后者是单独一个较大位宽的数。 流操作符有<<和>>,代表从右向左打包和从左向右打包。 打包的…...
LLM2CLIP论文学习笔记:强大的语言模型解锁更丰富的视觉表征
1. 写在前面 今天分享的一篇论文《LLM2CLIP: P OWERFUL L ANGUAGE M ODEL U NLOCKS R ICHER V ISUAL R EPRESENTATION》, 2024年9月微软和同济大学的一篇paper, 是多模态领域的一篇工作,主要探索了如何将大模型融合到Clip模型里面来进一步提…...
计算机毕业设计SpringBoot+Vue.jst网上超市系统(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
python-静态方法和类方法
Java之类的编程语言还带有静态方法,Python类也拥有与静态方法明确对应的方法。此外,Python还拥有类方法,要比静态方法更高级一些。 静态方法与Java一样,即便没有创建类的实例,静态方法也是可以调用的,当然…...
什么是手机9008模式?如何进入9008
之前给大家分享了一些有关手机刷机的知识,今天给大家讲一讲如果刷机过程中不慎变砖应该如何应对(当然了,希望大家都不会遇到)😂😄 在给手机 Root 或刷机时,线刷 9008 指的是利用 高通 9008 模式…...
嵌入式之指针
在嵌入式系统中指针是一种非常重要的概念。它们用于直接访问内存地址,能够提高程序的灵活性和效率。 一、基本概念 1. 指针的基本概念 定义:指针是一个变量,其值为另一个变量的地址。通过指针,可以间接访问和修改该变量的值。声…...
网络安全研究
1.1 网络安全面临的威胁 网络安全面临的威胁呈现出多样化和复杂化的趋势,给个人、企业和国家的安全带来了严峻挑战。以下是当前网络安全面临的主要威胁: 1.1.1 数据泄露风险 数据泄露是当前网络安全的重大威胁之一。根据国家互联网应急中心发布的《20…...
Git入门:数据模型 to 底层原理
版本控制系统(VCS)是软件开发中不可或缺的工具,而Git作为现代版本控制的事实标准,其底层设计远比表面命令更加优雅。本文将从数据模型的角度,揭示Git的核心工作原理。 Git的核心概念 1. 快照(Snapshot&am…...
openharmony中hdf框架的驱动消息机制的实现原理
openharmony中hdf框架的驱动消息机制的实现原理 在分析hdf框架时发现绕来绕去的,整体梳理画了一遍流程图,发现还是有点模糊甚至不清楚如何使用的,详细的每个点都去剖析细节又过于消耗时间,所以有时间便从功能应用的角度一块块的去…...
HTTP SSE 实现
参考: SSE协议 SSE技术详解:使用 HTTP 做服务端数据推送应用的技术 一句概扩 SSE可理解为:服务端和客户端建立连接之后双方均保持连接,但仅支持服务端向客户端推送数据。推送完毕之后关闭连接,无状态行。 下面是基于…...
二分图检测算法以及最大匹配算法(C++)
上一节我们学习了有向图中的最大连通分量. 本节我们来学习二分图. 二分图是一种特殊的图结构, 能够帮助我们高效地解决这些匹配和分配问题. 本文将带你了解二分图的基本概念, 判定方法, 最大匹配算法以及实际应用场景. 环境要求 本文所用样例在Windows 11以及Ubuntu 24.04上面…...
Keepalive基础
一。简介和功能 vrrp协议的软件实现,原生设计目的是为了高可用ipvs服务 功能: 1.基于vrrp协议完成地址流动 2.为vip地址所在的节点生成ipvs规则(在配置文件中预先定义) 3.为ipvs集群的各RS做健康状况检测 4.基于脚本调用接口…...
计算机毕业设计SpringBoot+Vue.jst0图书馆管理系统(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略
应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…...
AI大模型学习(三): LangChain(二)
Langchain构建聊天机器人 安装依赖 pip install langchain_community Chat History:它允许聊天机器人"记住"过去的互动,并在回应后续问题时考虑他们 代码 # 创建模型 from langchain_core.messages import HumanMessage from langchain_core.prompts import ChatP…...
apply的用法
apply 是一个在编程语言中常见的函数,它在不同的上下文和语言中有不同的用途。以下是 apply 在常见编程语言中的几种常见用法: 1. Python 中的 apply 方法 在 Python 中,apply 主要用于 pandas 库中的 DataFrame 或 Series 对象,…...
【论文解读】TransMLA: Multi-Head Latent Attention Is All You Need
论文链接 1. 论文背景与问题动机 现代大规模语言模型(LLM)在推理时往往遇到通信瓶颈,主要原因在于自注意力机制中需要缓存大量的 Key-Value(KV)对。例如,对于 LLaMA‑65B 这种模型,即使采用 8…...
CentOS 下安装和配置 HTTPD 服务的详细指南
CentOS 下安装和配置 HTTPD 服务的详细指南 CentOS 下安装和配置 HTTPD 服务的详细指南1. 环境准备2. 安装 HTTPD 服务2.1 更新系统2.2 安装 HTTPD2.3 启动 HTTPD 服务2.4 检查 HTTPD 服务状态 3. 配置防火墙3.1 开放 HTTP 和 HTTPS 端口3.2 验证防火墙规则 4. 配置 HTTPD4.1 主…...
VUE3中子组件改变父组件传过来的值(props)的方法和使用场景详解
在 Vue 3 中,子组件改变父组件传过来的值(props)的方法主要有以下几种:通过事件发射、使用 v-model、模拟 .sync 修饰符的功能(Vue 3 中已移除),以及使用 ref 或 reactive。下面我将结合代码示例…...
登录-06.JWT令牌-生成和校验
一.JWT令牌的生成和校验 JWT令牌生成 想要生成JWT令牌,那么就要首先引入JWT令牌的相关依赖, <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>…...
【Git】多人协作
文章目录 完成准备工作多人协作场景一场景二远程分支删除后,本地 git branch -a 依然能看到的解决办法 完成准备工作 在之前,我们所完成的工作如下: 基本完成 Git 的所有本地库的相关操作,git基本操作,分支理解&#…...
Python爬虫-破解字体加密技术
前言 本文是该专栏的第77篇,后面会持续分享python爬虫干货知识,记得关注。 字体加密是一种常见的反爬虫技术,通过自定义字体文件和字符映射来保护网页内容,防止爬虫直接获取文本信息。 在文章《Python爬虫-猫眼电影的影院数据》中,笔者有详细介绍过猫眼的相关数据采集。…...
