- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
一、汇编位运算基础
AND(逻辑与)
语法:
AND dest, src
作用:按位与操作,常用于掩码清零或保留特定位。
示例:
AND EAX, 0x0F ; 保留EAX的低4位,其余位清零
OR(逻辑或)
语法:
OR dest, src
作用:按位或操作,用于设置特定位为1。
示例:
OR EBX, 0x80 ; 设置EBX的第7位为1
XOR(逻辑异或)
语法:
XOR dest, src
作用:按位异或,常用于加密、清零寄存器或交换值。
特性:
XOR EAX, EAX
可高效清零EAX。示例:
XOR ECX, 0x55AA ; 对ECX进行异或加密
NOT(逻辑非)
语法:
NOT dest
作用:按位取反,常用于生成补码或掩码反转。
示例:
NOT EDX ; EDX所有位取反
移位指令
SHL/SHR(逻辑左移/右移)
SHL EAX, 3 ; 左移3位(相当于乘以8) SHR EBX, 2 ; 右移2位(相当于除以4)
SAL/SAR(算术左移/右移)
SAR保留符号位,适用于有符号数。
SAR EAX, 4 ; 算术右移4位(保留符号位)
循环移位
ROL/ROR(循环左移/右移)
ROL ECX, 1 ; 循环左移1位(最高位到最低位) ROR EDX, 8 ; 循环右移8位(常用于字节交换)
二、逆向工程中的位运算应用
加密与解密
XOR加密:常见于恶意软件或简单算法中。
; 解密循环示例 mov esi, encrypted_data mov ecx, data_length decrypt_loop: xor byte ptr [esi], 0xAA inc esi loop decrypt_loop
标志位操作
测试特定位:通过
TEST
指令结合掩码检查标志位。TEST AL, 0x01 ; 检查AL的最低位是否为1(奇偶判断) JNZ is_odd
数据压缩与解压
使用移位和掩码提取数据字段。
; 从AX中提取高4位 MOVZX EBX, AX SHR EBX, 12 ; 右移12位获取高4位
反调试与混淆
通过位运算隐藏关键代码逻辑。
; 混淆后的跳转计算 MOV EAX, [target_address] XOR EAX, 0xDEADBEEF JMP EAX
三、拓展知识点
标志寄存器(EFLAGS)
CF(Carry Flag):无符号运算进位/借位时置1。
ZF(Zero Flag):结果为0时置1。
SF(Sign Flag):结果最高位为1时置1(负数)。
OF(Overflow Flag):有符号运算溢出时置1。
位域操作(Bit Fields)
在结构体中定义位字段,常见于系统数据结构(如PE文件头)。
示例:
struct { unsigned int permission : 3; // 3位权限标志 unsigned int reserved : 5; // 5位保留位 } flags;
SIMD位运算(SSE/AVX)
128位寄存器(XMM):用于并行位操作(如
PAND
,POR
)。应用场景:图像处理、加密算法加速。
调试技巧
动态调试:使用x64dbg/OllyDbg观察位运算后的寄存器状态。
静态分析:IDA Pro反编译后识别位运算模式(如
^0x55
可能为XOR加密)。
高级语言中的位运算
C/C++代码:
uint32_t mask = 0xFF << 8; // 生成掩码0x0000FF00 uint32_t key = data ^ 0x1234; // XOR加密