@@ -50,6 +50,10 @@ def to_str(cls):
50
50
return '<Opts(%s)>' % ' ' .join (values )
51
51
52
52
53
+ def eprint (* args , ** kwargs ):
54
+ print (* args , file = sys .stderr , ** kwargs )
55
+
56
+
53
57
def extract_version_arg (index ):
54
58
min_ver , max_ver = (Opts .DEFAULT_MIN , Opts .DEFAULT_MAX )
55
59
if len (sys .argv ) >= (index + 1 ):
@@ -67,7 +71,7 @@ def generate_whitelist(version):
67
71
dl_failed = False
68
72
download_url = Opts .URL_PATTERN .replace ('__version__' , version )
69
73
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 = '' )
71
75
sys .stdout .flush ()
72
76
try :
73
77
resp = urlopen (download_url )
@@ -76,14 +80,14 @@ def generate_whitelist(version):
76
80
dl_failed = True
77
81
resp_code = err .code
78
82
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 )
80
84
return None
81
85
data = StringIO (resp .read ())
82
86
data .seek (0 )
83
- print ("\x1b [1;32mOK\x1b [0m" )
87
+ eprint ("\x1b [1;32mOK\x1b [0m" )
84
88
85
89
# extract archive and check against YARA signatures (in-memory)
86
- print ("[-] Generating whitelist... " , end = '' )
90
+ eprint ("[-] Generating whitelist... " , end = '' )
87
91
sys .stdout .flush ()
88
92
tar = tarfile .open (mode = 'r:gz' , fileobj = data )
89
93
for entry in tar .getnames ():
@@ -94,7 +98,7 @@ def generate_whitelist(version):
94
98
matches = Opts .YARA_RULES .match (data = entry_data , fast = True )
95
99
if matches :
96
100
rules ['/' .join (entry .split ('/' )[1 :])] = sha1 (entry_data ).hexdigest ()
97
- print ("\x1b [1;32mDONE\x1b [0m" )
101
+ eprint ("\x1b [1;32mDONE\x1b [0m" )
98
102
99
103
return rules
100
104
@@ -104,7 +108,7 @@ def generate_whitelist(version):
104
108
105
109
# check args
106
110
if (len (sys .argv ) < 3 ) or (len (sys .argv ) > 6 ):
107
- print (USAGE )
111
+ eprint (USAGE )
108
112
sys .exit (1 )
109
113
110
114
# parse args
@@ -132,8 +136,8 @@ def generate_whitelist(version):
132
136
has_mversion = True
133
137
if rules :
134
138
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
137
141
first_mloop = False
138
142
139
143
has_pversion = False
@@ -154,7 +158,7 @@ def generate_whitelist(version):
154
158
first_ploop = False
155
159
156
160
# remove duplicate entries:
157
- print ("[+] Deduplicating detections... " , end = '' )
161
+ eprint ("[+] Deduplicating detections... " , end = '' )
158
162
known_files = []
159
163
for version , rules in copy (whitelists .items ()):
160
164
used_rules = 0
@@ -167,9 +171,9 @@ def generate_whitelist(version):
167
171
used_rules += 1
168
172
if used_rules == 0 :
169
173
del whitelists [version ]
170
- print ("\x1b [1;32mDONE\x1b [0m" )
174
+ eprint ("\x1b [1;32mDONE\x1b [0m" )
171
175
172
- print ("[+] Generating final whitelist... " , end = '' )
176
+ eprint ("[+] Generating final whitelist... " , end = '' )
173
177
# build final rule
174
178
prefix = 8 * ' '
175
179
conditions = []
@@ -183,7 +187,7 @@ def generate_whitelist(version):
183
187
else :
184
188
cond_str += '%shash.sha1(0, filesize) == "%s" or // %s\n ' % (prefix , digest , filename )
185
189
conditions .append (cond_str )
186
- print ("\x1b [1;32mDONE\x1b [0m" )
190
+ eprint ("\x1b [1;32mDONE\x1b [0m" )
187
191
188
192
final_rule = """
189
193
import "hash"
0 commit comments