当前位置: 首页 > news >正文

Windows逆向工程入门之汇编指令四则运算(ADD/SUB/DIV/MUL)

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

一、四则运算基础:指令详解和应用

1.1 加法指令(ADD 和 ADC)

ADD 指令

ADC 指令

应用场景:

1.2 减法指令(SUB 和 SBB)

SUB 指令

SBB (Subtraction with Borrow) 指令

应用场景:

1.3 自增/自减(INC 和 DEC)

INC 指令

DEC 指令

应用场景:

1.4 乘法和除法指令(MUL、IMUL、DIV、IDIV)

MUL (无符号乘法)

IMUL (有符号乘法)

DIV 和 IDIV

二、扩展知识点:汇编与逆向工程结合

2.1 EFLAGS标志寄存器在程序逻辑中的作用

示例:利用标志寄存器进行条件跳转

2.2 指令优化:LEA指令

三、总结


逆向工程(Reverse Engineering)是一项分析和还原软件逻辑的技能,它绕过了原始源代码的限制,直接与机器码打交道。汇编语言是逆向工程的基础(特别在Windows平台上),了解其核心指令是理解程序逻辑的关键。


一、四则运算基础:指令详解和应用

汇编指令的四则运算包括加、减、乘、除,其中基本格式操作围绕寄存器和内存操作数进行。以下是一些关键指令:

1.1 加法指令(ADD 和 ADC)

ADD 指令
  • 功能:将一个源操作数添加到目标操作数,并将结果存储在目标操作数中。
  • 格式:

    ADD destination, source

  • 示例:

    MOV EAX, 5 ; 将整数5加载到EAX寄存器 ADD EAX, 10 ; EAX = EAX + 10,结果为15

  • 影响标志位:
    • CF(进位标志):无符号数溢出。
    • OF(溢出标志):有符号数溢出。
    • ZF(零标志):结果是否为0。
    • SF(符号标志):结果的符号位(正/负)。
ADC 指令
  • 功能:在执行加法的同时考虑进位标志(CF)的存在。
  • 格式:

    ADC destination, source

  • 示例(多字节加法):

    MOV AX, 0FFFFh ; AX = 最大无符号16位数65535 ADD AX, 1 ; AX溢出为0,设置CF = 1 ADC DX, 0 ; 使用ADC将进位加到高位

应用场景:
  1. 数组索引计算:在阵列中偏移量的计算常用ADD

    ADD ESI, 4 ; 每次访问数组步进4字节

  2. 多精度运算ADC常用于高位运算处理进位,例如64位加法。

1.2 减法指令(SUB 和 SBB)

SUB 指令
  • 功能:将源操作数从目标操作数中减去,存放结果于目标操作数。
  • 示例:

    MOV EAX, 20 ; EAX = 20 SUB EAX, 5 ; EAX = EAX - 5,结果为15

SBB (Subtraction with Borrow) 指令
  • 功能:在减法中考虑借位标志(CF),用于处理多精度减法。
  • 示例(高精度减法):

    MOV EAX, LOWVAL1 SUB EAX, LOWVAL2 ; 处理低位减法 SBB EBX, HIGHVAL2 ; 处理借位时的高位减法

应用场景:
  • 数值偏移量计算
  • 逆向循环处理:逆向推测程序中计数器的减法逻辑。

1.3 自增/自减(INC 和 DEC)

INC 指令
  • 功能:将目标操作数加1,常用于循环控制变量。
  • 示例:

    MOV ECX, 0 ; 初始化计数器 INC ECX ; 自增,ECX = 1

DEC 指令
  • 功能:将目标操作数减1,同样常用于递减循环控制。
  • 示例:

    MOV ECX, 10 ; 初始化10 DEC ECX ; 递减,ECX = 9

应用场景:
  1. 循环控制:典型的递增与递减场景。

    LOOP_START: INC ECX CMP ECX, 10 JL LOOP_START ; 如果ECX < 10,继续循环

  2. 逻辑判断:用于倒计时逻辑的实现。

1.4 乘法和除法指令(MUL、IMUL、DIV、IDIV)

MUL (无符号乘法)
  • 计算方式:AX * SRC → DX:AX
  • 示例:

    MO AX, 10 MUL BX ; 使用BX寄存器的值进行乘法,结果存于 DX:AX

IMUL (有符号乘法)
  • 允许负数参与计算。
  • 示例:

    MOV AX, -5 IMUL BX ; 计算-5 * BX

DIV 和 IDIV
  • DIV:无符号除法。
  • IDIV:有符号除法。
  • 示例:

    MOV AX, 20 MOV BX, 3 DIV BX ; AX / BX,商存于AX,余数存于DX


二、扩展知识点:汇编与逆向工程结合

在逆向工程中,了解这些算术指令的使用方式至关重要,以下是一些扩展关联的知识点:

2.1 EFLAGS标志寄存器在程序逻辑中的作用

四则运算更新CPU的标志寄存器EFLAGS,用于控制程序分支和逻辑判断。

  • CF (Carry Flag):无符号运算中的进位。
  • OF (Overflow Flag):符号运算中的溢出。
  • ZF (Zero Flag):结果是否为零。
  • SF (Sign Flag):结果是否为负。
示例:利用标志寄存器进行条件跳转

ADD AX, BX JZ LABEL_ZERO ; 如果结果为0,则跳转到LABEL_ZERO

2.2 指令优化:LEA指令

逆向中经常用LEA取代ADD实现更高效的地址计算:

LEA EAX, [EBX + ECX*4] ; 计算EBX寄存器偏移地址(数组访问)


三、总结

汇编语言中的四则运算指令(ADD、ADC、SUB、SBB、INC、DEC、MUL等)不仅是处理数值运算的基础,也是程序控制流和逻辑运算的重要工具。在逆向工程中,这些指令贯穿于循环、数组操作、精密算法等场景。例如,高精度的加减、乘除法运算设计,多用于解密和算法分析;标志位的变化则直接应用于条件跳转和分支逻辑。


相关文章:

  • 代码随想录算法训练营day36(补0204)
  • Elastic Cloud Serverless 现已在 Microsoft Azure 上提供技术预览版
  • Kibana
  • 第一章嵌入式系统概论考点03嵌入式系统的分类
  • 什么是SpringMVC
  • 一个可以自动生成随机区组试验的excel VBA小程序3
  • “失意”的李彦宏
  • 如何在MacOS上查看edge/chrome的扩展源码
  • LeetCode刷题---数组---1128
  • FPGA实现UltraScale GTH光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供2套工程源码和技术支持
  • 网页版贪吃蛇小游戏开发HTML实现附源码!
  • mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群
  • 网络安全常识
  • 如何在微信小程序中添加动画效果
  • PyTorch Lightning Trainer介绍
  • 股指期货入门指南:股指期货的交割流程与机制
  • 以用户为中心,汽车 HMI 界面设计的创新之道
  • Polkadot-API (PAPI) 简介与使用指南
  • 为什么Pytorch中实例化模型会直接调用forward方法?
  • 【1min 快速上手 Unity 基本使用方法】外部模型使用
  • dede资讯类网站模板/公司企业网站模板
  • 自己免费怎么制作网站/快速收录网
  • 佛山顺德容桂网站制作/百度站长工具官网
  • wordpress.com.cn/长沙seo推广外包
  • 做网站需要哪些人手/关键词搜索优化公司
  • 容桂网站建设/网站模板下载