未定义的值
—— yara 使用手册 · 编写 yara 规则 最后更新: 2023-03-14 21:12:12
模块通常会将变量保留为未定义状态,例如当变量在当前上下文中没有意义时 (在扫描非 PE 文件时考虑 pe.entry_point )。Yara 以允许规则保持其意义的方式来处理未定义的值,看看这个规则:
import "pe"
rule Test
{
strings:
$a = "some string"
condition:
$a and pe.entry_point == 0x1000
}如果扫描的文件不是 PE,即使文件包含字符串,此规则也不会与该文件匹配,因为必须满足两个条件 (字符串的存在和入口点的正确值),然而,如果条件改为:
$a or pe.entry_point == 0x1000在这种情况下,如果文件包含该字符串,即使它不是 PE 文件,你也会期望规则匹配。这正是 Yara 的行为方式。逻辑如下:
- 如果条件中的表达式未定义,它将被转换为 false 并且规则将不匹配。
- 布尔运算符
and和or会将未定义的操作数视为 false ,这意味着:undefined and true是 false,undefined and false是 false,undefined or true是 true,undefined or false是 false - 其余所有运算符 (包括
not运算符) 如果其中任何操作数未定义,则返回 undefined。
在上面的表达式中,对于非 PE 文件,pe.entry_point == 0x1000 将未定义,因为 pe.entry_point 对于这些文件未定义,这意味着当且仅当 $a 是 true 时 $a or pe.entry_point == 0x1000 才会是 true 。
如果条件单独为 pe.entry_point == 0x1000,则对于非 PE 文件,它将判定为 false,pe.entry_point != 0x1000 和 not pe.entry_point == 0x1000 也会如此,因为这些表达式对于非 PE 文件都没有意义。
要检查表达式是否已定义,请使用一元运算符 defined,例子:
defined pe.entry_point