Commit 537fb409c6f08cb4b82d7721859f8d77a18a216e

Authored by Philippe Lagadec
1 parent b7cb5b22

updated pyxswf to use olefile, improved usage display and comments

Showing 1 changed file with 39 additions and 29 deletions
oletools/pyxswf.py
@@ -21,37 +21,41 @@ pyxswf project website: http://www.decalage.info/python/pyxswf @@ -21,37 +21,41 @@ pyxswf project website: http://www.decalage.info/python/pyxswf
21 21
22 pyxswf is part of the python-oletools package: 22 pyxswf is part of the python-oletools package:
23 http://www.decalage.info/python/oletools 23 http://www.decalage.info/python/oletools
24 -  
25 -pyxswf is copyright (c) 2012, Philippe Lagadec (http://www.decalage.info)  
26 -All rights reserved.  
27 -  
28 -Redistribution and use in source and binary forms, with or without modification,  
29 -are permitted provided that the following conditions are met:  
30 -  
31 - * Redistributions of source code must retain the above copyright notice, this  
32 - list of conditions and the following disclaimer.  
33 - * Redistributions in binary form must reproduce the above copyright notice,  
34 - this list of conditions and the following disclaimer in the documentation  
35 - and/or other materials provided with the distribution.  
36 -  
37 -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND  
38 -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED  
39 -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  
40 -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE  
41 -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  
42 -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR  
43 -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER  
44 -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,  
45 -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  
46 -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
47 """ 24 """
48 25
49 -__version__ = '0.02' 26 +#=== LICENSE =================================================================
  27 +
  28 +# pyxswf is copyright (c) 2012-2014, Philippe Lagadec (http://www.decalage.info)
  29 +# All rights reserved.
  30 +#
  31 +# Redistribution and use in source and binary forms, with or without modification,
  32 +# are permitted provided that the following conditions are met:
  33 +#
  34 +# * Redistributions of source code must retain the above copyright notice, this
  35 +# list of conditions and the following disclaimer.
  36 +# * Redistributions in binary form must reproduce the above copyright notice,
  37 +# this list of conditions and the following disclaimer in the documentation
  38 +# and/or other materials provided with the distribution.
  39 +#
  40 +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  41 +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  42 +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  43 +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  44 +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  45 +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  46 +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  47 +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  48 +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  49 +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 50
51 #------------------------------------------------------------------------------ 51 #------------------------------------------------------------------------------
52 # CHANGELOG: 52 # CHANGELOG:
53 # 2012-09-17 v0.01 PL: - first version 53 # 2012-09-17 v0.01 PL: - first version
54 # 2012-11-09 v0.02 PL: - added RTF embedded objects extraction 54 # 2012-11-09 v0.02 PL: - added RTF embedded objects extraction
  55 +# 2014-11-29 v0.03 PL: - use olefile instead of OleFileIO_PL
  56 +# - improved usage display with -h
  57 +
  58 +__version__ = '0.03'
55 59
56 #------------------------------------------------------------------------------ 60 #------------------------------------------------------------------------------
57 # TODO: 61 # TODO:
@@ -63,9 +67,15 @@ __version__ = '0.02' @@ -63,9 +67,15 @@ __version__ = '0.02'
63 # - check if file is OLE 67 # - check if file is OLE
64 # - support -r 68 # - support -r
65 69
  70 +
  71 +#=== IMPORTS =================================================================
  72 +
66 import optparse, sys, os, rtfobj, StringIO 73 import optparse, sys, os, rtfobj, StringIO
67 from thirdparty.xxxswf import xxxswf 74 from thirdparty.xxxswf import xxxswf
68 -from thirdparty.OleFileIO_PL import OleFileIO_PL 75 +import thirdparty.olefile as olefile
  76 +
  77 +
  78 +#=== MAIN =================================================================
69 79
70 def main(): 80 def main():
71 # Scenarios: 81 # Scenarios:
@@ -77,7 +87,7 @@ def main(): @@ -77,7 +87,7 @@ def main():
77 # Scan directory recursively for files that contain SWF(s) and extract them 87 # Scan directory recursively for files that contain SWF(s) and extract them
78 88
79 usage = 'usage: %prog [options] <file.bad>' 89 usage = 'usage: %prog [options] <file.bad>'
80 - parser = optparse.OptionParser(usage=usage) 90 + parser = optparse.OptionParser(usage=__doc__ + '\n' + usage)
81 parser.add_option('-x', '--extract', action='store_true', dest='extract', help='Extracts the embedded SWF(s), names it MD5HASH.swf & saves it in the working dir. No addition args needed') 91 parser.add_option('-x', '--extract', action='store_true', dest='extract', help='Extracts the embedded SWF(s), names it MD5HASH.swf & saves it in the working dir. No addition args needed')
82 parser.add_option('-y', '--yara', action='store_true', dest='yara', help='Scans the SWF(s) with yara. If the SWF(s) is compressed it will be deflated. No addition args needed') 92 parser.add_option('-y', '--yara', action='store_true', dest='yara', help='Scans the SWF(s) with yara. If the SWF(s) is compressed it will be deflated. No addition args needed')
83 parser.add_option('-s', '--md5scan', action='store_true', dest='md5scan', help='Scans the SWF(s) for MD5 signatures. Please see func checkMD5 to define hashes. No addition args needed') 93 parser.add_option('-s', '--md5scan', action='store_true', dest='md5scan', help='Scans the SWF(s) for MD5 signatures. Please see func checkMD5 to define hashes. No addition args needed')
@@ -92,7 +102,7 @@ def main(): @@ -92,7 +102,7 @@ def main():
92 102
93 (options, args) = parser.parse_args() 103 (options, args) = parser.parse_args()
94 104
95 - # Print help if no argurments are passed 105 + # Print help if no arguments are passed
96 if len(args) == 0: 106 if len(args) == 0:
97 parser.print_help() 107 parser.print_help()
98 return 108 return
@@ -100,9 +110,9 @@ def main(): @@ -100,9 +110,9 @@ def main():
100 # OLE MODE: 110 # OLE MODE:
101 if options.ole: 111 if options.ole:
102 for filename in args: 112 for filename in args:
103 - ole = OleFileIO_PL.OleFileIO(filename) 113 + ole = olefile.OleFileIO(filename)
104 for direntry in ole.direntries: 114 for direntry in ole.direntries:
105 - if direntry is not None and direntry.entry_type == OleFileIO_PL.STGTY_STREAM: 115 + if direntry is not None and direntry.entry_type == olefile.STGTY_STREAM:
106 f = ole._open(direntry.isectStart, direntry.size) 116 f = ole._open(direntry.isectStart, direntry.size)
107 # check if data contains the SWF magic: FWS or CWS 117 # check if data contains the SWF magic: FWS or CWS
108 data = f.getvalue() 118 data = f.getvalue()