硬编码(三)经典变长指令一

devtools/2025/3/1 18:32:14/

我们在前两节的硬编码中学习了定长指令,接下来学习变长指令。学习变长指令要求我们学会查表:intel手册卷2A和2B部分

对于定长指令,我们通过opcode便可知该指令的长度,但是对于变长指令却是不可知的。变长指令长度由opcode,ModR/M,SIB共同决定。变长指令通常在需要操作内存的时候使用

经典变长指令

接下来我们观察一些常见的变长指令:

变长指令

汇编代码

0x88

MOV Eb, Gb

0x89

MOV Ev, Gv

0x8A

MOV Gb, Eb

0x8B

MOV Gv, Ev

G:通用寄存器

E:寄存器/内存

b:字节

v:字、双字或四字,通常由当前CPU模式决定(此处使用x86环境)

ModR/M

当指令中出现内存操作对象的时候,就需要在操作码(opcode)后面附加一个字节来进行补充说明,这个字节被称为ModR/M,其只有一个字节宽度,用于内存寻址

在本节讲解中,默认Reg/Opcode部分为Reg(寄存器),Opcode(指令)以后再说

其中,Reg部分描述指令中的G部分,即源寄存器,如下是该部分对应寄存器的表示:

images/download/attachments/1015817/image2021-11-1_21-43-22.png

Mod部分和R/M部分共同描述指令中的E部分,即目标寄存器/内存。

通过Intel操作手册中表Table 2-2便可知道ModR/M是如何使用的

images/download/attachments/1015817/image2021-11-1_21-53-38.png

手动解析指令

0x88 0x01

接下来以0x88 0x01为例,讲解如何解析变长指令

如下是0x88 0x01的解析部分:

Opcode

ModR/M

0x88 - MOV Eb, Gb

0x01

接着我们拆分ModR/M为其内部的三个部分:

Mod

Reg

R/M

0

0

0

0

0

0

0

1

然后我们开始依照Intel操作手册,一步步的分析该指令

images/download/attachments/1015817/image2021-11-1_22-9-1.png

由手册可知:

Reg:000对应寄存器AL

Mod:00和R/M:001对应[ECX]

因此我们得出结论:0x88 0x01对应的汇编代码为MOV BYTE PTR DS:[ECX], AL

0x88 0x10

接下来我们简单的解析0x88 0x10

Opcode

ModR/M

0x88 - MOV Eb, Gb

0x10

接着我们拆分ModR/M为其内部的三个部分:

Mod

Reg

R/M

0

0

0

1

0

0

0

0

通过查表可知:

Reg:010对应DL

Mod:00和R/M:001对应[EAX]

因此我们得出结论:0x88 0x10对应的汇编代码为MOV BYTE PTR DS:[EAX], DL

0x88 0x15

接下来我们简单的解析0x88 0x15

Opcode

ModR/M

0x88 - MOV Eb, Gb

0x15

接着我们拆分ModR/M为其内部的三个部分:

Mod

Reg

R/M

0

0

0

1

0

1

0

1

通过查表可知:

Reg:010对应DL

Mod:00和R/M:101对应dis32(32位立即数)

dis32跟在0x88 0x10后,现假设dis32为0x12345678

因此我们得出结论:0x88 0x10 0x12345678对应的汇编代码为MOV BYTE PTR DS:[78563412], DL

0x88 0x82

接下来我们简单的解析0x88 0x82

Opcode

ModR/M

0x88 - MOV Eb, Gb

0x82

接着我们拆分ModR/M为其内部的三个部分:

Mod

Reg

R/M

1

0

0

0

0

0

1

0

通过查表可知:

Reg:000对应AL

Mod:10和R/M:010对应[EDX] + dis32

此处假设dis32为0x12345678

因此我们得出结论:0x88 0x10 0x12345678对应的汇编代码为MOV BYTE PTR DS:[EDX + 78563412], AL

0x89 0x01

接下来我们简单的解析0x89 0x01

Opcode

ModR/M

0x89 - MOV Ev, Gv

0x01

由于我们使用的是CPU的x86环境,因此v表示32位

接着我们拆分ModR/M为其内部的三个部分:

Mod

Reg

R/M

0

0

0

0

0

0

0

1

通过查表可知:

Reg:000对应EAX

Mod:00和R/M:001对应[ECX]

因此我们得出结论:0x88 0x10对应的汇编代码为MOV DWORD PTR DS:[ECX], EAX


http://www.ppmy.cn/devtools/163690.html

相关文章

Android逆向:一文掌握JEB 的详细使用

文章目录 1. JEB 简介1.1 什么是 JEB?1.2 JEB具备以下主要功能:1.3 JEB 的应用场景2. 安装 JEB2.1 下载 JEB2.2 安装和激活3. JEB 的基本操作3.1 打开 APK 文件3.2 查看反编译代码3.3 搜索功能3.4 分析代码3.5 使用脚本扩展功能4. JEB 的高级功能4.1 反混淆4.2 脚本支持4.3 调…

字符函数和字符串函数1

1、字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h 在这里介绍一下islower函数,其他的非常相似。 函数原型: 1 int islower(int c); islo…

利用three.js在Vue项目中展示重构的stl模型文件

一、目的 为了在前端页面展示3d打印机打印过程 二、前期准备 完整模型的stl文件和模型切割成的n个stl文件 models文件夹下的文件就是切割后的stl文件 三、代码 <template><div ref"threeContainer" class"three-container"></div><…

DeepSeek-V3:AI语言模型的高效训练与推理之路

参考&#xff1a;【论文学习】DeepSeek-V3 全文翻译 在人工智能领域&#xff0c;语言模型的发展日新月异。从早期的简单模型到如今拥有数千亿参数的巨无霸模型&#xff0c;技术的进步令人瞩目。然而&#xff0c;随着模型规模的不断扩大&#xff0c;训练成本和推理效率成为了摆在…

WordPress多语言插件GTranslate

GTranslate是一个免费的WordPress多语言插件&#xff0c;它允许您将网站内容翻译成多种语言。这个插件提供了一个简单易用的界面&#xff0c;让您可以在WordPress后台直接进行翻译操作。以下是GTranslate插件的一些主要特点&#xff1a; 免费使用&#xff1a;GTranslate插件完…

2.部署kafka:9092

官方文档&#xff1a;http://kafka.apache.org/documentation.html (虽然kafka中集成了zookeeper,但还是建议使用独立的zk集群) Kafka3台集群搭建环境&#xff1a; 操作系统: centos7 防火墙&#xff1a;全关 3台zookeeper集群内的机器&#xff0c;1台logstash 软件版本: …

【MySQL】表空间丢失处理(Tablespace is missing for table 错误处理)

问题背景 最近&#xff0c;我在运行一个基于Python爬虫的项目时&#xff0c;爬虫需要频繁与MySQL数据库交互。不幸的是&#xff0c;在数据爬取过程中&#xff0c;Windows系统突然强制更新并重启。这次意外中断导致MySQL数据库的三个表格&#xff08;2022年、2023年和2024年的数…

使用 Docker 管理 Alpine 镜像的完整指南

在这篇博客中&#xff0c;我们将深入探讨如何使用 Docker 命令来拉取、保存和加载 Docker 镜像。我们将以 alpine 镜像为例&#xff0c;展示每个步骤的详细操作和输出示例。【因特殊原因可以借助外网下载镜像&#xff0c;然后导入到本地的服务器】 1. 拉取镜像 (docker pull) …