- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
一、汇编位运算基础
-
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加密
-