Windows逆向工程入门之串流操作指令解析与拓展

news2025/2/24 12:38:40
  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

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. 串流操作指令简介

串流操作指令主要用于字符串和内存数据块的操作,在汇编层级上它们可以显著提高操作效率:

  1. 串流操作依赖方向标志(DF)

    • DF = 0:地址递增(从低地址到高地址)。
    • DF = 1:地址递减(从高地址到低地址)。
    • DF 可通过 CLD(清除 DF) 和 STD(设置 DF)指令控制。
  2. 指令作用范围:

    • 数据存储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

操作过程
  1. 将通用寄存器(ALAX 或 EAX)的内容存储到 ES:DI 指定的内存位置。
  2. 根据 DF 将 DI 地址增加或减少。
应用场景
  • 数据块填充,例如初始化字符串或内存。
示例汇编

mov eax, 0x41414141 ; 将 'AAAA' 填充到 EAX

mov edi, dest ; 指向目标内存地址 mov ecx, 10 ; 循环计数器,填充10个单位

rep stosd ; 重复存储 EAX 的值到目标内存


2.3 MOVS(移动串操作)

指令格式

MOVSB / MOVSW / MOVSD

操作过程
  1. 将 DS:SI 指向的内容移动到 ES:DI 指向的地址。
  2. 根据 DF 自动调整 SI 和 DI(增加或减少)。
应用场景
  • 内存块拷贝操作,例如复制字符串或数组。
示例汇编

mov esi, src ; 源数据地址

mov edi, dest ; 目标数据地址

mov ecx, 20 ; 要复制的字节数 cld ; 地址递增模式

rep movsb ; 重复逐字节移动数据


2.4 CMPS(比较串操作)

指令格式

CMPSB / CMPSW / CMPSD

操作过程
  1. 比较 DS:SI 和 ES:DI 指向的两个内存值。
  2. 设置 ZF 标志:
    • ZF = 1:源和目标数据相等。
    • ZF = 0:源和目标数据不相等。
  3. 根据 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

操作过程
  1. 将 AL(或 AXEAX)与 ES:DI 指向的数据比较。
  2. 设置标志位:
    • ZF=1:表示目标数据等于寄存器数据。
  3. 根据 DF 自动调整 DI
应用场景
  • 字符串中查找特定字符或模式。
示例汇编

mov eax, 0x00 ; 查找字节值 0x00

mov ecx, length ; 要扫描的字节数

cld

repne scasb ; 按字节扫描,直到找到匹配的值 jnz not_found ; 未找到值则跳转到 not_found


2.6 LODS(加载串操作)

指令格式

LODSB / LODSW / LODSD

操作过程
  1. 将 DS:SI 指向的数据加载到通用寄存器(ALAXEAX)。
  2. 根据 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):地址递减。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文解读】《Training Large Language Models to Reason in a Continuous Latent Space》

论文链接 1. 背景与动机 语言空间与推理的矛盾 目前大多数大语言模型(LLMs)在解决复杂问题时采用链式思维(Chain-of-Thought, CoT)方法,即利用自然语言逐步推导出答案。然而,论文指出: 自然语言…

深度剖析 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…

system verilog的流操作符

流操作符&#xff0c;有分为操作对象是一整个数组和单独的数据两种&#xff0c;例如bit [7:0] a[4]和bit [31:0] b&#xff0c;前者操作对象是数组&#xff0c;后者是单独一个较大位宽的数。 流操作符有<<和>>&#xff0c;代表从右向左打包和从左向右打包。 打包的…

LLM2CLIP论文学习笔记:强大的语言模型解锁更丰富的视觉表征

1. 写在前面 今天分享的一篇论文《LLM2CLIP: P OWERFUL L ANGUAGE M ODEL U NLOCKS R ICHER V ISUAL R EPRESENTATION》&#xff0c; 2024年9月微软和同济大学的一篇paper&#xff0c; 是多模态领域的一篇工作&#xff0c;主要探索了如何将大模型融合到Clip模型里面来进一步提…

计算机毕业设计SpringBoot+Vue.jst网上超市系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

HTTP SSE 实现

参考&#xff1a; SSE协议 SSE技术详解&#xff1a;使用 HTTP 做服务端数据推送应用的技术 一句概扩 SSE可理解为&#xff1a;服务端和客户端建立连接之后双方均保持连接&#xff0c;但仅支持服务端向客户端推送数据。推送完毕之后关闭连接&#xff0c;无状态行。 下面是基于…

二分图检测算法以及最大匹配算法(C++)

上一节我们学习了有向图中的最大连通分量. 本节我们来学习二分图. 二分图是一种特殊的图结构, 能够帮助我们高效地解决这些匹配和分配问题. 本文将带你了解二分图的基本概念, 判定方法, 最大匹配算法以及实际应用场景. 环境要求 本文所用样例在Windows 11以及Ubuntu 24.04上面…

Keepalive基础

一。简介和功能 vrrp协议的软件实现&#xff0c;原生设计目的是为了高可用ipvs服务 功能&#xff1a; 1.基于vrrp协议完成地址流动 2.为vip地址所在的节点生成ipvs规则&#xff08;在配置文件中预先定义&#xff09; 3.为ipvs集群的各RS做健康状况检测 4.基于脚本调用接口…

计算机毕业设计SpringBoot+Vue.jst0图书馆管理系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略

应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…

【论文解读】TransMLA: Multi-Head Latent Attention Is All You Need

论文链接 1. 论文背景与问题动机 现代大规模语言模型&#xff08;LLM&#xff09;在推理时往往遇到通信瓶颈&#xff0c;主要原因在于自注意力机制中需要缓存大量的 Key-Value&#xff08;KV&#xff09;对。例如&#xff0c;对于 LLaMA‑65B 这种模型&#xff0c;即使采用 8…

登录-06.JWT令牌-生成和校验

一.JWT令牌的生成和校验 JWT令牌生成 想要生成JWT令牌&#xff0c;那么就要首先引入JWT令牌的相关依赖&#xff0c; <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>…

【Git】多人协作

文章目录 完成准备工作多人协作场景一场景二远程分支删除后&#xff0c;本地 git branch -a 依然能看到的解决办法 完成准备工作 在之前&#xff0c;我们所完成的工作如下&#xff1a; 基本完成 Git 的所有本地库的相关操作&#xff0c;git基本操作&#xff0c;分支理解&#…

邮件安全之发件人伪造

电子邮件工作原理 电子邮件传输过程中主要涉及到SMTP、IMAP、POP3三种协议&#xff0c;具体功能如下&#xff1a; SMTP:全称Simple Mail Transfer Protocol&#xff0c;即简单邮件传输协议&#xff0c;主要用于发送邮件&#xff0c;使用端口号25。 IMAP:全称Internet Mail Acce…

使用 AIStor 和 OpenSearch 增强搜索功能

在这篇文章中&#xff0c;我们将探讨搜索&#xff0c;特别是 OpenSearch 如何帮助我们识别模式或查看不断增长的数据中的趋势。例如&#xff0c;如果您正在查看运营数据&#xff0c;如果您的服务似乎是随机的&#xff0c;那么您需要尽可能回溯以识别模式并找出原因。这不仅适用…

【LLM】R1复现项目(SimpleRL、OpenR1、LogitRL、TinyZero)持续更新

note &#xff08;1&#xff09;未来的工作需亟待解决&#xff1a; 支持大规模 RL 训练&#xff08;PPO、GRPO 等&#xff09;的开源基础框架用于稳定训练的 GRPO 训练超参的自动化调优RL 训练数据的配比&#xff08;难度、领域、任务等&#xff09;基于 Instruct 模型训练 R…

买股票的最佳时机 - 2

买卖股票的最佳时机 III 题目描述&#xff1a; 提示&#xff1a; 1 < prices.length < 1050 < prices[i] < 105 分析过程&#xff1a; 写动态规划&#xff0c;我们需要考虑一下问题&#xff1a; 定义状态状态转移方程初始条件 遍历顺序 4种状态&#xff1a; …

Python基于flask的智慧交通可视化,大数据智慧交通数据可视化系统

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…