处理器执行一个操作数为 2 个寄存器的指令时,无法判别这是有符号还是无符号数的运算。读者会知道是因为可以从后面那个条件跳转指令来判断。所以处理器同时考虑这 2 种情况,并且触发对应的标志。
使用 IDA 调试 crackme.exe 程序,运行到程序入口暂停。
如果使用 keypatch 修改指令后,发现汇编指令变成 db 形式了,记得先把修改的那段 Undefine,然后再转成 Code。


随便可以触发到的地方打个断点,让程序运行到断点处。
使用 Keypatch 插件将第一句指令改为 ADD EAX, 1。
在 EAX 寄存器右键单击,选择 MODIFY VALUE,输入 0xffffffff。
按 F8 键单步执行,观察 CF 标志位变化。可以看到计算结果超过了数值上限,因而触发了 CF 标志。
再将下一条指令改为 SUB EAX, EDX。
如果两个无符号数相减结果为负这种错误,同样也会触发 CF。修改寄存器使得 EAX=0x25,EDX=0x40,同样可以看到,CF 还是为 1。

将下一条指令修改为 SUB EAX, EDX 这条指令,并设置 EAX=0x100,EDX=0x40。
按 F8 键单步执行。结果没有触发 CF 标志。
那么结论是:
在 ARM64 架构中,CF(Carry Flag,进位标志)是一个用于表示算术运算结果的状态标志。CF 的主要用途包括: