Math模块允许用户在编写Yara规则时进行数学计算,并将结果作为规则判断的一部分。
下面是Math模块支持的属性或方法:
名称 | 类型 | 描述 |
math.entropy(offset,size) | 方法 | 返回选定范围内内容的浮点型熵值。当扫描目标为文件时,参数offset表示距文件开头的偏移大小,当扫描目标为正在运行的进程时,参数offset表示为进程内的虚拟地址。参数size表示熵值计算内容的字节数。 使用示例如下: math.entropy(0, filesize) >= 7 |
math.entropy(string) | 方法 | 返回指定字符串的熵值。 使用示例: math.entropy("只道那时是寻常") > 7 |
math.monte_carlo_pi(offset, size) | 方法 | 此方法对指定文件内容或者进程内存执行蒙特卡洛π测试,估计数据块中随机分布的点与π的接近程度,并计算这个估值与π之间的差异,转换成百分比。此方法返回一个浮点型值。当扫描目标为文件时,参数offset表示距文件开头的偏移大小,当扫描目标为正在运行的进程时,参数offset表示为进程内的虚拟地址。参数size表示熵值计算内容的字节数。 |
math.monte_carlo_pi(string) | 方法 | 返回指定字符串的蒙特卡洛π测试结果。 |
math.serial_correlation(offset, size) | 方法 | 此方法对指定文件内容或者进程内存序列进行相关性计算。此方法返回一个0.0到1.0之间的浮点型结果。当扫描目标为文件时,参数offset表示距文件开头的偏移大小,当扫描目标为正在运行的进程时,参数offset表示为进程内的虚拟地址。参数size表示熵值计算内容的字节数。 |
math.serial_correlation(string) | 方法 | 返回指定字符串的相关性计算结果。 |
math.mean(offset,size) | 方法 | 此方法对指定文件内容或者进程内存求平均值。此方法返回一个浮点型值。当扫描目标为文件时,参数offset表示距文件开头的偏移大小,当扫描目标为正在运行的进程时,参数offset表示为进程内的虚拟地址。参数size表示熵值计算内容的字节数。 使用示例如下: math.mean(0, filesize) < 72.0 |
math.mean(strings) | 方法 | 返回指定字符串的平均值。 |
math.deviation(offset,size,mean) | 方法 | 此方法对指定文件内容或者进程内存求平均值,并比较所求的的平均值与给入的均值之间的偏差。此方法返回一个浮点型数值。当扫描目标为文件时,参数offset表示距文件开头的偏移大小,当扫描目标为正在运行的进程时,参数offset表示为进程内的虚拟地址。参数size表示熵值计算内容的字节数。参数mean为要比较的均值,一般均匀分布的随机样本的均值为127.5,math模块中常量MEAN_BYTES标识此值,也可以自己传入。 使用示例如下: math.deviation(0, filesize, math.MEAN_BYTES) == 64.0 |
math.deviation(string,mean) | 方法 | 返回指定字符串均值与传入的均值之间的偏差。 |
math.in_range(test,lower,upper) | 方法 | 判断给定数值是否在给定范围内。参数test为给定的测试值。参数lower和upper分别是给定的范围,即最小值和最大值。此方法判定test值是否在lower和upper范围内。返回布尔类型。 使用示例如下: math.in_range(math.deviation(0, filesize, math.MEAN_BYTES), 63.9, 64,1) |
math.max(a, b) | 方法 | 返回两个无符号整形的最大值。 |
math.min(a, b) | 方法 | 返回两个无符号整形的最小值。 |
math.to_number(value) | 方法 | 判断value的真假并返回0或者1。 使用示例如下: math.to_number(SubRule1) * 60 + math.to_number(SubRule2) * 20 + math.to_number(SubRule3) * 70 > 80 |
math.abs(value) | 方法 | 返回有符号整形的绝对值。 使用示例如下: math.abs(@a - @b) == 1 |
math.count(byte, offset, size) | 方法 | 此方法返回特定字节在指定范围内出现的次数。当扫描目标为文件时,参数offset表示距文件开头的偏移大小,当扫描目标为正在运行的进程时,参数offset表示为进程内的虚拟地址。参数size表示熵值计算内容的字节数。如果offset和size参数没有给定,则默认搜索整个文件。 使用示例如下: math.count(0x4A) >= 10 math.count(0x00, 0, 4) < 2 |
math.percentage(byte, offset, size) | 方法 | 此方法返回特定字节在指定范围内出现的比率。此方法返回0到1之间的百分比数值。当扫描目标为文件时,参数offset表示距文件开头的偏移大小,当扫描目标为正在运行的进程时,参数offset表示为进程内的虚拟地址。参数size表示熵值计算内容的字节数。如果offset和size参数没有给定,则默认搜索整个文件。 使用示例如下: math.percentage(0xFF, filesize-1024, filesize) >= 0.9 math.percentage(0x4A) >= 0.4 |
math.mode(offset, size) | 方法 | 此方法返回指定范围内出现频率最高的字节。当扫描目标为文件时,参数offset表示距文件开头的偏移大小,当扫描目标为正在运行的进程时,参数offset表示为进程内的虚拟地址。参数size表示熵值计算内容的字节数。如果offset和size参数没有给定,则默认搜索整个文件。 使用示例如下: math.mode(0, filesize) == 0xFF math.mode() == 0x00 |
math.to_string(value) | 方法 | 此方法将给定的有符号整数转换成字符串类型。 使用示例如下: math.to_string(10) == "10" math.to_string(-1) == "-1" |
math.to_string(int, base) | 方法 | 将给定有符号整形按照给定进制输出字符串。此函数支持8、10和16进制。 使用示例如下: math.to_string(32, 16) == "20" math.to_string(-1, 16) == "ffffffffffffffff" |