使用 Python AST 工具包解析、分析和转换 YARA 规则
yaraast 是一个用于使用抽象语法树(AST)解析和操作 YARA 系列规则的 Python 库。它支持经典 YARA、YARA-L 和 YARA-X 工作流,并具备自动方言检测和 CLI 工具。
Dialects YARA, YARA-L, YARA-X
Parsers Standard parser, unified parser, streaming parser
Outputs YARA, JSON, YAML, AST tree views
Tooling CLI, visitors, builders, serialization, semantic checks
不同方言的支持级别有所不同。经典 YARA 为稳定版,YARA-X 为测试版, YARA-L 为实验版,自动方言检测为尽力而为。请参阅 兼容性矩阵 了解 CI 所测试的确切引擎和 能力。
pip install yaraast
git clone https://github.com/seifreed/yaraast.git
cd yaraast
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -e .
import yaraast
yara_code = """
rule example {
strings:
$a = "malware" nocase
condition:
$a
}
"""
document = yaraast.parse(yara_code)
print(document.ast.rules[0].name)
# 解析并打印规范化后的 YARA
yaraast parse rules.yar
# 解析为 JSON
yaraast parse rules.yar --format json
# 使用显式方言解析
yaraast parse rules.yar --dialect yara-x
# 验证文件(语法 + 解析检查)
yaraast validate rules.yar
# 原地格式化文件(基于 AST 的格式化器)
yaraast fmt rules.yar
# 检查格式而不修改文件
yaraast fmt rules.yar --check
from pathlib import Path
import yaraast
source = "rule example { condition: true }"
# 自动检测方言
document = yaraast.parse(source)
# 强制指定方言
document = yaraast.parse(source, dialect="yara")
# 解析文件、生成新源码并以规范方式格式化
Path("rules.yar").write_text(source, encoding="utf-8")
file_document = yaraast.parse_file("rules.yar")
generated = yaraast.generate(file_document)
formatted = yaraast.format_canonical(source, dialect="yara")
# 保留显式 UTF-8 字节编辑之外的所有字节
offset = source.encode("utf-8").index(b"true")
rewritten = yaraast.rewrite_lossless(
source,
[yaraast.SourceEdit(offset, offset + 4, "false")],
)
# 公共解析器应用有界默认值。需要时可在每次操作中覆盖它们。
limits = yaraast.ResourceLimits(max_input_bytes=1024 * 1024, parse_deadline=5.0)
document = yaraast.parse(source, resource_limits=limits)
cancel = yaraast.CancellationToken()
cancel.cancel()
# yaraast.parse(source, cancellation_token=cancel) 会抛出 ParseCancelledError
ResourceLimits() 会显式禁用所有限制。CLI 解析使用公共
默认值;LSP 解析使用更严格的输入、令牌、嵌套、模式和截止时间
限制,并且在取消或限制失败后绝不缓存部分结果。
from pathlib import Path
from yaraast.parser import Parser
from yaraast.visitor import BaseVisitor
class RuleCollector(BaseVisitor):
def __init__(self):
self.rules = []
def visit_rule(self, node):
self.rules.append(node.name)
super().visit_rule(node)
ast = Parser(Path("rules.yar").read_text(encoding="utf-8")).parse()
collector = RuleCollector()
collector.visit(ast)
print(collector.rules)
# LSP 支持
pip install yaraast[lsp]
# libyara 集成
pip install yaraast[libyara]
# 性能工具
pip install yaraast[performance]
# 可视化支持
pip install yaraast[visualization]
# 运行时支持包
pip install yaraast[all]
# 运行时和开发工具
pip install yaraast[dev-all]
欢迎贡献。请参阅 CONTRIBUTING.md 了解设置、质量检查和流程指南。
git checkout -b feature/your-change)git commit -m "Add your change")git push origin feature/your-change)项目政策记录在 SECURITY.md、 CODE_OF_CONDUCT.md、CHANGELOG.md 和 MIGRATING.md 中。
本项目采用 MIT 许可证 - 请参阅 LICENSE。
作者
专为恶意软件分析和检测工程工作流而构建
| 特性 | 描述 |
|---|
| 多方言解析 | 从文件或字符串解析 YARA、YARA-L 和 YARA-X |
| 自动方言检测 | 统一解析器自动检测规则方言 |
| AST 工具 | 构建、转换、比较和序列化 AST |
| 格式化与验证 | 用于解析/格式化/验证工作流的 CLI 命令 |
| 流式支持 | 以流式模式解析非常大的文件 |
| 生态集成 | 可选的 LSP 和 libyara 相关能力 |
| 命令 | 描述 |
|---|
parse | 解析规则文件并输出 YARA/JSON/YAML/树 |
validate | 验证规则并运行验证子命令 |
fmt | 基于 AST 的格式化器(支持 --check 和 --diff) |
format | 将输入格式化为目标输出文件 |
validate-syntax | 面向语法验证的入口点 |
lsp | 启动语言服务器协议功能 |