
yaraast v2.0.1rc1
YARA नियमों को Abstract Syntax Tree (AST) प्रतिनिधित्व के माध्यम से पार्स करने, विश्लेषण करने और हेरफेर करने के लिए एक शक्तिशाली Python लाइब्रेरी और CLI टूल
yaraast
Python AST टूलकिट के साथ YARA नियमों को पार्स, विश्लेषित और रूपांतरित करें
अवलोकन
yaraast एक Python लाइब्रेरी है जो Abstract Syntax Trees (AST) का उपयोग करके YARA-परिवार के नियमों को पार्स और हेरफेर करने के लिए है। यह स्वचालित डायलेक्ट पहचान और CLI टूलिंग के साथ क्लासिक YARA, YARA-L, और YARA-X वर्कफ़्लो का समर्थन करता है।
मुख्य विशेषताएँ
| विशेषता | विवरण |
|---|---|
| बहु-डायलेक्ट पार्सिंग | फ़ाइलों या स्ट्रिंग्स से YARA, YARA-L, और YARA-X पार्स करें |
| स्वचालित डायलेक्ट पहचान | एकीकृत पार्सर नियम डायलेक्ट्स का स्वतः पता लगाता है |
| AST टूलिंग | AST बनाएं, रूपांतरित करें, अंतर देखें, और क्रमबद्ध करें |
| फ़ॉर्मेटिंग और सत्यापन | पार्स/फ़ॉर्मेट/वैलिडेट वर्कफ़्लो के लिए 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 द्वारा परीक्षण किए गए सटीक इंजन और क्षमताओं के लिए संगतता मैट्रिक्स देखें।
स्थापना
PyPI से (अनुशंसित)
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
मुख्य CLI कमांड
| कमांड | विवरण |
|---|---|
parse | नियम फ़ाइल पार्स करें और YARA/JSON/YAML/tree आउटपुट करें |
validate | नियम सत्यापित करें और सत्यापन उपकमांड चलाएँ |
fmt | AST-आधारित फ़ॉर्मेटर (--check और --diff के साथ) |
format | इनपुट को लक्ष्य आउटपुट फ़ाइल में फ़ॉर्मेट करें |
validate-syntax | सिंटैक्स-केंद्रित सत्यापन प्रवेश बिंदु |
lsp | Language Server Protocol सुविधाएँ लॉन्च करें |
Python लाइब्रेरी
एकीकृत पार्सिंग
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]
रनटाइम दस्तावेज़
- डायलेक्ट संगतता: docs/compatibility.md
- LSP रनटाइम आंतरिक: docs/lsp-runtime.md
- LSP समानता रिपोर्ट: docs/lsp-parity-report.md
- नवीनतम रनटाइम बेंचमार्क आर्टिफैक्ट: docs/benchmarks/lsp-runtime-latest.json
आवश्यकताएँ
- Python 3.11, 3.12, 3.13, या 3.14
- पूर्ण निर्भरता और अतिरिक्त सूची के लिए pyproject.toml देखें
योगदान
योगदान का स्वागत है। सेटअप, गुणवत्ता जाँच, और वर्कफ़्लो दिशानिर्देशों के लिए CONTRIBUTING.md देखें।
- रिपॉजिटरी को फ़ोर्क करें
- एक ब्रांच बनाएं (
git checkout -b feature/your-change) - परिवर्तन कमिट करें (
git commit -m "Add your change") - पुश करें (
git push origin feature/your-change) - एक Pull Request खोलें
परियोजना नीति SECURITY.md, CODE_OF_CONDUCT.md, CHANGELOG.md, और MIGRATING.md में प्रलेखित है।
लाइसेंस
यह परियोजना MIT लाइसेंस के तहत लाइसेंस प्राप्त है - LICENSE देखें।
लेखक
- Marc Rivero ([email protected])
- रिपॉजिटरी: github.com/seifreed/yaraast
मैलवेयर विश्लेषण और डिटेक्शन इंजीनियरिंग वर्कफ़्लो के लिए निर्मित