
yaraast は、抽象構文木(AST)を使用してYARA系ルールを解析・操作するためのPythonライブラリです。クラシックなYARA、YARA-L、YARA-Xのワークフローを、自動方言検出とCLIツールでサポートします。
| 機能 | 説明 |
|---|---|
| マルチ方言解析 | ファイルまたは文字列からYARA、YARA-L、YARA-Xを解析 |
| 自動方言検出 | 統合パーサーがルールの方言を自動検出 |
| ASTツール | ASTの構築、変換、差分、シリアライズ |
| フォーマットと検証 | parse/format/validateワークフロー用CLIコマンド |
| ストリーミングサポート | ストリーミングモードで非常に大きなファイルを解析 |
| エコシステム統合 | オプションの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は実験版であり、自動方言検出はベストエフォートです。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/treeを出力 |
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) raises 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 を参照してください。
著者
マルウェア分析と検知エンジニアリングのワークフローのために構築されました