#解析器 #yara #boreal

boreal-parser

为YARA文件提供的解析器库,用于与boreal库一起使用

6个版本 (破坏性)

0.6.0 2024年6月9日
0.5.0 2024年2月16日
0.4.0 2024年2月11日
0.3.0 2023年9月12日
0.1.0 2022年12月4日

#1064 in 解析器实现

Download history 156/week @ 2024-04-26 245/week @ 2024-05-03 179/week @ 2024-05-10 67/week @ 2024-05-17 52/week @ 2024-05-24 184/week @ 2024-05-31 345/week @ 2024-06-07 192/week @ 2024-06-14 97/week @ 2024-06-21 96/week @ 2024-06-28 37/week @ 2024-07-05 44/week @ 2024-07-12 45/week @ 2024-07-19 3/week @ 2024-07-26 82/week @ 2024-08-09

每月下载量:156
2 个crate中使用(通过 boreal

MIT/Apache

295KB
8K SLoC

boreal-parser

此crate提供YARA文件的解析器。

Build status Crates.io Documentation

概述

此crate旨在由boreal crate使用,该crate实现了YARA规则的评估。

支持的YARA版本

处理了YARA 4.5版本中所有可用的功能。


lib.rs:

YARA规则的解析器。

此crate旨在由boreal crate使用。

它公开了一个主入口点函数,parse,该函数解析YARA文件的内容。

use boreal_parser::*;
use boreal_parser::expression::*;
use boreal_parser::file::*;
use boreal_parser::rule::*;

let file = parse(r#"
import "pe"

private rule b : tag1 {
    meta:
        a = true
    strings:
        $b = "\\mspaint.exe" wide
    condition:
        pe.is_dll() and all of them
}"#)?;

assert_eq!(
    file.components[0],
    YaraFileComponent::Import(Import {
        name: "pe".to_owned(),
        span: 1..12,
    })
);
assert_eq!(
    file.components[1],
    YaraFileComponent::Rule(Box::new(Rule {
        name: "b".to_owned(),
        name_span: 27..28,
        tags: vec![RuleTag {
            tag: "tag1".to_owned(),
            span: 31..35
        }],
        metadatas: vec![Metadata {
            name: "a".to_owned(),
            value: MetadataValue::Boolean(true)
        }],
        variables: vec![VariableDeclaration {
            name: "b".to_owned(),
            value: VariableDeclarationValue::Bytes(b"\\mspaint.exe".to_vec()),
            modifiers: VariableModifiers {
                wide: true,
                ..Default::default()
            },
            span: 86..111,
        }],

        condition: Expression {
            expr: ExpressionKind::And(vec![
                Expression {
                    expr: ExpressionKind::Identifier(Identifier {
                        name: "pe".to_owned(),
                        name_span: 135..137,
                        operations: vec![
                            IdentifierOperation {
                                op: IdentifierOperationType::Subfield(
                                    "is_dll".to_owned()
                                ),
                                span: 137..144,
                            },
                            IdentifierOperation {
                                op: IdentifierOperationType::FunctionCall(vec![]),
                                span: 144..146,
                            }
                        ],
                    }),
                    span: 135..146,
                },
                Expression {
                    expr: ExpressionKind::For {
                        selection: ForSelection::All,
                        set: VariableSet { elements: vec![] },

                        body: None,
                    },
                    span: 151..162,
                }
            ]),
            span: 135..162
        },
        is_private: true,
        is_global: false,
    }))
);

依赖关系

~1.3–8.5MB
~61K SLoC