
Uma poderosa biblioteca Python e ferramenta CLI para parsing, análise e manipulação de regras YARA através de representação em Árvore Sintática Abstrata (AST)
yaraast é uma biblioteca Python para analisar e manipular regras da família YARA usando Árvores Sintáticas Abstratas (AST). Suporta fluxos de trabalho clássicos de YARA, YARA-L e YARA-X com detecção automática de dialeto e ferramentas de CLI.
| Recurso | Descrição |
|---|---|
| Análise Multi-dialeto | Analisa YARA, YARA-L e YARA-X a partir de arquivos ou strings |
| Detecção Automática de Dialeto | Analisador unificado detecta automaticamente dialetos de regras |
| Ferramentas AST | Constrói, transforma, compara e serializa ASTs |
| Formatação e Validação | Comandos CLI para fluxos de trabalho de análise/formatação/validação |
| Suporte a Streaming | Analisa arquivos muito grandes com modo de streaming |
| Integrações com Ecossistema | Capacidades opcionais relacionadas a LSP e libyara |
Dialetos YARA, YARA-L, YARA-X
Analisadores Analisador padrão, analisador unificado, analisador de streaming
Saídas YARA, JSON, YAML, visualizações de árvore AST
Ferramentas CLI, visitantes, construtores, serialização, verificações semânticas
Os níveis de suporte diferem por dialeto. O YARA clássico é estável, o YARA-X está em beta, o YARA-L é experimental, e a detecção automática de dialeto é de melhor esforço. Consulte a matriz de compatibilidade para os motores e capacidades exatos exercitados pelo 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)
# Analisa e imprime YARA normalizado
yaraast parse rules.yar
# Analisa para JSON
yaraast parse rules.yar --format json
# Analisa com dialeto explícito
yaraast parse rules.yar --dialect yara-x
# Valida arquivo (verificações de sintaxe + análise)
yaraast validate rules.yar
# Formata arquivo in-place (formatador baseado em AST)
yaraast fmt rules.yar
# Verifica formatação sem modificar o arquivo
yaraast fmt rules.yar --check
| Comando | Descrição |
|---|---|
parse | Analisa um arquivo de regras e gera YARA/JSON/YAML/árvore |
validate | Valida regras e executa subcomandos de validação |
fmt | Formatador baseado em AST (com --check e --diff) |
format | Formata entrada em um arquivo de saída de destino |
validate-syntax | Ponto de entrada de validação focada em sintaxe |
lsp | Inicia recursos do Language Server Protocol |
from pathlib import Path
import yaraast
source = "rule example { condition: true }"
# Detecta dialeto automaticamente
document = yaraast.parse(source)
# Força dialeto específico
document = yaraast.parse(source, dialect="yara")
# Analisa arquivos, gera novo código-fonte e formata canonicamente
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")
# Preserva cada byte fora de uma edição explícita de byte UTF-8
offset = source.encode("utf-8").index(b"true")
rewritten = yaraast.rewrite_lossless(
source,
[yaraast.SourceEdit(offset, offset + 4, "false")],
)
# Os analisadores públicos aplicam padrões limitados. Substitua-os por operação quando necessário.
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) levanta ParseCancelledError
ResourceLimits() desativa todos os limites explicitamente. A análise via CLI usa os
padrões públicos; a análise via LSP usa limites mais restritos de entrada, token, aninhamento, padrão e prazo
e nunca armazena em cache um resultado parcial após cancelamento ou falha 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)
# Suporte a LSP
pip install yaraast[lsp]
# Integração com libyara
pip install yaraast[libyara]
# Ferramentas de desempenho
pip install yaraast[performance]
# Suporte a visualização
pip install yaraast[visualization]
# Pacote de suporte de runtime
pip install yaraast[all]
# Ferramentas de runtime e desenvolvimento
pip install yaraast[dev-all]
Contribuições são bem-vindas. Consulte CONTRIBUTING.md para configuração, verificações de qualidade e diretrizes de fluxo de trabalho.
git checkout -b feature/your-change)git commit -m "Add your change")git push origin feature/your-change)A política do projeto está documentada em SECURITY.md, CODE_OF_CONDUCT.md, CHANGELOG.md e MIGRATING.md.
Este projeto é licenciado sob a Licença MIT - consulte LICENSE.
Autor
Construído para fluxos de trabalho de análise de malware e engenharia de detecção