Parse YARA rules.
Project description
Parse YARA rules into a dictionary representation.
Plyara is a script and library that lexes and parses a file consisting of one more YARA rules into a python dictionary representation. The goal of this tool is to make it easier to perform bulk operations or transformations of large sets of YARA rules, such as extracting indicators, updating attributes, and analyzing a corpus. Other applications include linters and dependency checkers.
Plyara leverages the Python module PLY for lexing YARA rules.
This is a community-maintained fork of the original plyara by 8u1a. The “plyara” trademark is used with permission.
Installation
Install with pip:
pip install plyara
Usage
Use the plyara Python library in your own applications:
>>> 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', 'value': '"1"'}]}]
>>>
Or, use the included plyara script from the command line:
$ plyara -h usage: plyara.py [-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.
The command-line tool will print valid JSON output when parsing rules:
$ 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", "in_the_wild": "true", "thread_level": "3" }, "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", "value": "{6A 40 68 00 30 00 00 6A 14 8D 91}" }, { "name": "$b", "value": "{8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}" }, { "name": "$c", "value": "\"UVODFRYSIHLNWPEJXQZAKCBGMT\"" } ], "tags": [ "banker" ] } ]
Migration
If you used an older version of plyara, and want to migrate to this version, there will be some changes required. Most importantly, the parser object instantiation has changed. It was:
# Old style - don't do this!
import plyara.interp as interp
rules_list = interp.parseString(open('myfile.yar').read())
But is now:
# New style - do this instead!
import plyara
parser = plyara.Plyara()
rules_list = parser.parse_string(open('myfile.yar').read())
The existing parsed keys have stayed the same, and new ones have been added.
When reusing a parser for multiple rules and/or files, be aware that imports are now shared across all rules - if one rule has an import, that import will be added to all rules in your parser object.
Contributing
Discussion
You may join our IRC channel on irc.freenode.net #plyara
Additionally, project developers can join our slack http://plyara.slack.com (If you need an invite, please ask in the IRC channel.)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file plyara-1.4.0.tar.gz
.
File metadata
- Download URL: plyara-1.4.0.tar.gz
- Upload date:
- Size: 13.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.18.4 setuptools/38.5.1 requests-toolbelt/0.8.0 tqdm/4.22.0 CPython/2.7.14
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 977a15214e0f46b2ff4787dc4edaefb4e0d138a3c73430ddedfba6a00890c995 |
|
MD5 | 60782e8767a540bee616b78248918cfb |
|
BLAKE2b-256 | dfce43a7145c22804741ff64649de7e8c8154937b616e4317979d4374b5b0312 |
File details
Details for the file plyara-1.4.0-py2.py3-none-any.whl
.
File metadata
- Download URL: plyara-1.4.0-py2.py3-none-any.whl
- Upload date:
- Size: 16.4 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.18.4 setuptools/38.5.1 requests-toolbelt/0.8.0 tqdm/4.22.0 CPython/2.7.14
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fd8c8a594110f689ed57cd6185a5e61246d996adb60876902689e8730676daf4 |
|
MD5 | 07231345392856552ea766057df6f3d0 |
|
BLAKE2b-256 | 0b8ee1d8e368313f9a54c8f6378b2da60a9474a37fdb232b286949cace07cef5 |