x64汇编语言与逆向工程实战指南(四)

news2024/11/15 23:20:16

目录

  • 1. 数组的存储与遍历
    • 1.1 编写数组数据写入内存
    • 1.2 汇编循环遍历数组元素
  • 3. Lea指令
  • 4. mul指令与imul指令
    • 4.1 mul 指令
    • 4.2 imul 指令
    • 总结
  • 5. div指令
    • 5.1 div 指令的基本原理
    • 5.2 8 位除法
    • 5.3 16 位除法
    • 5.3 32 位除法
    • 特点和要求

1. 数组的存储与遍历

1.1 编写数组数据写入内存

  • 首先选中某部分地址编辑数据,这里以x64架构的 " long "类型数组为例,即每个元素占据8字节(qword)。

类比如图
在这里插入图片描述

  • 构造数组元素如下图:
    在这里插入图片描述
  • 易知,数组结构如下表
IndexAddressData
00x7FF68FE800500x11
10x7FF68FE800580x22
20x7FF68FE800600x33
30x7FF68FE800680x44
40x7FF68FE800700x55

1.2 汇编循环遍历数组元素

	mov rbx,0x7FF68FE80050               //将数组基地址(首地址)赋给 rbx寄存器保存
	mov rcx,0                           // 将 rcx寄存器作为index
loop_start:                             //循环体
	mov rax,qword ptr[rbx+rcx*8]        // 取出数组元素放入rax寄存器
	inc rcx                             //索引值自增
	cmp rcx,5                           //跳出循环判断
	jl loop_start                      //  如果 rcx < 5 ,则执行跳转

在这里插入图片描述

  • 执行结果如下:
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. Lea指令

  • lea(Load Effective Address)指令用于计算内存地址而不进行内存访问。它将地址表达式的结果加载到寄存器中。比如:
lea rax, [rbx + 4*rcx]
  • 这条指令计算 (rbx + 4*rcx) 的地址,并将结果存储到 rax 寄存器中。lea 可以用来进行地址计算、实现指针算术或调整寄存器值,但不会访问内存中的数据。

示例:

lea rdx, [rbx+rcx*8]
mov r9, qword ptr [rdx]
  • 执行前状态
    在这里插入图片描述
  • 执行结果
    在这里插入图片描述

lea 指令也可以作为计算器存储计算结果
如:仅使用 lea rax, [rbx+rdx * 3] 指令将会把 rbx+rdx*3 式子的结果存储到 rbx寄存器。

4. mul指令与imul指令

mulimul 指令用于执行乘法操作,但它们在处理有符号数和无符号数、以及结果存储方面有所不同。

4.1 mul 指令

mul 指令用于执行无符号乘法。它有不同的操作数形式和结果存储方式:

  1. 8位操作数

    mul al  ; AL 寄存器中的值与操作数(AL)相乘,结果存储在 AX 中。
    
    • 操作数:AL(8位寄存器)
    • 结果:AX(16位寄存器)
    • AX = AL * 操作数
    • 如果结果超过16位,则 AX 中高字节的值将反映结果的高位部分。
  2. 16位操作数

    mul ax  ; AX 寄存器中的值与操作数(AX)相乘,结果存储在 DX:AX 中。
    
    • 操作数:AX(16位寄存器)
    • 结果:DX:AX(32位结果)
    • DX:AX = AX * 操作数
    • 如果结果超过16位,则 DX 中的高16位包含结果的高位部分,AX 中的低16位包含结果的低位部分。
  3. 32位操作数

    mul eax  ; EAX 寄存器中的值与操作数(EAX)相乘,结果存储在 EDX:EAX 中。
    
    • 操作数:EAX(32位寄存器)
    • 结果:EDX:EAX(64位结果)
    • EDX:EAX = EAX * 操作数
    • 如果结果超过32位,则 EDX 中的高32位包含结果的高位部分,EAX 中的低32位包含结果的低位部分。

mul 指令的特点

  • mul 指令始终是无符号乘法。
  • 结果存储在特定的寄存器对中,以便捕获可能的溢出。
  • 操作数通常是寄存器中的值,但也可以是内存中的值。

4.2 imul 指令

imul 指令用于执行有符号乘法。它有几种不同的操作数形式:

  1. 单操作数形式

    imul ax  ; AX 寄存器中的值与操作数(AX)相乘,结果存储在 AX 中。
    
    • 操作数:AX(16位寄存器)
    • 结果:AX(16位寄存器)
    • AX = AX * 操作数
    • 如果结果溢出,结果会被截断,只保留低位部分。
  2. 双操作数形式

    imul eax, ebx  ; EAX 寄存器中的值与 EBX 寄存器中的值相乘,结果存储在 EAX 中。
    
    • 操作数:EAX(32位寄存器)、EBX(32位寄存器)
    • 结果:EAX(32位寄存器)
    • EAX = EAX * EBX
    • 如果结果超出32位范围,则结果会被截断,只保留低32位部分。
  3. 三操作数形式

    imul eax, ebx, 5  ; EAX 寄存器中的值与 EBX 寄存器中的值和 5 相乘,结果存储在 EAX 中。
    
    • 操作数:EAX(32位寄存器)、EBX(32位寄存器)、5(立即数)
    • 结果:EAX(32位寄存器)
    • EAX = EBX * 5
    • 这里,EBX 乘以 5,结果存储在 EAX 中。

imul 指令的特点

  • imul 指令是有符号乘法。
  • imul 的结果是有符号的,考虑了符号位。
  • 当使用多操作数形式时,imul 可以用来进行更复杂的乘法计算。

总结

  • mul 进行无符号乘法,结果存储在特定的寄存器对中(例如,DX:AXEDX:EAX)。
  • imul 进行有符号乘法,支持多种形式,包括单操作数、双操作数和三操作数形式。结果存储在目的寄存器中。
  • mulimul 都会根据操作数的大小选择适当的寄存器对来存储结果,以处理可能的溢出。

5. div指令

div 指令用于执行无符号除法操作。与 mulimul 指令不同,div 指令用于将一个数除以另一个数,并计算商和余数。它的操作方式根据操作数的大小和类型有所不同。

5.1 div 指令的基本原理

div 指令会根据被除数和除数的大小来选择不同的寄存器对,以存储商和余数。操作数是无符号的,所以结果也会是无符号的。

5.2 8 位除法

语法

div byte [memory]  ; 除数在内存中
div al             ; 除数在 AL 寄存器中
  • 被除数AX 寄存器
  • 除数:8 位操作数(如 AL 寄存器中的值或内存中的值)
  • AL 寄存器
  • 余数AH 寄存器

计算

AX / 除数 = 商 (AL)
AX % 除数 = 余数 (AH)
  • AX 寄存器的高字节 AH 和低字节 AL 共同存储被除数。
  • div 指令将 AL 除以操作数,结果存储在 AL 中,余数存储在 AH 中。

示例代码

mov al, 20      ; 被除数
mov bl, 4       ; 除数
div bl           ; AL = AL / BL, AH = AL % BL
; 结果:AL = 5, AH = 0

5.3 16 位除法

语法

div word [memory]  ; 除数在内存中
div ax             ; 除数在 AX 寄存器中
  • 被除数DX:AX 寄存器对
  • 除数:16 位操作数(如 AX 寄存器中的值或内存中的值)
  • AX 寄存器
  • 余数DX 寄存器

计算

DX:AX / 除数 = 商 (AX)
DX:AX % 除数 = 余数 (DX)
  • DX 寄存器存储被除数的高16位,AX 寄存器存储低16位。
  • div 指令将 DX:AX 除以操作数,结果存储在 AX 中,余数存储在 DX 中。

示例代码

mov ax, 1000    ; 被除数
mov bx, 25      ; 除数
div bx           ; DX:AX = AX / BX, DX = AX % BX
; 结果:AX = 40, DX = 0

5.3 32 位除法

语法

div dword [memory]  ; 除数在内存中
div eax             ; 除数在 EAX 寄存器中
  • 被除数EDX:EAX 寄存器对
  • 除数:32 位操作数(如 EAX 寄存器中的值或内存中的值)
  • EAX 寄存器
  • 余数EDX 寄存器

计算

EDX:EAX / 除数 = 商 (EAX)
EDX:EAX % 除数 = 余数 (EDX)
  • EDX 寄存器存储被除数的高32位,EAX 寄存器存储低32位。
  • div 指令将 EDX:EAX 除以操作数,结果存储在 EAX 中,余数存储在 EDX 中。

示例代码

mov eax, 100000 ; 被除数
mov ebx, 200    ; 除数
div ebx          ; EDX:EAX = EAX / EBX, EDX = EAX % EBX
; 结果:EAX = 500, EDX = 0

特点和要求

  1. 被除数和除数的大小

    • div 指令要求被除数必须通过寄存器对来存储,以适应可能的结果范围(AX 对于8位操作数,DX:AX 对于16位操作数,EDX:EAX 对于32位操作数)。
    • 除数的大小必须与被除数的大小相匹配。
  2. 除数不能为零

    • 如果除数为零,div 指令会引发除零异常,这是一个运行时错误。
  3. 结果存储

    • 商和余数分别存储在特定的寄存器中。如果结果超出寄存器的大小,div 指令会在商寄存器中存储结果的低位部分,而高位部分存储在余数寄存器中。
  4. 标志位

    • div 指令不会影响标志寄存器的标志位(如 ZFOFCFSF

在使用 div 指令时,请确保被除数的大小和除数匹配,并且除数不能为零,以避免程序异常。

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

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

相关文章

基于Web的可回收物品收购系统-计算机毕业设计源码49082

摘 要 随着电子商务和在线交易的快速发展&#xff0c;二手商品市场逐渐成为一个不可忽视的经济领域。其中&#xff0c;可回收系统的收购成为了一个关键环节&#xff0c;它不仅有助于资源的有效再利用&#xff0c;还对环境保护和可持续发展起到了积极的推动作用。Servlet可回收…

单片机中的存储器讲解

单片机中的存储器 目录 单片机中的存储器常用的存储器易失性存储器RAMSRAMDRAM 非易失性存储器ROMMask ROMPROMEPROME2PROMFlashNOR FlashNADN Flash 单片机里全局变量、局部变量、堆、栈的存储区域区域介绍栈区堆区静态区代码区常量区 内存分区分类四个区域 常用的存储器 易失…

【Linux】:实现一个简易的shell

目录 1.命令行提示符 2.命令行参数 2.1 获取命令行参数 2.2 解析命令行参数 3.判断指令类型 3.1 模拟cd命令 3.2 模拟export和echo bash的环境变量来源 4.外部指令的执行 1.命令行提示符 在我们输入指令前&#xff0c;终端界面一般有一个命令行提示符&#xff0c; …

性能优化理论篇 | swap area是个什么东西

我们知道每台计算机的内存&#xff08;RAM&#xff09;都是有限的&#xff0c;而我们的应用程序需要加载到内存才能被运行&#xff0c;如果一台机器运行多个应用程序时&#xff0c;内存可能会耗尽。Linux 系统中的“交换空间&#xff08;也称为交换分区&#xff09;”可以帮助缓…

VM相关配置及docker

NAT——VMnet8网卡 桥接——WLAN/网线 仅主机——VMnet1网卡 docker与虚拟机的区别 启动docker服务 systemctl start docker 重启 systemctl start docker关闭docker服务 systemctl stop docker.servicedocker的两大概念 镜像&#xff1a;images&#xff0c;应用程序的静态文…

nssctf-[SWPUCTF 2022 新生赛]1z_unserialize-简单的序列化题目

1. 打开题目是一段很简单的php代码 对代码进行分析&#xff0c;题目中有一个__destruct析构函数&#xff0c;这个函数是在对象被销毁的时候触发&#xff0c;那那么在这里new一下就相当于销毁一个对象&#xff0c;$a$this->lt;和$a($this->lly);相当于是$this->lt(thi…

CSS3-新特性

1.新增选择器 1.属性选择器 2.结构伪类选择器 3.伪元素选择器&#xff08;重点&#xff09; 4.CSS3 盒子模型 2.CSS3滤镜filter 3.CSS3 calc 函数 4.CSS3 过渡&#xff08;重点&#xff09;

8月18日微语报,星期日,农历七月十五

8月18日微语报&#xff0c;星期日&#xff0c;农历七月十五&#xff0c;周末愉快&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、南昌从业者谈蔬菜涨价&#xff1a;天热易变质增加损耗&#xff0c;农户收入未明显提升。 2、委员建议“行政教学分离”&#x…

后端开发刷题 | 寻找峰值【二分法】

描述 给定一个长度为n的数组nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于 2.假设 nums[-1] nums[n] −∞ 3.对于…

【精选】基于Java摄影约拍系统设计与实现(全网独一无二,最新定制)

目录 目录&#xff1a; 系统简介&#xff1a; 核心技术介绍 mysql技术介绍 IDEA编译器介绍 Springboot框架简介 springmvc框架简介 Mybatis技术简介 Node.js技术简介 Vue.js技术简介 系统数据库详细设计 系统功能设计 系统测试运行 模块测试 系统整体测试 测试过程 测试…

启明欣欣STM32开发板运行ThreadX

ThreadX是非常优秀的RTOS&#xff0c;微软收购了ThreadX后就开源了&#xff0c;后来又交给Eclipse基金会&#xff0c; 本文讲述如何在STM32上运行ThreadX&#xff0c;使用CubeMX来实现。本人环境如下&#xff0c; CM4芯片&#xff1a;STM32F407ZGT6&#xff0c;内存192KB&am…

分布式事务方案——基于两阶段提交的 XA事务

分布式事务方案——基于两阶段提交的 XA事务 在这篇文章中深入理解分布式事务中的两阶段提交&#xff08;2PC&#xff09;&#xff0c;什么是2PC&#xff0c;2PC原理是怎样&#xff1f;2PC有没有什么问题&#xff1f;解决方案&#xff1f;无法解决的情况&#xff1f; 我们详细…

24/8/18算法笔记 目标导向强化学习

目标导向强化学习&#xff08;Goal-Oriented Reinforcement Learning&#xff0c;简称GORL&#xff09;是强化学习的一个分支&#xff0c;它关注于智能体如何通过与环境的交互来实现特定的目标或任务。与传统的强化学习不同&#xff0c;目标导向强化学习更加关注目标的设定和达…

图像数据处理13

三、空域滤波 3.1滤波器的基本概念 什么是滤波&#xff1f; 简单来说就是从干扰信号中提取出有用的信号 3.1.1空域滤波&#xff08;Spatial Domain Filtering&#xff09; 空域滤波适用于简单的滤波任务&#xff0c;直接对图像的像素空间进行操作。它通过对图像中的每个像…

如何选择流量与商业潜力兼备的SEO关键词?

如何选择流量与商业潜力兼备的SEO关键词&#xff1f; 你选择的关键词可以成就或破坏你的SEO活动。 如果你明智地选择关键词&#xff0c;那么你制作的内容将有可能月复一月地吸引有价值的自然搜索流量。如果你选择了错误的关键词&#xff0c;你的内容将只能吸引低价值的流量&a…

Java流程控制07:增强for循环

本节内容视频链接&#xff1a;Java流程控制10&#xff1a;增强for循环_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p42&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的增强for循环&#xff08;‌也称为“for-each”循环&#xff09;‌是…

实用好软-----电脑端好用的免费音乐下载小工具 简单 快速

目前很多很多音乐软件都是收费的。要么是试听。前段时间分享了一款嗅探工具感觉很不错。今天分享的这款小工具超小。下载只有3M大小。解压后运行窗口简单。直接输入歌曲名字即可搜索出来。然后选择下载即可 界面 测试了下还是比较好用的。而且下载很快 &#xff0c;不过软件显…

Ajax-02.Axios

Axios入门 1.引入Axios的js文件 <script src"js/axios-0.18.0.js"></script> Axios 请求方式别名: axios.get(url[,config]) axios.delete(url[,config]) axios.post(url[,data[,config]]) axios.put(url[,data[,config]]) 发送GET/POST请求 axios.get…

PROLOG实现亲属关系小型演绎数据库

问题 试编写一个描述亲属关系的PROLOG程序&#xff0c;然后给出一些事实数据&#xff0c;建立一个小型演绎数据库。 代码实现 % 基本事实 father(john, mike). father(john, lisa). father(boluo, ana). father(boluo, peter).mother(mary, mike). mother(mary, lisa). mother…

大厂进阶五:React源码解析之深度剖析Diff算法

本文主要针对React源码进行解析&#xff0c;内容有&#xff1a; 1、Diff算法原理、两次遍历 2、Diff瓶颈及限制 3、Diff更新之单节点和多节点原理 一、Diff源码解析 以下是关于 React Diff 算法的详细解析及实例&#xff1a; 1、React Diff 算法的基本概念和重要性 1.1 概念…