
Мощная библиотека Python и инструмент командной строки для разбора, анализа и манипуляции правилами YARA с использованием представления в виде абстрактного синтаксического дерева (AST).
yaraast — это Python-библиотека для разбора и манипулирования правилами семейства YARA с использованием абстрактных синтаксических деревьев (AST). Она поддерживает классические рабочие процессы YARA, YARA-L и YARA-X с автоматическим определением диалекта и инструментами командной строки.
| Возможность | Описание |
|---|---|
| Многодиалектный разбор | Разбор YARA, YARA-L и YARA-X из файлов или строк |
| Автоматическое определение диалекта | Единый парсер автоматически определяет диалекты правил |
| Инструменты AST | Создание, преобразование, сравнение и сериализация AST |
| Форматирование и проверка | Команды CLI для рабочих процессов parse/format/validate |
| Потоковая поддержка | Разбор очень больших файлов в потоковом режиме |
| Интеграции экосистемы | Дополнительные возможности LSP и libyara |
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 — экспериментальный, а автоматическое определение диалекта работает по принципу «best effort». См. матрицу совместимости для точного перечня движков и возможностей, проверяемых 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
| Команда | Описание |
|---|---|
parse | Разбор файла правил и вывод YARA/JSON/YAML/дерева |
validate | Проверка правил и выполнение подкоманд проверки |
fmt | Форматтер на основе AST (с --check и --diff) |
format | Форматирование входных данных в целевой выходной файл |
validate-syntax | Точка входа для проверки, ориентированной на синтаксис |
lsp | Запуск функций Language Server Protocol |
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.
Автор
Создано для рабочих процессов анализа вредоносных программ и разработки правил обнаружения