
Eine leistungsstarke Python-Bibliothek und CLI-Tool zum Parsen, Analysieren und Manipulieren von YARA-Regeln mittels Abstract Syntax Tree (AST)-Darstellung.
yaraast ist eine Python-Bibliothek zum Parsen und Manipulieren von YARA-Familienregeln mithilfe von abstrakten Syntaxbäumen (AST). Sie unterstützt klassische YARA-, YARA-L- und YARA-X-Workflows mit automatischer Dialekterkennung und CLI-Werkzeugen.
| Funktion | Beschreibung |
|---|---|
| Multi-Dialekt-Parsing | YARA, YARA-L und YARA-X aus Dateien oder Zeichenketten parsen |
| Automatische Dialekterkennung | Einheitlicher Parser erkennt Regeldialekte automatisch |
| AST-Werkzeuge | ASTs erstellen, transformieren, diffen und serialisieren |
| Formatierung & Validierung | CLI-Befehle für Parse-/Format-/Validierungs-Workflows |
| Streaming-Unterstützung | Sehr große Dateien im Streaming-Modus parsen |
| Ökosystem-Integrationen | Optionale LSP- und libyara-bezogene Fähigkeiten |
Dialekte YARA, YARA-L, YARA-X
Parser Standard-Parser, einheitlicher Parser, Streaming-Parser
Ausgaben YARA, JSON, YAML, AST-Baumansichten
Werkzeuge CLI, Besucher, Builder, Serialisierung, semantische Prüfungen
Der Unterstützungsgrad variiert je nach Dialekt. Klassisches YARA ist stabil, YARA-X ist Beta, YARA-L ist experimentell, und die automatische Dialekterkennung ist eine Best-Effort-Lösung. Siehe die Kompatibilitätsmatrix für die genauen Engines und Fähigkeiten, die von CI getestet werden.
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)
# Parsen und normalisiertes YARA ausgeben
yaraast parse rules.yar
# Als JSON parsen
yaraast parse rules.yar --format json
# Mit explizitem Dialekt parsen
yaraast parse rules.yar --dialect yara-x
# Datei validieren (Syntax- + Parse-Prüfungen)
yaraast validate rules.yar
# Datei direkt formatieren (AST-basierter Formatierer)
yaraast fmt rules.yar
# Formatierung prüfen, ohne die Datei zu ändern
yaraast fmt rules.yar --check
| Befehl | Beschreibung |
|---|---|
parse | Eine Regeldatei parsen und YARA/JSON/YAML/Baum ausgeben |
validate | Regeln validieren und Validierungs-Unterbefehle ausführen |
fmt | AST-basierter Formatierer (mit --check und --diff) |
format | Eingabe in eine Zieldatei formatieren |
validate-syntax | Auf Syntax fokussierter Validierungs-Einstiegspunkt |
lsp | Language Server Protocol-Funktionen starten |
from pathlib import Path
import yaraast
source = "rule example { condition: true }"
# Dialekt automatisch erkennen
document = yaraast.parse(source)
# Bestimmten Dialekt erzwingen
document = yaraast.parse(source, dialect="yara")
# Dateien parsen, neuen Quellcode erzeugen und kanonisch formatieren
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")
# Jedes Byte außerhalb einer expliziten UTF-8-Byte-Änderung erhalten
offset = source.encode("utf-8").index(b"true")
rewritten = yaraast.rewrite_lossless(
source,
[yaraast.SourceEdit(offset, offset + 4, "false")],
)
# Öffentliche Parser wenden begrenzte Standardwerte an. Bei Bedarf pro Vorgang überschreiben.
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) löst ParseCancelledError aus
ResourceLimits() deaktiviert alle Grenzen explizit. CLI-Parsing verwendet die öffentlichen
Standardwerte; LSP-Parsing verwendet strengere Eingabe-, Token-, Verschachtelungs-, Muster- und Frist-
Grenzen und speichert nach einem Abbruch oder einem Grenzwertfehler niemals ein Teilergebnis zwischen.
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-Unterstützung
pip install yaraast[lsp]
# libyara-Integration
pip install yaraast[libyara]
# Leistungswerkzeuge
pip install yaraast[performance]
# Visualisierungsunterstützung
pip install yaraast[visualization]
# Laufzeit-Unterstützungspaket
pip install yaraast[all]
# Laufzeit- und Entwicklungswerkzeuge
pip install yaraast[dev-all]
Beiträge sind willkommen. Siehe CONTRIBUTING.md für Einrichtung, Qualitätsprüfungen und Workflow-Richtlinien.
git checkout -b feature/your-change)git commit -m "Add your change")git push origin feature/your-change)Die Projektrichtlinien sind dokumentiert in SECURITY.md, CODE_OF_CONDUCT.md, CHANGELOG.md und MIGRATING.md.
Dieses Projekt ist unter der MIT-Lizenz lizenziert – siehe LICENSE.
Autor
Entwickelt für Malware-Analyse- und Detection-Engineering-Workflows