x86/x64汇编基础13.汇编基础9:位操作指令

笔记

学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师

微信 i-xiaodi

下面是每个位运算指令的计算逻辑

指令

说明

示例指令

计算逻辑

and

按位与

and eax, 0xFF

每一位相应的位都执行“与”操作:两个对应的位都为1时结果为1,否则为0。

or

按位或

or eax, ebx

每一位相应的位都执行“或”操作:两个对应的位中,只要有一个为1,结果为1。

xor

按位异或

xor eax, ebx

每一位相应的位都执行“异或”操作:两个对应的位不相同,结果为1,否则为0。

not

按位取反

not eax

每一位都执行取反操作:1变成0,0变成1

shl

左移(无符号)

shl eax, 1

所有位向左移动1位,左移后空出的位置填充0,最左边的位丢弃。

shr

右移(无符号)

shr eax, 1

所有位向右移动1位,右移后空出的位置填充0,最右边的位丢弃。

sal

左移(有符号)

sal eax, 1

shl 相同,所有位向左移动1位,空出的位置填充0,最左边的位丢弃。

sar

右移(有符号)

sar eax, 1

所有位向右移动1位,右移后空出的位置填充符号位(即最左边的位),保持符号位不变。

rol

循环左移

rol eax, 1

所有位向左循环移动1位,最左边的位移到最右边。

ror

循环右移

ror eax, 1

所有位向右循环移动1位,最右边的位移到最左边。

 

详细计算逻辑

  1. and (按位与)
    • 运算规则:1 & 1 = 1, 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0。
    • 例如:eax = 0xABCD12340xFF 按位与的结果是 0x34
  1. or (按位或)
    • 运算规则:1 | 1 = 1, 1 | 0 = 1, 0 | 1 = 1, 0 | 0 = 0。
    • 例如:eax = 0xABCD1234ebx = 0x12345678,结果为 0xBFDDF78C
  1. xor (按位异或)
    • 运算规则:1 ^ 1 = 0, 1 ^ 0 = 1, 0 ^ 1 = 1, 0 ^ 0 = 0。
    • 例如:eax = 0xABCD1234ebx = 0x12345678,结果为 0xB89D6A4C
  1. not (按位取反)
    • 运算规则:每一位的0变成1,1变成0。
    • 例如:eax = 0x00000001,结果为 0xFFFFFFFE
  1. shl (左移)
    • 运算规则:所有位向左移动指定的位数,空位填充0,丢弃最左边的位。
    • 例如:eax = 0x00000001shl eax, 1,结果为 0x00000002
  1. shr (右移)
    • 运算规则:所有位向右移动指定的位数,空位填充0,丢弃最右边的位。
    • 例如:eax = 0x00000002shr eax, 1,结果为 0x00000001
  1. sal (左移,算术移位)
    • shl 相同,位移操作与符号位无关,空出的位置填充0,最左边的位丢弃。
  1. sar (右移,算术移位)
    • 运算规则:所有位向右移动,空出的位由符号位(最高位)填充。
    • 例如:eax = 0xFFFFFFFEsar eax, 1,结果为 0xFFFFFFFF(符号位保持不变)。
  1. rol (循环左移)
    • 运算规则:所有位向左移动,溢出出的位循环移到最右边。
    • 例如:eax = 0x80000000rol eax, 1,结果为 0x00000001
  1. ror (循环右移)
    • 运算规则:所有位向右移动,溢出出的位循环移到最左边。
    • 例如:eax = 0x80000000ror eax, 1,结果为 0x40000000

这些操作常用于底层程序设计,尤其是在处理硬件控制、加密算法或性能优化时。

 

C 语言代码、IDA Pro 逆向 C 伪代码

通常,not 的优先级较高,其次是位移操作符 shlshrsalsar,最后是按位逻辑操作符 andorxor

 

拓展阅读:实际应用拓展

在反汇编技术、软件逆向以及软件开发中,上述指令常常用于多种不同的操作。以下是一些实际应用场景及例子:

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(左移,算术移位)

场景:有符号数的移位操作

  • 有符号数的乘法salshl 相似,但 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 中的位

反汇编和逆向工程中的实际应用

反汇编逆向工程 中,这些指令通常出现在分析目标程序时:

  • 破解保护机制:通过分析软件的代码,可能会看到通过 xorandor 等指令来检查用户输入的合法性或破解某些功能的启用标志。
  • 破解加密算法:对于保护软件的加密算法,xorrolror 等操作可能会用来加密和解密数据流。在逆向工程时,理解这些操作有助于破解软件的保护机制。
  • 调试和跟踪:使用 notandorxor 等指令的操作通常与调试过程中的状态管理和内存操作有关,逆向工程人员可以通过观察这些指令来跟踪程序状态和数据流。

这些指令在程序的底层实现中非常常见,尤其是在 性能优化、加密算法、网络协议、内存管理、硬件编程 以及 逆向工程 中都具有重要的应用。掌握这些操作和它们的应用场景,有助于理解低级程序的行为及优化目标代码。

请登录后发表评论