summaryrefslogtreecommitdiff
path: root/utils/generate_whitelist.py
blob: dabaa21985c6f62a9da861fc2e7bebd1f2e63926 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python
#coding=UTF-8

import fnmatch
import hashlib
import os
import sys

try:
    import yara
except ImportError:
    print('Please install python-yara')
    sys.exit(1)

if len(sys.argv) != 3:
    print('Usage: %s name_of_the_rule_and_version folder_to_scan' % sys.argv[0])
    sys.exit(1)

if not os.path.isdir(sys.argv[2]):
    print('%s is not a folder !' % sys.argv[2])
    sys.exit(1)

try:
    rules = yara.compile(sys.path[0]+'/../php.yar', includes=True, error_on_warning=False)
except yara.SyntaxError as e:
    print("Can't compile rules: %s" % e)
    sys.exit(1)

output_list = list()

for curdir, dirnames, filenames in os.walk(sys.argv[2]):
    for filename in filenames:
        fname = os.path.join(curdir, filename)
        if 0 < os.stat(fname).st_size < 5 * 1024 * 1024:
            matches = rules.match(fname, fast=True)
            if matches:
                with open(fname, 'rb') as f:
                    digest = hashlib.sha1(f.read()).hexdigest()
                output_list.append('hash.sha1(0, filesize) == "%s" or // %s' % (digest, fname))


if output_list:
    output_rule = 'import "hash"\n\nrule %s\n{\n\tcondition:\n\t\t/* %s */\n\t\t' % (sys.argv[1].split(' ')[0], sys.argv[1])
    output_rule += '\n\t\t'.join(output_list)
    output_rule += '\n\t\tfalse\n}'
    print(output_rule)