Commit c555887be4a587e833437637f857103fd8eb6db3

Authored by Philippe Lagadec
Committed by GitHub
2 parents d183de8a ba73ec7e

Merge pull request #88 from sebdraven/master

modify import to package oletools
oletools/olevba3.py
... ... @@ -244,15 +244,15 @@ except ImportError:
244 244 + "see http://codespeak.net/lxml " \
245 245 + "or http://effbot.org/zone/element-index.htm")
246 246  
247   -import thirdparty.olefile as olefile
248   -from thirdparty.prettytable import prettytable
249   -from thirdparty.xglob import xglob, PathNotFoundException
250   -from thirdparty.pyparsing.pyparsing import \
  247 +import oletools.thirdparty.olefile as olefile
  248 +from oletools.thirdparty.prettytable import prettytable
  249 +from oletools.thirdparty.xglob import xglob, PathNotFoundException
  250 +from oletools.thirdparty.pyparsing.pyparsing import \
251 251 CaselessKeyword, CaselessLiteral, Combine, Forward, Literal, \
252 252 Optional, QuotedString,Regex, Suppress, Word, WordStart, \
253 253 alphanums, alphas, hexnums,nums, opAssoc, srange, \
254 254 infixNotation
255   -import ppt_parser
  255 +import oletools.ppt_parser as ppt_parser
256 256  
257 257 # monkeypatch email to fix issue #32:
258 258 # allow header lines without ":"
... ... @@ -1774,7 +1774,7 @@ def detect_hex_strings(vba_code):
1774 1774 value = match.group()
1775 1775 if value not in found:
1776 1776 decoded = binascii.unhexlify(value)
1777   - results.append((value, decoded))
  1777 + results.append((value, decoded.decode('utf-8','replace')))
1778 1778 found.add(value)
1779 1779 return results
1780 1780  
... ... @@ -1799,7 +1799,7 @@ def detect_base64_strings(vba_code):
1799 1799 if value not in found and value.lower() not in BASE64_WHITELIST:
1800 1800 try:
1801 1801 decoded = base64.b64decode(value)
1802   - results.append((value, decoded))
  1802 + results.append((value, decoded.decode('utf-8','replace')))
1803 1803 found.add(value)
1804 1804 except (TypeError, ValueError) as exc:
1805 1805 log.debug('Failed to base64-decode (%s)' % exc)
... ... @@ -1814,7 +1814,7 @@ def detect_dridex_strings(vba_code):
1814 1814 :param vba_code: str, VBA source code
1815 1815 :return: list of str tuples (encoded string, decoded string)
1816 1816 """
1817   - from thirdparty.DridexUrlDecoder.DridexUrlDecoder import DridexUrlDecode
  1817 + from oletools.thirdparty.DridexUrlDecoder.DridexUrlDecoder import DridexUrlDecode
1818 1818  
1819 1819 results = []
1820 1820 found = set()
... ... @@ -1959,10 +1959,10 @@ class VBA_Scanner(object):
1959 1959 """
1960 1960 # join long lines ending with " _":
1961 1961 self.code = vba_collapse_long_lines(vba_code)
1962   - self.code_hex = b''
1963   - self.code_hex_rev = b''
1964   - self.code_rev_hex = b''
1965   - self.code_base64 = b''
  1962 + self.code_hex = ''
  1963 + self.code_hex_rev = ''
  1964 + self.code_rev_hex = ''
  1965 + self.code_base64 = ''
1966 1966 self.code_dridex = ''
1967 1967 self.code_vba = ''
1968 1968 self.strReverse = None
... ... @@ -1995,19 +1995,19 @@ class VBA_Scanner(object):
1995 1995 if 'strreverse' in self.code.lower(): self.strReverse = True
1996 1996 # Then append the decoded strings to the VBA code, to detect obfuscated IOCs and keywords:
1997 1997 for encoded, decoded in self.hex_strings:
1998   - self.code_hex += b'\n' + decoded
  1998 + self.code_hex += '\n' + decoded
1999 1999 # if the code contains "StrReverse", also append the hex strings in reverse order:
2000 2000 if self.strReverse:
2001 2001 # StrReverse after hex decoding:
2002   - self.code_hex_rev += b'\n' + decoded[::-1]
  2002 + self.code_hex_rev += '\n' + decoded[::-1]
2003 2003 # StrReverse before hex decoding:
2004   - self.code_rev_hex += b'\n' + binascii.unhexlify(encoded[::-1])
  2004 + self.code_rev_hex += '\n' + str(binascii.unhexlify(encoded[::-1]))
2005 2005 #example: https://malwr.com/analysis/NmFlMGI4YTY1YzYyNDkwNTg1ZTBiZmY5OGI3YjlhYzU/
2006 2006 #TODO: also append the full code reversed if StrReverse? (risk of false positives?)
2007 2007 # Detect Base64-encoded strings
2008 2008 self.base64_strings = detect_base64_strings(self.code)
2009 2009 for encoded, decoded in self.base64_strings:
2010   - self.code_base64 += b'\n' + decoded
  2010 + self.code_base64 += '\n' + decoded
2011 2011 # Detect Dridex-encoded strings
2012 2012 self.dridex_strings = detect_dridex_strings(self.code)
2013 2013 for encoded, decoded in self.dridex_strings:
... ... @@ -2026,10 +2026,10 @@ class VBA_Scanner(object):
2026 2026  
2027 2027 for code, obfuscation in (
2028 2028 (self.code, None),
2029   - (self.code_hex.decode('utf-8','replace'), 'Hex'),
  2029 + (self.code_hex, 'Hex'),
2030 2030 (self.code_hex_rev, 'Hex+StrReverse'),
2031 2031 (self.code_rev_hex, 'StrReverse+Hex'),
2032   - (self.code_base64.decode('utf-8', 'replace'), 'Base64'),
  2032 + (self.code_base64, 'Base64'),
2033 2033 (self.code_dridex, 'Dridex'),
2034 2034 (self.code_vba, 'VBA expression'),
2035 2035 ):
... ...
oletools/ppt_parser.py
... ... @@ -37,7 +37,7 @@ import struct
37 37 import traceback
38 38 import os
39 39  
40   -import thirdparty.olefile as olefile
  40 +import oletools.thirdparty.olefile as olefile
41 41 import zlib
42 42  
43 43  
... ...
setup.py
... ... @@ -287,11 +287,11 @@ entry_points = {
287 287 def main():
288 288 # TODO: remove this test once all tools are ported to Python 3
289 289 # TODO: warning about Python 2.6
290   - if sys.version >= '3.0':
291   - s = "Sorry, %s %s requires Python 2.x."
292   - print(s % (name, version))
293   - sys.exit(1)
294   -## if sys.version < required_python_version:
  290 +# if sys.version >= '3.0':
  291 +# s = "Sorry, %s %s requires Python 2.x."
  292 +# print(s % (name, version))
  293 +# sys.exit(1)
  294 +# ## if sys.version < required_python_version:
295 295 ## s = "I'm sorry, but %s %s requires Python %s or later."
296 296 ## print(s % (name, version, required_python_version))
297 297 ## sys.exit(1)
... ...