在表达式引擎中使用操作符¶
对于数值数据类型,OllyDbg 表达式支持通用的 C 风格操作符,如表 2-4 所示。虽然没有操作符优先级的明确文档,但 OllyDbg 似乎遵循 C 风格优先级,并可以使用括号确定作用域。
操作符功能 a == b如果 a 等于 b 返回 1,否则返回 0。a != b如果 a 不等于 b 返回 1,否则返回 0。a > b如果 a 大于 b 返回 1,否则返回 0。a < b如果 a 小于 b 返回 1,否则返回 0。a >= b如果 a 大于或等于 b 返回 1,否则返回 0。a <= b如果 a 小于或等于 b 返回 1,否则返回 0。a && b如果 a 和 b 都非零返回 1,否则返回 0。a || b如果 a 或 b 非零返回 1,否则返回 0。a ^ b返回 XOR(a, b) 的结果。a % b返回 MODULUS(a, b) 的结果。a & b返回 AND(a, b) 的结果。a | b返回 OR(a, b) 的结果。a << b返回 a 左移 b 位的结果。a >> b返回 a 右移 b 位的结果。a + b返回 a 加 b 的和。a - b返回 a 减 b 的差。操作符功能 a / b返回 a 除以 b 的商。a * b返回 a 乘以 b 的积。+a返回 a 的有符号表示。-a返回 a*-1。!a如果 a 是 0 返回 1,否则返回 0。
另一方面,对于字符串,唯一可用的操作符是 == 和 !=,它们都遵循下面这套规则:
(cid:127)字符串比较不区分大小写。
(cid:127)如果只有一个操作数是字符串字面量,比较会在到达字面量
的长度后终止。因此,表达式 [STRING EAX]=="ABC123"
(其中 EAX 是指向字符串 ABC123XYZ 的指针)会求值为
1 而不是 0。
(cid:127)如果字符串比较中没有为操作数指定类型,而另一个操作数
是字符串字面量(例如,"MyString"!=EAX),比较会首先
假定非字面量操作数是 ASCII 字符串,如果该比较返回 0,
它会尝试第二次比较,假定操作数是 Unicode 字符串。
当然,没有操作数,操作符也没什么用。让我们看看可以在表达式中求值的一些数据。