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将进位加到高位
应用场景:
- 数组索引计算:在阵列中偏移量的计算常用
ADD
。ADD ESI, 4 ; 每次访问数组步进4字节
- 多精度运算:
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
应用场景:
- 循环控制:典型的递增与递减场景。
LOOP_START: INC ECX CMP ECX, 10 JL LOOP_START ; 如果ECX < 10,继续循环
- 逻辑判断:用于倒计时逻辑的实现。
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等)不仅是处理数值运算的基础,也是程序控制流和逻辑运算的重要工具。在逆向工程中,这些指令贯穿于循环、数组操作、精密算法等场景。例如,高精度的加减、乘除法运算设计,多用于解密和算法分析;标志位的变化则直接应用于条件跳转和分支逻辑。