跳转到主要内容

解析YARA规则。

项目描述

Build Status Documentation Status Code Health Test Coverage PyPi Version

YARA 规则解析为字典表示。

Plyara是一个脚本和库,它将一个包含一个或多个YARA规则的文件解析为Python字典表示。该工具的目的是使对大量YARA规则执行批量操作或转换变得更容易,例如提取指标、更新属性和分析语料库。其他应用还包括代码检查器和依赖项检查器。

Plyara利用Python模块 PLY 对YARA规则进行词法分析。

这是一个由社区维护的,基于原始plyara(由8u1a创建)的分支。已获得“plyara”商标的使用许可。

安装

Plyara需要Python 3.6及以上版本。

使用pip进行安装

pip3 install plyara

使用方法

在您的应用程序中使用plyara Python库

>>> import plyara
>>> parser = plyara.Plyara()
>>> mylist = parser.parse_string('rule MyRule { strings: $a="1" \n condition: false }')
>>>
>>> import pprint
>>> pprint.pprint(mylist)
[{'condition_terms': ['false'],
  'raw_condition': 'condition: false ',
  'raw_strings': 'strings: $a="1" \n ',
  'rule_name': 'MyRule',
  'start_line': 1,
  'stop_line': 2,
  'strings': [{'name': '$a', 'type': 'text', 'value': '1'}]}]
>>>

或者,使用包含的plyara脚本从命令行执行

$ plyara -h
usage: plyara [-h] [--log] FILE

Parse YARA rules into a dictionary representation.

positional arguments:
  FILE        File containing YARA rules to parse.

optional arguments:
  -h, --help  show this help message and exit
  --log       Enable debug logging to the console.

命令行工具在解析规则时将打印有效的JSON输出

$ cat example.yar
rule silent_banker : banker
{
    meta:
        description = "This is just an example"
        thread_level = 3
        in_the_wild = true
    strings:
        $a = {6A 40 68 00 30 00 00 6A 14 8D 91}
        $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
        $c = "UVODFRYSIHLNWPEJXQZAKCBGMT"
    condition:
        $a or $b or $c
}

$ plyara example.yar
[
    {
        "condition_terms": [
            "$a",
            "or",
            "$b",
            "or",
            "$c"
        ],
        "metadata": [
            {
                "description": "This is just an example"
            },
            {
                "thread_level": 3
            },
            {
                "in_the_wild": true
            }
        ],
        "raw_condition": "condition:\n        $a or $b or $c\n",
        "raw_meta": "meta:\n        description = \"This is just an example\"\n        thread_level = 3\n        in_the_wild = true\n    ",
        "raw_strings": "strings:\n        $a = {6A 40 68 00 30 00 00 6A 14 8D 91}\n        $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}\n        $c = \"UVODFRYSIHLNWPEJXQZAKCBGMT\"\n    ",
        "rule_name": "silent_banker",
        "start_line": 1,
        "stop_line": 13,
        "strings": [
            {
                "name": "$a",
                "type": "byte",
                "value": "{6A 40 68 00 30 00 00 6A 14 8D 91}"
            },
            {
                "name": "$b",
                "type": "byte",
                "value": "{8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}"
            },
            {
                "name": "$c",
                "type": "text",
                "value": "UVODFRYSIHLNWPEJXQZAKCBGMT"
            }
        ],
        "tags": [
            "banker"
        ]
    }
]

重用解析器

如果您想要在解析大量规则或规则集时重用解析器对象以获得效率,必须使用新的clear()方法。

rules = list()
parser = plyara.Plyara()

for file in files:
    with open(file, 'r') as fh:
        yararules = parser.parse_string(fh.read())
        rules += yararules
    parser.clear()

迁移

如果您使用了plyara的旧版本,并希望迁移到这个版本,将需要进行一些修改。最重要的是,解析器对象的实例化方式已经改变。它曾是

# Old style - don't do this!
import plyara.interp as interp
rules_list = interp.parseString(open('myfile.yar').read())

但现在

# New style - do this instead!
import plyara
parser = plyara.Plyara()
rules_list = parser.parse_string(open('myfile.yar').read())

现有的已解析键保持不变,并添加了新的键。

当为多个规则和/或文件重用解析器时,请注意现在导入在所有规则间是共享的 - 如果某个规则有导入,该导入将被添加到您的解析器对象中的所有规则中。

贡献

  • 如果您发现了一个错误,或者想要看到新功能,Pull Requests和问题总是受欢迎的。

  • 通过提交更改,您同意根据LICENSE条款发布这些更改。

  • 为您的更改编写通过单元测试,虽然不是必需的,但非常鼓励并受到赞赏。

  • 请将所有代码贡献通过我们为该项目使用的每个linters:pycodestyle,pydocstyle,和pyflakes。有关这些linters的详细信息,请参阅Python代码质量权威机构:http://meta.pycqa.org/en/latest/

讨论

  • 您可以在irc.freenode.net #plyara的IRC频道加入我们

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

plyara-2.1.1.tar.gz (17.3 kB 查看哈希值)

上传时间 源代码

构建分发

plyara-2.1.1-py3-none-any.whl (23.7 kB 查看哈希值)

上传时间 Python 3

支持者