
YARA 규칙을 구문 분석, 분석 및 조작하기 위한 강력한 Python 라이브러리 및 CLI 도구로, 추상 구문 트리(AST) 표현을 통해 작동합니다.
yaraast는 추상 구문 트리(AST)를 사용하여 YARA 계열 규칙을 파싱하고 조작하기 위한 Python 라이브러리입니다. 자동 방언 감지와 CLI 도구를 지원하며 클래식 YARA, YARA-L, YARA-X 워크플로우를 지원합니다.
| 기능 | 설명 |
|---|---|
| 다중 방언 파싱 | 파일 또는 문자열에서 YARA, YARA-L, YARA-X 파싱 |
| 자동 방언 감지 | 통합 파서가 규칙 방언을 자동 감지 |
| AST 도구 | AST 빌드, 변환, diff, 직렬화 |
| 포맷팅 및 검증 | 파싱/포맷/검증 워크플로우용 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은 실험적이며, 자동 방언 감지는 최선의 노력(best effort) 방식입니다. 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 참조.
저자
악성코드 분석 및 탐지 엔지니어링 워크플로우를 위해 제작됨