
Une puissante bibliothèque Python et un outil CLI pour parser, analyser et manipuler les règles YARA via la représentation en arbre de syntaxe abstraite (AST)
yaraast est une bibliothèque Python pour analyser et manipuler les règles de la famille YARA à l'aide d'arbres de syntaxe abstraite (AST). Elle prend en charge les flux de travail classiques YARA, YARA-L et YARA-X avec détection automatique de dialecte et outils CLI.
| Fonctionnalité | Description |
|---|---|
| Analyse multi-dialectes | Analyse YARA, YARA-L et YARA-X à partir de fichiers ou de chaînes |
| Détection automatique de dialecte | Analyseur unifié qui détecte automatiquement les dialectes de règles |
| Outils AST | Construire, transformer, différencier et sérialiser les AST |
| Formatage et validation | Commandes CLI pour les flux de travail d'analyse/formatage/validation |
| Prise en charge du streaming | Analyse de très grands fichiers en mode streaming |
| Intégrations écosystème | Capacités optionnelles liées à LSP et libyara |
Dialectes YARA, YARA-L, YARA-X
Analyseurs Analyseur standard, analyseur unifié, analyseur de streaming
Sorties YARA, JSON, YAML, vues d'arbre AST
Outils CLI, visiteurs, constructeurs, sérialisation, vérifications sémantiques
Les niveaux de prise en charge diffèrent selon le dialecte. Le YARA classique est stable, YARA-X est en version bêta, YARA-L est expérimental, et la détection automatique de dialecte est au mieux. Consultez la matrice de compatibilité pour connaître les moteurs et capacités exacts testés par 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)
# Analyse et affiche le YARA normalisé
yaraast parse rules.yar
# Analyse en JSON
yaraast parse rules.yar --format json
# Analyse avec un dialecte explicite
yaraast parse rules.yar --dialect yara-x
# Valide le fichier (vérifications de syntaxe + d'analyse)
yaraast validate rules.yar
# Formate le fichier en place (formateur basé sur AST)
yaraast fmt rules.yar
# Vérifie le formatage sans modifier le fichier
yaraast fmt rules.yar --check
| Commande | Description |
|---|---|
parse | Analyse un fichier de règles et génère YARA/JSON/YAML/arbre |
validate | Valide les règles et exécute les sous-commandes de validation |
fmt | Formateur basé sur AST (avec --check et --diff) |
format | Formate l'entrée vers un fichier de sortie cible |
validate-syntax | Point d'entrée de validation axé sur la syntaxe |
lsp | Lance les fonctionnalités du Language Server Protocol |
from pathlib import Path
import yaraast
source = "rule example { condition: true }"
# Détection automatique du dialecte
document = yaraast.parse(source)
# Forcer un dialecte spécifique
document = yaraast.parse(source, dialect="yara")
# Analyser des fichiers, générer une nouvelle source et formater de manière canonique
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")
# Préserver chaque octet en dehors d'une modification d'octet UTF-8 explicite
offset = source.encode("utf-8").index(b"true")
rewritten = yaraast.rewrite_lossless(
source,
[yaraast.SourceEdit(offset, offset + 4, "false")],
)
# Les analyseurs publics appliquent des limites par défaut bornées. Remplacez-les par opération si nécessaire.
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ève ParseCancelledError
ResourceLimits() désactive explicitement toutes les limites. L'analyse CLI utilise les
valeurs par défaut publiques ; l'analyse LSP utilise des limites d'entrée, de jeton, d'imbrication, de motif et de délai
plus strictes et ne met jamais en cache un résultat partiel après une annulation ou un échec de limite.
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)
# Prise en charge LSP
pip install yaraast[lsp]
# Intégration libyara
pip install yaraast[libyara]
# Outils de performance
pip install yaraast[performance]
# Prise en charge de la visualisation
pip install yaraast[visualization]
# Pack de prise en charge d'exécution
pip install yaraast[all]
# Outils d'exécution et de développement
pip install yaraast[dev-all]
Les contributions sont les bienvenues. Consultez CONTRIBUTING.md pour la configuration, les contrôles de qualité et les directives de flux de travail.
git checkout -b feature/your-change)git commit -m "Add your change")git push origin feature/your-change)La politique du projet est documentée dans SECURITY.md, CODE_OF_CONDUCT.md, CHANGELOG.md et MIGRATING.md.
Ce projet est sous licence MIT - voir LICENSE.
Auteur
Conçu pour les flux de travail d'analyse de logiciels malveillants et d'ingénierie de détection