汇编语言基础及常见汇编指令

一、实验原理

x64dbg 是一款开源且免费的 Ring 3 级动态调试器,采用 QT 编写,支持 32 / 64 位程序。其反汇编引擎 BeaEngine 和 Capstone 功能极其强大,也有丰富的插件和脚本功能,且并保持更新,目前已经基本替代了 OllDbg。

软件解压后根目录存在x96dbg, 双击 x96dbg,出现三个弹窗,会生成 x96dbg.ini 文件,里面记录着 32 位和 64位 dbg 程序的路径。当需要把整个程序文件夹移动到其他路径时,最好把这个 ini 删除,重新双击让它再生成。当需要把它加到发送到菜单中的时候,也推荐添加 x96dbg,它会自动选择用 x32 还是 x64dbg 打开。

通用数据传送指令

MOV     传送字或字节. 
MOVSX  
先符号扩展,再传送. 
MOVSX  
先符号扩展,再传送. 
MOVZX  
先零扩展,再传送. 
PUSH   
把字压入堆栈
POP     把字弹出堆栈.
PUSHA  
AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. 
POPA   
DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.   
POPAD  
EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. 
BSWAP  
交换32位寄存器里字节的顺序 
XCHG    交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数) 
CMPXCHG
比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX) 
XADD   
先交换再累加.(结果在第一个操作数里) 
XLAT   
字节查表转换.----BX指向一张256字节的表的起点,
        AL为表的索引值
(0-255,即0-FFH);
        返回AL
为查表结果.([BX+AL]->AL) 

算术运算指令

ADD     加法.  
ADC     带进位加法.  
INC     加 1.  
AAA     加法的ASCII码调整.  
DAA     加法的十进制调整.  
SUB     减法.  
SBB     带借位减法.  
DEC     减 1.  
NEG     求反(以    0 减之).  
CMP     比较.(两操作数作减法,仅修改标志位,不回送结果).  
AAS     减法的ASCII码调整.  
DAS     减法的十进制调整.  
MUL     无符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),  
IMUL    整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),  
AAM     乘法的ASCII码调整.  
DIV     无符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).  
IDIV    整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算). 
AAD     除法的ASCII码调整.  
CBW     字节转换为字. (把AL中字节的符号扩展到AH中去)  
CWD     字转换为双字. (把AX中的字的符号扩展到DX中去)  
CWDE    字转换为双字. (把AX中的字符号扩展到EAX中去)  
CDQ     双字扩展. (把EAX中的字的符号扩展到EDX中去)  

DS:SI   源串段寄存器 :源串变址.  
ES:DI   目标串段寄存器:目标串变址.  
CX      重复次数计数器.  
AL/AX   扫描值.  
D标志    0表示重复操作中SI和DI应自动增量; 1表示应自动减量.  
Z标志    用来控制扫描或比较操作的结束.  

逻辑运算指令

    AND     与运算.  
    OR      或运算.  
    XOR     异或运算.  
    NOT     取反.  
    TEST    测试.(两操作数作与运算,仅修改标志位,不回送结果).  
    SHL     逻辑左移.  
    SAL     算术左移.(=SHL)  
    SHR     逻辑右移.  
    SAR     算术右移.(=SHR)  
    ROL     循环左移.  
    ROR     循环右移.  
    RCL     通过进位的循环左移.  
    RCR     通过进位的循环右移.  
              以上八种移位指令,其移位次数可达255次.  
              移位一次时, 可直接用操作码. 如 SHL AX,1.  
              移位>1次时, 则由寄存器CL给出移位次数.  
              如 MOV CL,04   SHL AX,CL  

无条件转移指令

    JMP         无条件转移指令  
    CALL        过程调用  
    RET/RETF    过程返回

条件转移指令

    JA/JNBE     不小于或不等于时转移.  
    JAE/JNB     大于或等于转移.  
    JB/JNAE     小于转移.  
    JBE/JNA     小于或等于转移.  
        以上四条,测试无符号整数运算的结果(标志C和Z).  
    JG/JNLE     大于转移.  
    JGE/JNL     大于或等于转移.  
    JL/JNGE     小于转移.  
    JLE/JNG     小于或等于转移.  
        以上四条,测试带符号整数运算的结果(标志S,O和Z).  
    JE/JZ       等于转移.  
    JNE/JNZ     不等于时转移.  
    JC          有进位时转移.  
    JNC         无进位时转移.  
    JNO         不溢出时转移.  
    JNP/JPO     奇偶性为奇数时转移.  
    JNS         符号位为 "0" 时转移.  
    JO          溢出转移.  
    JP/JPE      奇偶性为偶数时转移.  
    JS          符号位为 "1" 时转移. 

循环控制指令

    LOOP            CX不为零时循环.  
    LOOPE/LOOPZ     CX不为零且标志Z=1时循环.  
    LOOPNE/LOOPNZ   CX不为零且标志Z=0时循环.  
    JCXZ            CX为零时转移.  
    JECXZ           ECX为零时转移.  

二、指令片段内容示例

  1. 熟悉x64dbg界面, 以及调试的快捷键(F7步进,F8步过)
  2. 熟悉常见的汇编指令

在内存窗口中转到0x00406000,修改内存内容,然后运行下述汇编指令片段,并给出结果:

附指令片段:

MOV EAX, 0x00406030      (x64dbg输入时,十六进制请加前缀0X)

MOV EBX, [0x00406030]

        (观察标志位CF/OF/SF/ZF等的变化)

附指令片段:

MOV EAX, 0x00406030      (x64dbg输入时,十六进制请加前缀0X)

MOV EBX, [0x00406030]

PUSH EAX

PUSH EBX

        (观察栈内存变化)

附指令片段:

MOV EAX, 0x44332211      (x64dbg输入时,十六进制请加前缀0X)

MOV EBX, 0x88887777

XCHG EAX,EBX

        (观察寄存器内容变化)

附指令片段:

MOV EAX,0X11112222      (x64dbg输入时,十六进制请加前缀0X)

MOV EBX, 0X33334444

MOV ECX, 0X55556666

MOV EDX, 0X77778888

PUSHAD

        (观察栈内存变化)

附指令片段:

MOV AX, 0x1122      (x64dbg输入时,十六进制请加前缀0X)

MOV BX, 0x3344

ADD AX

        (观察寄存器内容变化)

附指令片段:

MOV AX, 0x1122      (x64dbg输入时,十六进制请加前缀0X)

MOV BX, 0x3344      #同时点击CF使其为1

ADC AX

        (观察寄存器内容变化)

附指令片段:

MOV AX, 0x1122      (x64dbg输入时,十六进制请加前缀0X)

MOV BX, 0x3344     

INC  AX

DEC  BX

        (观察寄存器内容变化)

附指令片段:

MOV AX, 0x0002      (x64dbg输入时,十六进制请加前缀0X)

MOV BX, 0X0002

NEG  AX

NOT  BX

        (观察寄存器内容变化)

附指令片段:

MOV AX, 0x0022      (x64dbg输入时,十六进制请加前缀0X)

MOV BX, 0X5500

MOV CX, 0X0033

MOV DX, 0X6600

AND  AX, BX

OR    CX, DX

        (观察寄存器内容变化)

附指令片段:

MOV AX, 0x0002      (x64dbg输入时,十六进制请加前缀0X)

MOV BX, 0X0200

SHL AX,2

SHR BX,2

        (观察寄存器内容变化)

三、总结 

1.如何输入汇编代码

先选择要运行的程序,然后运行到用户代码,在汇编窗口找到空白的地方,就可以按空格输入汇编代码。

2.常见的汇编寻址方式有哪些

立即寻址方式,寄存器寻址方式,直接寻址方式,寄存器间接寻址方式,寄存器相对寻址方式基址加变址寻址方式,相对基址加变址寻址方式。

3.怎样给EAX寄存器赋值为0?(请举出所有可能的方法)

  1. MOV EAX,0
  2. SUB EAX,EAX

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

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

相关文章

数字医学影像系统PACS源码,三甲以下医院都能满足,C#语言开发,C/S架构系统成熟稳定,支持二次开发项目使用。

数字医学影像系统(RIS/PACS)源码,三甲以下的医院都能满足。开发技术:C/S架构,C#开发语言,数据库服务器采用Oracle数据库。 PACS系统模块组成 : 工作站: 分诊工作站、超声工作站、放…

学习鸿蒙-应用市场申请签名

1.需要的文件概念 .cer / .p7b / .p12 / .csr HarmonyOS应用/服务通过数字证书(.cer文件)和Profile文件(.p7b文件)来保证应用/服务的完整性。在申请数字证书和Profile文件前,首先需要通过DevEco Studio来生成密钥&am…

为具有公网IPV6地址的服务器安装nextcloudAIO并使用NginxProxyManager配置反向代理

软件和硬件环境 ubuntu server 24.04,并已配置好ipv6公网地址,已安装好docker和docker-compose。一块单独的硬盘,用于单独存储nextcloud数据。(非必需)有一个能够正常解析的域名,并已配置好AAAA记录解析。…

【Linux学习】动静态库从原理到制作

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🍑动静态库🐟动静态库的制作与使用🚀生成静态库🔒生成动态库 🦌动态库的查…

Maven下载、配置以及IDEA配置Maven新建Maven项目(超详细版)

Maven下载配置: 一、下载apache-maven-3.5.2并解压 二、创建一个本地仓库 三、在解压文件中的conf文件夹中的settings.xml文件中配置本地仓库 四、环境变量配置 1.此电脑(右击)------->属性------->高级系统设置------->环境变量 2.新建MAVEN_HOME&…

IP实现https访问的教程

IP地址实现HTTPS地址访问,首先要获得浏览器可信的SSL证书,并且该SSL证书是操作系统默认根证书信任证书。那有的人问:“内网的IP地址可以吗?答案是肯定不可以的”内网的IP地址只能用自建发的SSL证书实现HTTPS,不会被浏览…

数据结构——栈(Stack)

目录 前言 一、栈的概念 1、栈的基本定义 2、栈的特性 二、栈的基本操作 1.相关操作概念 2.实现方式 (1)顺序栈 (2)链式栈 三、栈的应用 总结 前言 栈(Stack)是一种常见且重要的数据结构,它遵循…

“tcp控制协议”的理解

情景解释: 1.过程: 在用户进行网络间通信时,不管是客户端还是服务端,都会有两个缓冲区——发送缓冲区和接受缓冲区。 通过4个缓冲区进行数据交流。 用户通过write()将数据发送到他的发送缓冲区中,再传输到服务端的…

C# Winform 多窗体切换方式一

一、简介 在 Winform 开发中,多窗体的切换是一个常见的需求,比如登录成功后,切换至主界面,在网上查阅相关的资料,你会发现很多都是用 form2.Show(); this.Hide(); 这种方式,这种方式也存在一些问题&#…

【学习笔记】Day 9

一、进度概述 1、inversionnet_train 试运行——成功 二、详情 1、inversionnet_train 试运行 在经历了昨天的事故后,今天最终成功运行了 inversionnet_train,运行结果如下: 经观察,最开始 loss 值大概为 0.5 左右 随着训练量的增…

ECR绕过技巧

一、预编译与sql注入 预编译SQL有两个优势: 1、性能更高:预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译。(只是输入的参数不同)。 2、更安全(防止S…

漏洞复现-Apache Struts2 文件上传漏洞(CVE-2023-50164)

1.漏洞描述 Apache Struts2 是一个开源的 Java Web 应用程序开发框架,旨在帮助开发人员构建灵活、可维护和可扩展的企业级Web应用程序。 由于文件上传逻辑存在缺陷,攻击者可以操纵文件上传参数来实现路径穿越,在某些情况下,通过…

HTTP的场景实践

HTTP的场景实践:任选一个浏览器,对于其涉及的请求中的缓存策略展开具体分析 1. 强缓存: Cache-Control用于指定缓存的最长有效时间。 Expires用于指定资源过期的日期。 2. 协商缓存: ETag用于标识资源的唯一标识符,…

ISP代理与双ISP代理的区别

在网络营销、数据采集及隐私保护等领域,代理服务器扮演着至关重要的角色。而在代理服务器的选择中,ISP代理与双ISP代理是两种常见的选择。本文将对这两种代理服务进行详细分析,探讨它们之间的区别以及各自的优势和适用场景。 一、ISP代理概述…

代码规范 —— QMQ 开发规范

优质博文:IT-BLOG-CN 一、代码规范 【1】消费者必须以Consumer结尾,生产者必须以Producer结尾。 【2】选择合适的消费模式:根据业务判断消费模式是集群模式还是广播模式,具体为:MessageConsumerProvider.addListene…

Win系统下使用Docker安装RabbitMQ及延迟插件

Win系统下使用Docker安装RabbitMQ及延迟插件 docker 安装 rabbitmq docker pull rabbitmq:3.12.0-management运行 docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.12.0-management 访问 访问 http://localhost:15672/,…

Docker如何删除没有名字或标签的镜像

如下图,这些没有名字和标签的镜像如何删除呢?下面提供删除方法。 1、找出所有没有名字的镜像 docker images -f "dangling=true"2、删除所有没有名字的镜像 当然,你也可以通过镜像的ID去删除它。 docker rmi -f $(docker images -f "dangli

在远程服务器上创建git仓库并ssh连接到github进行管理

1.生成SSH 公钥,keygen放在.ssh中 2.添加公钥到github 3.确保 SSH 密钥被加载到 SSH 代理中 使用 ssh-add 命令将密钥添加到 SSH 代理中: eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa 检查 SSH 代理中是否列出了密钥: ssh-ad…

MySQL运维-分库分表

介绍 问题分析 拆分策略 垂直拆分 水平拆分 实现技术 Mycat概述 介绍 概念介绍 Mycat配置 schema.xml schema标签 schema标签(table) datanode标签 datahost标签 rule.xml sever.xml system标签 user标签 Mycat分片 分片规则-范围 分片规则-取模 分…

LVS多模式集群攻略!

目录 NAT模式下的lvs集群准备工作具体步骤客户机lvs服务器1服务器2 测试 DR模式下的lvs集群具体流程客户机:路由器LVS服务器1服务器2测试 防火墙标签解决轮询问题LVS持久链接解决方案 NAT模式下的lvs集群 lvs-nat概念:修改请求报文的目标IP,多目标IP的D…