Skip to content

Commit 882a1ab

Browse files
jeroenvermeulenjvoisin
authored andcommittedJul 16, 2018
Updated mass_whitelist to output progress to STDERR (#75)
Only the generated rules are printed to STDOUT Now you can do: ``` ./mass_whitelist.py [NAME] [URL_PATTERN] [MAJOR] [MINOR] [PATCH] > ../whitelists/name.yar ```
1 parent 80d3f7f commit 882a1ab

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed
 

‎php-malware-finder/utils/mass_whitelist.py

+16-12
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ def to_str(cls):
5050
return '<Opts(%s)>' % ' '.join(values)
5151

5252

53+
def eprint(*args, **kwargs):
54+
print(*args, file=sys.stderr, **kwargs)
55+
56+
5357
def extract_version_arg(index):
5458
min_ver, max_ver = (Opts.DEFAULT_MIN, Opts.DEFAULT_MAX)
5559
if len(sys.argv) >= (index + 1):
@@ -67,7 +71,7 @@ def generate_whitelist(version):
6771
dl_failed = False
6872
download_url = Opts.URL_PATTERN.replace('__version__', version)
6973
download_url_str = Opts.URL_PATTERN.replace('__version__', '\x1b[1;33m%s\x1b[0m' % version)
70-
print("[+] Downloading %s... " % download_url_str, end='')
74+
eprint("[+] Downloading %s... " % download_url_str, end='')
7175
sys.stdout.flush()
7276
try:
7377
resp = urlopen(download_url)
@@ -76,14 +80,14 @@ def generate_whitelist(version):
7680
dl_failed = True
7781
resp_code = err.code
7882
if dl_failed or (resp_code != 200):
79-
print("\x1b[1;31mFAILED (%d)\x1b[0m" % resp_code)
83+
eprint("\x1b[1;31mFAILED (%d)\x1b[0m" % resp_code)
8084
return None
8185
data = StringIO(resp.read())
8286
data.seek(0)
83-
print("\x1b[1;32mOK\x1b[0m")
87+
eprint("\x1b[1;32mOK\x1b[0m")
8488

8589
# extract archive and check against YARA signatures (in-memory)
86-
print("[-] Generating whitelist... ", end='')
90+
eprint("[-] Generating whitelist... ", end='')
8791
sys.stdout.flush()
8892
tar = tarfile.open(mode='r:gz', fileobj=data)
8993
for entry in tar.getnames():
@@ -94,7 +98,7 @@ def generate_whitelist(version):
9498
matches = Opts.YARA_RULES.match(data=entry_data, fast=True)
9599
if matches:
96100
rules['/'.join(entry.split('/')[1:])] = sha1(entry_data).hexdigest()
97-
print("\x1b[1;32mDONE\x1b[0m")
101+
eprint("\x1b[1;32mDONE\x1b[0m")
98102

99103
return rules
100104

@@ -104,7 +108,7 @@ def generate_whitelist(version):
104108

105109
# check args
106110
if (len(sys.argv) < 3) or (len(sys.argv) > 6):
107-
print(USAGE)
111+
eprint(USAGE)
108112
sys.exit(1)
109113

110114
# parse args
@@ -132,8 +136,8 @@ def generate_whitelist(version):
132136
has_mversion = True
133137
if rules:
134138
whitelists[version] = rules
135-
if (rules is None) and (has_mversion or not first_mloop):
136-
break
139+
#if (rules is None) and (has_mversion or not first_mloop):
140+
# break
137141
first_mloop = False
138142

139143
has_pversion = False
@@ -154,7 +158,7 @@ def generate_whitelist(version):
154158
first_ploop = False
155159

156160
# remove duplicate entries:
157-
print("[+] Deduplicating detections... ", end='')
161+
eprint("[+] Deduplicating detections... ", end='')
158162
known_files = []
159163
for version, rules in copy(whitelists.items()):
160164
used_rules = 0
@@ -167,9 +171,9 @@ def generate_whitelist(version):
167171
used_rules += 1
168172
if used_rules == 0:
169173
del whitelists[version]
170-
print("\x1b[1;32mDONE\x1b[0m")
174+
eprint("\x1b[1;32mDONE\x1b[0m")
171175

172-
print("[+] Generating final whitelist... ", end='')
176+
eprint("[+] Generating final whitelist... ", end='')
173177
# build final rule
174178
prefix = 8 * ' '
175179
conditions = []
@@ -183,7 +187,7 @@ def generate_whitelist(version):
183187
else:
184188
cond_str += '%shash.sha1(0, filesize) == "%s" or // %s\n' % (prefix, digest, filename)
185189
conditions.append(cond_str)
186-
print("\x1b[1;32mDONE\x1b[0m")
190+
eprint("\x1b[1;32mDONE\x1b[0m")
187191

188192
final_rule = """
189193
import "hash"

0 commit comments

Comments
 (0)
Failed to load comments.