笔记
学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师
微信 i-xiaodi
逻辑比较指令
用于对比操作数或设置标志。
操作符 |
功能 |
示例 |
|
比较两个操作数 |
|
|
测试(与操作,不存结果,仅设置标志) |
|
CMP
和 TEST
都是常见的汇编指令,尤其在 Windows 逆向工程中经常用来进行条件判断和标志位操作。它们的主要区别在于如何影响标志寄存器以及如何使用它们来控制程序的流程。
1. CMP(Compare)
CMP
是“比较”的缩写。它会对两个操作数进行减法运算,但不会存储结果,而是只更新标志寄存器(如零标志 ZF
,进位标志 CF
,符号标志 SF
等)。其语法为:
CMP operand1, operand2
CMP
的作用是将 operand1
与 operand2
相减,并根据结果设置标志位。最常见的应用是与条件跳转指令(如 JE
、JNE
、JG
、JL
等)配合使用,以决定程序的执行流。
常见用途:
- 比较两个值是否相等:
CMP eax, ebx
,如果eax == ebx
,则ZF
被置为 1,zero 可以通过JE
或JZ
做相应跳转。 - 比较大小:
CMP eax, ebx
,如果eax > ebx
,则可以通过JG
跳转。
示例:
CMP eax, ebx
JE equal_label ; 如果 eax == ebx,则跳转到 equal_label
JG greater_label ; 如果 eax > ebx,则跳转到 greater_label
2. TEST
TEST
用于执行“按位与”操作,它会将两个操作数按位与,并只更新标志寄存器,不存储结果。TEST
可以用来检查某些位是否被设置(即是否为 1)。
语法为:
TEST operand1, operand2
TEST
的作用是对两个操作数进行按位与(AND)运算,并根据结果更新标志寄存器。特别是它主要用于检查某些位是否为 1。
常见用途:
- 检查特定的标志位:如果需要检查某个标志位是否为 1,可以用
TEST
来实现。 - 检查寄存器中某些特定位是否被置为 1,例如
TEST eax, 0x01
可以用来检查eax
的最低位是否为 1。
示例:
TEST eax, eax ; 检查 eax 是否为 0
JZ zero_label ; 如果 eax 为 0,则跳转到 zero_label
TEST eax, 0x01 ; 检查 eax 的最低位是否为 1
JZ lowest_bit_zero ; 如果最低位为 0,则跳转到 lowest_bit_zero
区别总结:
- CMP:通过计算两个操作数的差值来影响标志位,通常用于比较操作数之间的关系(例如,等于、大于、小于等)。
CMP
会影响多个标志位,如ZF
、SF
、OF
等。 - TEST:执行按位与操作,检查某些位是否被设置为 1。
TEST
通常用于检查特定的位标志。
在逆向工程中的应用:
- 判断程序流程: 反汇编程序时,
CMP
和TEST
经常被用来判断某些值,控制程序的流程。例如,CMP
常用于检查返回值是否为零,以决定是否跳过某些代码。TEST
则更多地用于检查特定标志位,如检查某个位是否被设置。
没有回复内容