笔记
学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师
微信 i-xiaodi
下面是每个位运算指令的计算逻辑
指令 |
说明 |
示例指令 |
计算逻辑 |
|
按位与 |
|
每一位相应的位都执行“与”操作:两个对应的位都为1时结果为1,否则为0。 |
|
按位或 |
|
每一位相应的位都执行“或”操作:两个对应的位中,只要有一个为1,结果为1。 |
|
按位异或 |
|
每一位相应的位都执行“异或”操作:两个对应的位不相同,结果为1,否则为0。 |
|
按位取反 |
|
每一位都执行取反操作:1变成0,0变成1。 |
|
左移(无符号) |
|
所有位向左移动1位,左移后空出的位置填充0,最左边的位丢弃。 |
|
右移(无符号) |
|
所有位向右移动1位,右移后空出的位置填充0,最右边的位丢弃。 |
|
左移(有符号) |
|
和 |
|
右移(有符号) |
|
所有位向右移动1位,右移后空出的位置填充符号位(即最左边的位),保持符号位不变。 |
|
循环左移 |
|
所有位向左循环移动1位,最左边的位移到最右边。 |
|
循环右移 |
|
所有位向右循环移动1位,最右边的位移到最左边。 |
详细计算逻辑
and
(按位与)
-
- 运算规则:1 & 1 = 1, 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0。
- 例如:
eax = 0xABCD1234
,0xFF
按位与的结果是0x34
。
or
(按位或)
-
- 运算规则:1 | 1 = 1, 1 | 0 = 1, 0 | 1 = 1, 0 | 0 = 0。
- 例如:
eax = 0xABCD1234
,ebx = 0x12345678
,结果为0xBFDDF78C
。
xor
(按位异或)
-
- 运算规则:1 ^ 1 = 0, 1 ^ 0 = 1, 0 ^ 1 = 1, 0 ^ 0 = 0。
- 例如:
eax = 0xABCD1234
,ebx = 0x12345678
,结果为0xB89D6A4C
。
not
(按位取反)
-
- 运算规则:每一位的0变成1,1变成0。
- 例如:
eax = 0x00000001
,结果为0xFFFFFFFE
。
shl
(左移)
-
- 运算规则:所有位向左移动指定的位数,空位填充0,丢弃最左边的位。
- 例如:
eax = 0x00000001
,shl eax, 1
,结果为0x00000002
。
shr
(右移)
-
- 运算规则:所有位向右移动指定的位数,空位填充0,丢弃最右边的位。
- 例如:
eax = 0x00000002
,shr eax, 1
,结果为0x00000001
。
sal
(左移,算术移位)
-
- 和
shl
相同,位移操作与符号位无关,空出的位置填充0,最左边的位丢弃。
- 和
sar
(右移,算术移位)
-
- 运算规则:所有位向右移动,空出的位由符号位(最高位)填充。
- 例如:
eax = 0xFFFFFFFE
,sar eax, 1
,结果为0xFFFFFFFF
(符号位保持不变)。
rol
(循环左移)
-
- 运算规则:所有位向左移动,溢出出的位循环移到最右边。
- 例如:
eax = 0x80000000
,rol eax, 1
,结果为0x00000001
。
ror
(循环右移)
-
- 运算规则:所有位向右移动,溢出出的位循环移到最左边。
- 例如:
eax = 0x80000000
,ror eax, 1
,结果为0x40000000
。
这些操作常用于底层程序设计,尤其是在处理硬件控制、加密算法或性能优化时。
C 语言代码、IDA Pro 逆向 C 伪代码
通常,not
的优先级较高,其次是位移操作符 shl
、shr
、sal
和 sar
,最后是按位逻辑操作符 and
、or
、xor
。
拓展阅读:实际应用拓展
在反汇编技术、软件逆向以及软件开发中,上述指令常常用于多种不同的操作。以下是一些实际应用场景及例子:
1. and
(按位与)
场景:掩码操作和权限验证
- 掩码操作:用于从数据中提取特定的位信息,例如,从一个整数中提取权限标志或状态标志。
- 应用实例:
-
- 权限验证:假设某个变量的每一位表示不同的权限状态,例如:
0x1
代表读权限,0x2
代表写权限。可以通过and
指令来检查某个特定的权限是否存在。
- 权限验证:假设某个变量的每一位表示不同的权限状态,例如:
; 检查是否具有写权限
and eax, 0x2 ; 如果 eax & 0x2 != 0,说明有写权限
2. or
(按位或)
场景:设置标志位
- 设置标志位:
or
操作常用于设置某些特定的标志位,而不影响其他位。 - 应用实例:
-
- 设置状态标志:在程序中可能有一个标志位表示是否启用某个特性。使用
or
指令设置该标志位时,只修改相应位,不影响其他位。
- 设置状态标志:在程序中可能有一个标志位表示是否启用某个特性。使用
; 设置启用标志,假设启用标志为 0x4
or eax, 0x4 ; 设置 eax 的第3位(启用标志)
3. xor
(按位异或)
场景:数据加密/解密,反转标志位
- 数据加密/解密:在一些简单的加密算法中,使用
xor
来加密和解密数据。xor
是自反操作,即A ^ B ^ B = A
,因此可以通过相同的操作反转加密数据。 - 应用实例:
-
- 加密解密:假设密钥为
0x5A
,可以使用xor
操作来加密和解密数据。
- 加密解密:假设密钥为
; 加密
xor eax, 0x5A ; 用密钥 0x5A 对数据加密
-
- 反转标志位:在游戏开发或调试中,
xor
常用于快速反转状态标志。
- 反转标志位:在游戏开发或调试中,
; 反转一个状态标志
xor eax, 0x1 ; 如果 eax 的最低位为 1,变为 0;如果为 0,变为 1
; 清零寄存器
xor eax, eax ; eax清零
4. not
(按位取反)
场景:反转所有位,生成补码
- 反转所有位:常用于生成二进制数的补码,或者在某些协议中,可能需要反转所有位进行校验。
- 应用实例:
-
- 反转补码:将一个数的所有位取反,生成补码。比如在某些算法中,用于进行负数的二进制表示转换。
not eax ; 将 eax 中的每一位取反
5. shl
(左移,逻辑移位)
场景:高效的乘法操作
- 乘法:左移操作相当于乘以 2 的幂。例如,左移一位相当于乘以 2,左移两位相当于乘以 4。
- 应用实例:
-
- 乘以 2:在需要快速计算乘法(尤其是乘以 2 的幂)时,使用左移比使用乘法指令效率更高。
shl eax, 1 ; eax = eax * 2
6. shr
(右移,逻辑移位)
场景:除法运算
- 除法:右移操作相当于除以 2 的幂。例如,右移一位相当于除以 2,右移两位相当于除以 4。
- 应用实例:
-
- 除以 2:可以通过右移来实现整数除法,尤其是对于需要优化性能的场景。
shr eax, 1 ; eax = eax / 2
7. sal
(左移,算术移位)
场景:有符号数的移位操作
- 有符号数的乘法:
sal
和shl
相似,但sal
在处理有符号整数时保持符号位的正确性。适用于需要考虑符号的计算。 - 应用实例:
-
- 左移有符号整数:对于有符号整数,
sal
可以保持符号位一致,不会丢失负号。
- 左移有符号整数:对于有符号整数,
sal eax, 1 ; 对有符号整数进行左移,相当于乘以 2
8. sar
(右移,算术移位)
场景:有符号数的除法
- 有符号数的除法:与
shr
不同,sar
处理有符号整数时,会保持符号位(最高位),确保结果正确。 - 应用实例:
-
- 右移有符号整数:用于有符号整数的除法操作,保证负数右移时不会丢失符号位。
sar eax, 1 ; 对有符号整数进行右移,相当于除以 2
9. rol
(循环左移)
场景:哈希算法、加密算法
- 哈希算法和加密算法:在一些加密算法中,位旋转(循环移位)用于扩展密钥空间或增加运算的复杂性。
- 应用实例:
-
- 加密算法:例如,在某些加密算法中,通过循环左移来改变数据的结构,使得加密更为复杂。
rol eax, 1 ; 循环左移 eax 中的位
10. ror
(循环右移)
场景:哈希算法、加密算法
- 哈希算法和加密算法:同样,在哈希和加密算法中,位旋转用于加密数据,增加安全性。
- 应用实例:
-
- 加密和安全协议:在一些安全协议(如SHA系列、MD5等)中,使用循环右移增加混淆度。
ror eax, 1 ; 循环右移 eax 中的位
反汇编和逆向工程中的实际应用
在 反汇编 和 逆向工程 中,这些指令通常出现在分析目标程序时:
- 破解保护机制:通过分析软件的代码,可能会看到通过
xor
、and
、or
等指令来检查用户输入的合法性或破解某些功能的启用标志。 - 破解加密算法:对于保护软件的加密算法,
xor
、rol
、ror
等操作可能会用来加密和解密数据流。在逆向工程时,理解这些操作有助于破解软件的保护机制。 - 调试和跟踪:使用
not
、and
、or
、xor
等指令的操作通常与调试过程中的状态管理和内存操作有关,逆向工程人员可以通过观察这些指令来跟踪程序状态和数据流。
这些指令在程序的底层实现中非常常见,尤其是在 性能优化、加密算法、网络协议、内存管理、硬件编程 以及 逆向工程 中都具有重要的应用。掌握这些操作和它们的应用场景,有助于理解低级程序的行为及优化目标代码。