
YARA नियमों को Abstract Syntax Tree (AST) प्रतिनिधित्व के माध्यम से पार्स करने, विश्लेषण करने और हेरफेर करने के लिए एक शक्तिशाली Python लाइब्रेरी और CLI टूल
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 द्वारा परीक्षण किए गए सटीक इंजन और क्षमताओं के लिए संगतता मैट्रिक्स देखें।
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 देखें।
लेखक
मैलवेयर विश्लेषण और डिटेक्शन इंजीनियरिंग वर्कफ़्लो के लिए निर्मित