宽字符串仅匹配 UTF16-LE
作者: ruppde创建于 2023年3月6日更新于 2024年4月26日
标签bug
描述错误
从 https://yara.readthedocs.io/en/v4.2.3/writingrules.html#wide-character-strings 中的示例字符串"Borland"被编码为B\x00o\x00r\x00l\x00a\x00n\x00d\x00,但这只是 UTF16 的 LE 版本,BE 版本为\x00B\x00o\x00r\x00l\x00a\x00n\x00d(前面有 \x00)。因此,文档中的示例规则不匹配 UTF16-BE:
rule WideCharTextExample1
{
strings:
$wide_string = "Borland" wide
condition:
$wide_string
}到目前为止,UTF16-LE 是最常见的情况,但我在 2fb7a38e69a88e3da8fece4c6a1a81842c1be6ae9d6ac299afa4aef4eb55fd4b 中遇到了 UTF16-BE 字符串"Qi Lijun"(但这是怎么发生的 ... )

(实际上,这是更令人意外的行为,而不是一个错误,但这比特征请求更合适。)
要重现
rule WideCharTextExample1
{
strings:
$wide_string = "Qi Lijun" wide
condition:
$wide_string
}不匹配:
$ yara test.yar 2fb7a38e69a88e3da8fece4c6a1a81842c1be6ae9d6ac299afa4aef4eb55fd4b预期行为 可以有几种方法来解决这个问题:
- 回到"Borland"示例,完美的解决方案是同时搜索 UTF16-LE 和 UTF16-BE。
UTF16-LE: B\x00o\x00r\x00l\x00a\x00n\x00d\x00UTF16-BE: \x00B\x00o\x00r\x00l\x00a\x00n\x00d - 更快且节省内存的方法是删除现有实现中的 \x00 并搜索:
B\x00o\x00r\x00l\x00a\x00n\x00d
这可能会在非常短的字符串上错误匹配(这不应该经常发生,因为性能和误报问题)。
3. 引入例如widebe作为新的字符串修饰符,类似于 uint16be。
4. 在文档中解释这个问题,并建议使用十六进制表示 UTF16-BE。
请填写以下信息:
- 操作系统: Linux
- YARA 版本: 4.3.0
内容来源: VirusTotal/yara