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

目录

  • 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.rhkb.cn/news/403073.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day28-lsync服务+scp命令

假设nfs服务器挂了&#xff0c;就要走backup服务器也部署nfs 这种情况下&#xff0c;rsync和nfs要用到同一个文件夹&#xff0c; 所以他俩管理文件夹权限必须一样 1. lsyncrsyncnfs rsync服务 10.0.0.41 1.安装rsync [rootbackup:~]#yum -y install rsync 2.配置rsync[root…

2024年8月18日历史上的今天大事件早读

648年8月18日 唐初名相房玄龄逝世 1850年8月18日 法国作家巴尔扎克逝世 1868年8月18日 英法天文学家发现“氦”元素 1905年8月18日 反清革命组织共进会成立 1914年8月18日 美国总统宣布在“一战”中保持中立 1925年8月18日 国民革命军正式组建 1926年8月18日 北伐军攻克汀…

Open3D 格网法计算点云的占地面积

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2数据显示 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概…

详解语义安全(semantically secure)

目录 一. 引入 二. 密文与明文 2.1 通俗性理解 2.2 定理 2.3 定理理解 三. 语义安全的第一个版本 3.1 基本理解 3.2 定理 3.3 定理理解 四. 语义安全的第二个版本 4.1 直观解释 4.2 小结 一. 引入 密码学中安全加密要求&#xff1a;敌手&#xff08;adversary&…

串(4/6)

目录 1. 串的概念及应用实例 1.1 串的定义 1.2 应用实例 2. 串的基本操作 2.1 创建和读取 2.2 串的拼接 2.3 串的比较 2.4 插入和删除 2.5 查找子串 3. 串的存储结构及实现 3.1 顺序存储结构 3.2 链式存储结构 3.3 存储结构的选择 4. 串的模式匹配算法 4.1 朴素匹…

Hive3:常用的内置函数

1、查看函数列表 -- 查看所有可用函数 show functions; -- 查看count函数使用方式 describe function extended count;2、数学函数 -- round 取整&#xff0c;设置小数精度 select round(3.1415926); -- 取整(四舍五入) select round(3.1415926, 4); -- 设置小数精度4位(四…

应急响应-DDOS-典型案例

某单位遭受DDoS攻击事件如下 事件背景 2019年2月17日&#xff0c;某机构门户网站无法访问&#xff0c;网络运维人员称疑似遭受DDoS攻击&#xff0c;请求应急响应工程师协助。 事件处置 应急响应工程师在达到现场后&#xff0c;通过查看流量设备&#xff0c;发现攻击者使用僵…

汇编语言:call、call far ptr、call word ptr、call dword ptr、call 寄存器

引言 call指令是转移指令&#xff0c;CPU执行call指令&#xff0c;进行两步操作&#xff1a; &#xff08;1&#xff09;将当前IP或当前CS和IP压入栈中 &#xff08;2&#xff09;转移。call指令不能短转移&#xff0c;除此之外&#xff0c;call指令转移的方法跟jmp指令的原理…

Java流程控制09:练习题:打印三角形

本节视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p44&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p44&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 通过嵌套for循环可以实现打印三角形&#xff…

使用C#禁止Windows系统插入U盘(除鼠标键盘以外的USB设备)

试用网上成品的禁用U盘的相关软件&#xff0c;发现使用固态硬盘改装的U盘以及手机等设备&#xff0c;无法被禁止&#xff0c;无奈下&#xff0c;自己使用C#手搓了一个。 基本逻辑&#xff1a; 开机自启&#xff1b;启动时&#xff0c;修改注册表&#xff0c;禁止系统插入USB存…

银河麒麟服务器操作系统Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤

银河麒麟服务器操作系统 Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤 一、准备工作1. 下载ISO镜像2. 制作安装介质3. 设置BIOS 二、安装过程1. 启动系统2. 选择安装语言3. 选择安装配置4. 配置root密码与创建用户5. 开始安装6. 重启系统7. 同意许可协议 三、系…

通义千问( 四 ) Function Call 函数调用

4.2.function call 函数调用 大模型在面对实时性问题、私域知识型问题或数学计算等问题时可能效果不佳。 您可以使用function call功能&#xff0c;通过调用外部工具来提升模型的输出效果。您可以在调用大模型时&#xff0c;通过tools参数传入工具的名称、描述、入参等信息。…

C语言(16)——初识单链表

1.链表的概念及结构 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 结构图&#xff1a; 补充说明&#xff1a; 1、链式机构在逻辑上是连续的&#xff0c;在物理结构上不⼀定连续 2、…

Oracle Java JDK 21 下载地址及安装教程

Oracle JDK 21 官方地址 https://www.oracle.com/java/technologies/downloads/#java21 1. Linux 版本 ARM64 Compressed Archive https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz ARM64 RPM Package https://download.oracle.com/java/21/late…

Python爬虫图片:从入门到精通

在数字化时代&#xff0c;图片作为信息传递的重要媒介之一&#xff0c;其获取和处理变得越来越重要。Python作为一种功能强大且易于学习的编程语言&#xff0c;非常适合用来编写爬虫程序&#xff0c;帮助我们自动化地从互联网上获取图片资源。本文将从基础到高级&#xff0c;详…

【qt】跳转到另一个界面

如何在一个界面跳转到另一个界面呢&#xff1f; 1.具体步骤 1.先新建一个界面 2.选择qt设计师界面 3.选择W 4.新界面名称 5.界面设计 因为我们要实现通信&#xff0c;需要一个发送信息栏&#xff0c;一个发送按钮&#xff0c;一个清空发送栏按钮 6.实现跳转 我们可以参…

python 已知x+y=8 求x*y*(x-y)的最大值

先用导数求解 已知xy8 求xy(x-y)的最大值 令y8-x 则 f(x)x⋅(8−x)⋅(x−(8−x))x⋅(8−x)⋅(2x−8) 导数方程为 f(x)-3x^2 24x - 32 求方程 − 3 x 2 24 x − 32 0 -3x^2 24x - 32 0 −3x224x−320 的根。 首先&#xff0c;我们可以尝试对方程进行因式分解。观察…

Airtest 的使用

Airtest 介绍 Airtest Project 是网易游戏推出的一款自动化测试框架&#xff0c;其项目由以下几个部分构成 Airtest : 一个跨平台的&#xff0c;基于图像识别的 UI 自动化测试框架&#xff0c;适用于游戏和 App &#xff0c; 支持 Windows, Android 和 iOS 平台&#xff0c…

鸿蒙应用程序框架基础

鸿蒙应用程序框架基础 应用程序包基础知识应用的多Module设计机制Module类型 Stage模型应用程序包结构开发态包结构编译包形态发布台包结构选择合适的包类型 应用程序包基础知识 应用的多Module设计机制 **支持模块化开发&#xff1a;**一个应用通常会包含多种功能&#xff0…

为什么MCU I2C波形中会出现的脉冲毛刺?

在I2C的波形中&#xff0c;经常会发现有这样的脉冲毛刺&#xff0c;会被认为是干扰或者器件不正常。 看到这个波形时&#xff0c;可以先数一下出现在第几个clock的位置&#xff0c;如果出现在第9个clock的低电平期间&#xff0c;就不是干扰或者器件异常导致。 在I2C的协议中&a…