刻刀-R | Rust重构YARA速度快6倍的YARA-X

admin 2024年5月24日22:34:18评论6 views字数 2382阅读7分56秒阅读模式

YARA-X 与 YARA

YARA-X 打算成为 YARA 的替代品,它在设计时考虑了可用性、向后兼容性和性能。YARA-X在很多方面已经比YARA好,但它还很年轻,因此有些功能还没有实现,还有一些粗糙的边缘需要打磨。本节介绍 YARA-X 与 YARA 的优缺点。

VirusTotal已经对YARA-X进行了测试,性能更优于YARA。

项目地址

https://github.com/VirusTotal/yara-x

项目文档

https://virustotal.github.io/yara-x/docs/intro/yara-x-vs-yara/

好东西#

让我们先谈谈YARA-X做得更好的地方。如果您更喜欢看到半空的玻璃杯,请转到“坏事”部分。

更好的错误报告#

YARA-X 中的错误报告更加详细和说明性。每条错误消息都尝试提供有关错误的尽可能多的上下文,从而改善用户体验。它们看起来也更好,如下图所示。

duplicate_rule_error.png

wrong_arguments_error.png

更强大的 CLI#

与YARA相比,YARA-X的命令行界面(CLI)具有以下几个优势:

彩色输出,如果终端支持,则增强可读性。 有关正在扫描的文件的详细信息。 自动完成支持多个 shell,包括 Bash、Zsh 和 PowerShell,提高了命令输入期间的可用性和效率。 以 YAML 和 JSON 格式访问 YARA 模块的输出,无需任何 YARA 规则。此功能将 YARA-X 转变为支持多种文件格式的多功能文件剖析工具,如 PE、ELF、Mach-O 和 LNK(Windows 链接文件)。 更高的整体性能# 在处理正则表达式和复杂的十六进制模式时,YARA-X 比 YARA 更好。让我们使用以下规则来检测比特币地址作为示例:

rule bitcoin_address {
  strings:
    $btc =/(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}/ fullword
  condition:
    $btc
}

上面的规则在 YARA 中非常慢。事实上,YARA抱怨这条规则,并发出警告,如下所示:

warning: rule "bitcoin_address" in bitcoin.yar(3): string "$btc" may slow down scanning 如果扫描一个相对较大的文件(假设 ~200MB),则此规则在 YARA 中将花费 20 秒以上,但在 YARA-X 中则不到一秒。

同样,与 YARA 相比,具有广泛循环的规则(如以下示例)在 YARA-X 中的执行速度要快得多。此规则在 YARA-X 中的速度比在 YARA 中快 5-6 倍:

rule cafebabe {
  condition:
for any i in(0..filesize-1):(
      uint32(i)==0xCAFEBABE
)
}

值得注意的是,并非所有规则都受益于 YARA-X 的优化。已经针对性能进行了优化,并且仅使用纯文本模式或简单十六进制模式的规则在 YARA 中可能会运行得更快。这是因为在原始扫描速度下,YARA 仍然比 YARA-X 快 2-3 倍(即 Aho-Corasick 算法的内循环在 YARA 中更快)。然而,当遇到异构规则的混合时,最糟糕的规则是那些主导扫描时间的规则,通常会使扫描过程减慢 10 倍或更多。由于 YARA-X 在处理这些缓慢的情况方面要好得多,因此整体性能通常更好。

这里还有改进的余地,目标是使YARA-X在所有情况下都比YARA更快。

解析器可重用性# YARA的问题之一是其整体设计。解析器与规则编译逻辑集成得如此之多,以至于无法将其重新用于其他目的,例如代码格式化工具、linter 等。

因此,随着时间的推移,出现了许多替代的 YARA 解析器,例如 [1]、[2]、[3])。但是,保持这些解析器与官方解析器同步是很困难的,而且它们经常落后。

相比之下,YARA-X 具有更加模块化的设计,其中解析器与规则编译逻辑分离,允许将解析器重用于其他目的。

坏事#

当然,并非一切都很棒。YARA-X有一些缺点,我们也需要讨论。一些缺点与缺乏 YARA 已经具有的功能有关,但 YARA-X 没有。随着YARA-X的成熟,这些可能会在未来被消除。

不兼容的 API# YARA-X C/C++、Python 和 Golang API 与其 YARA 对应项不兼容。YARA-X 不是 YARA 的直接替代品,您需要使自己的程序适应新的 API。

但是,这些 API 在概念上是相似的,在大多数情况下,迁移过程应该非常简单。

无包含语句#

YARA支持的 include 语句尚未在YARA-X中实现。不过,这只是暂时的情况。我们计划在 YARA-X 的更高版本中支持此功能。

许多 YARA 用户使用该 include 语句作为将多个源文件连接在一起的一种方式。在这种情况下,他们有一个主文件(假设 index.yar ),它只包含他们想要编译的所有其他文件。这是必需的,因为您不能将包含多个源文件的目录传递给 YARA,以便 YARA 使用所有这些源文件。在 YARA-X 中,这是可能的,您可以传递包含多个源文件的目录。例如:

yr scan my_yara_repository file_to_scan 使用上面的命令,YARA-X 将使用包含在中的 my_yara_repository 每个 *.yar or *.yara 文件(搜索是递归的,因此它也会查看子目录)。如果只想使用目录中的每个文件源文件,则无需使用或维护包含 include 该目录中每个文件的语句 index.yar 的文件。

无进程扫描#

YARA-X 中尚未实现进程扫描。如果此功能有足够的需求,则将来可能会更改。目前,它是一项低优先级功能,但如果您真的希望实现进程扫描,请告诉我们。

原文始发于微信公众号(Eonian Sharp):刻刀-R | Rust重构YARA速度快6倍的YARA-X

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月24日22:34:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   刻刀-R | Rust重构YARA速度快6倍的YARA-Xhttp://cn-sec.com/archives/2773982.html

发表评论

匿名网友 填写信息