Commit 877d7b343a1e8654b9f86307384080a14b868f65
1 parent
be0f0296
updated oleid to use olefile, improved usage display and comments
Showing
1 changed file
with
55 additions
and
39 deletions
oletools/oleid.py
| 1 | #!/usr/bin/env python | 1 | #!/usr/bin/env python |
| 2 | """ | 2 | """ |
| 3 | -oleid.py - Philippe Lagadec 2012-10-18 | 3 | +oleid.py |
| 4 | 4 | ||
| 5 | oleid is a script to analyze OLE files such as MS Office documents (e.g. Word, | 5 | oleid is a script to analyze OLE files such as MS Office documents (e.g. Word, |
| 6 | Excel), to detect specific characteristics that could potentially indicate that | 6 | Excel), to detect specific characteristics that could potentially indicate that |
| @@ -14,36 +14,42 @@ oleid project website: http://www.decalage.info/python/oleid | @@ -14,36 +14,42 @@ oleid project website: http://www.decalage.info/python/oleid | ||
| 14 | 14 | ||
| 15 | oleid is part of the python-oletools package: | 15 | oleid is part of the python-oletools package: |
| 16 | http://www.decalage.info/python/oletools | 16 | http://www.decalage.info/python/oletools |
| 17 | - | ||
| 18 | -oleid is copyright (c) 2012, Philippe Lagadec (http://www.decalage.info) | ||
| 19 | -All rights reserved. | ||
| 20 | - | ||
| 21 | -Redistribution and use in source and binary forms, with or without modification, | ||
| 22 | -are permitted provided that the following conditions are met: | ||
| 23 | - | ||
| 24 | - * Redistributions of source code must retain the above copyright notice, this | ||
| 25 | - list of conditions and the following disclaimer. | ||
| 26 | - * Redistributions in binary form must reproduce the above copyright notice, | ||
| 27 | - this list of conditions and the following disclaimer in the documentation | ||
| 28 | - and/or other materials provided with the distribution. | ||
| 29 | - | ||
| 30 | -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||
| 31 | -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
| 32 | -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
| 33 | -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
| 34 | -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 35 | -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| 36 | -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 37 | -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
| 38 | -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 39 | -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 40 | """ | 17 | """ |
| 41 | 18 | ||
| 42 | -__version__ = '0.01' | 19 | +#=== LICENSE ================================================================= |
| 20 | + | ||
| 21 | +# oleid is copyright (c) 2012-2014, Philippe Lagadec (http://www.decalage.info) | ||
| 22 | +# All rights reserved. | ||
| 23 | +# | ||
| 24 | +# Redistribution and use in source and binary forms, with or without modification, | ||
| 25 | +# are permitted provided that the following conditions are met: | ||
| 26 | +# | ||
| 27 | +# * Redistributions of source code must retain the above copyright notice, this | ||
| 28 | +# list of conditions and the following disclaimer. | ||
| 29 | +# * Redistributions in binary form must reproduce the above copyright notice, | ||
| 30 | +# this list of conditions and the following disclaimer in the documentation | ||
| 31 | +# and/or other materials provided with the distribution. | ||
| 32 | +# | ||
| 33 | +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||
| 34 | +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
| 35 | +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
| 36 | +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
| 37 | +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 38 | +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| 39 | +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 40 | +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
| 41 | +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 42 | +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 43 | + | ||
| 43 | 44 | ||
| 44 | #------------------------------------------------------------------------------ | 45 | #------------------------------------------------------------------------------ |
| 45 | # CHANGELOG: | 46 | # CHANGELOG: |
| 46 | # 2012-10-29 v0.01 PL: - first version | 47 | # 2012-10-29 v0.01 PL: - first version |
| 48 | +# 2014-11-29 v0.02 PL: - use olefile instead of OleFileIO_PL | ||
| 49 | +# - improved usage display with -h | ||
| 50 | + | ||
| 51 | +__version__ = '0.02' | ||
| 52 | + | ||
| 47 | 53 | ||
| 48 | #------------------------------------------------------------------------------ | 54 | #------------------------------------------------------------------------------ |
| 49 | # TODO: | 55 | # TODO: |
| @@ -60,21 +66,14 @@ __version__ = '0.01' | @@ -60,21 +66,14 @@ __version__ = '0.01' | ||
| 60 | # - verbose option | 66 | # - verbose option |
| 61 | # - csv, xml output | 67 | # - csv, xml output |
| 62 | 68 | ||
| 63 | -import optparse, sys, os, re, zlib, struct | ||
| 64 | -from thirdparty.OleFileIO_PL import OleFileIO_PL | ||
| 65 | 69 | ||
| 70 | +#=== IMPORTS ================================================================= | ||
| 66 | 71 | ||
| 67 | -class Indicator (object): | 72 | +import optparse, sys, os, re, zlib, struct |
| 73 | +import thirdparty.olefile as olefile | ||
| 68 | 74 | ||
| 69 | - def __init__(self, _id, value=None, _type=bool, name=None, description=None): | ||
| 70 | - self.id = _id | ||
| 71 | - self.value = value | ||
| 72 | - self.type = _type | ||
| 73 | - self.name = name | ||
| 74 | - if name == None: | ||
| 75 | - self.name = _id | ||
| 76 | - self.description = description | ||
| 77 | 75 | ||
| 76 | +#=== FUNCTIONS =============================================================== | ||
| 78 | 77 | ||
| 79 | def detect_flash (data): | 78 | def detect_flash (data): |
| 80 | """ | 79 | """ |
| @@ -127,6 +126,20 @@ def detect_flash (data): | @@ -127,6 +126,20 @@ def detect_flash (data): | ||
| 127 | return found | 126 | return found |
| 128 | 127 | ||
| 129 | 128 | ||
| 129 | +#=== CLASSES ================================================================= | ||
| 130 | + | ||
| 131 | +class Indicator (object): | ||
| 132 | + | ||
| 133 | + def __init__(self, _id, value=None, _type=bool, name=None, description=None): | ||
| 134 | + self.id = _id | ||
| 135 | + self.value = value | ||
| 136 | + self.type = _type | ||
| 137 | + self.name = name | ||
| 138 | + if name == None: | ||
| 139 | + self.name = _id | ||
| 140 | + self.description = description | ||
| 141 | + | ||
| 142 | + | ||
| 130 | class OleID: | 143 | class OleID: |
| 131 | 144 | ||
| 132 | def __init__(self, filename): | 145 | def __init__(self, filename): |
| @@ -137,11 +150,11 @@ class OleID: | @@ -137,11 +150,11 @@ class OleID: | ||
| 137 | # check if it is actually an OLE file: | 150 | # check if it is actually an OLE file: |
| 138 | oleformat = Indicator('ole_format', True, name='OLE format') | 151 | oleformat = Indicator('ole_format', True, name='OLE format') |
| 139 | self.indicators.append(oleformat) | 152 | self.indicators.append(oleformat) |
| 140 | - if not OleFileIO_PL.isOleFile(self.filename): | 153 | + if not olefile.isOleFile(self.filename): |
| 141 | oleformat.value = False | 154 | oleformat.value = False |
| 142 | return self.indicators | 155 | return self.indicators |
| 143 | # parse file: | 156 | # parse file: |
| 144 | - self.ole = OleFileIO_PL.OleFileIO(self.filename) | 157 | + self.ole = olefile.OleFileIO(self.filename) |
| 145 | # checks: | 158 | # checks: |
| 146 | self.check_properties() | 159 | self.check_properties() |
| 147 | self.check_encrypted() | 160 | self.check_encrypted() |
| @@ -244,9 +257,12 @@ class OleID: | @@ -244,9 +257,12 @@ class OleID: | ||
| 244 | flash.value += len(found) | 257 | flash.value += len(found) |
| 245 | #print stream, found | 258 | #print stream, found |
| 246 | 259 | ||
| 260 | + | ||
| 261 | +#=== MAIN ================================================================= | ||
| 262 | + | ||
| 247 | def main(): | 263 | def main(): |
| 248 | usage = 'usage: %prog [options] <file>' | 264 | usage = 'usage: %prog [options] <file>' |
| 249 | - parser = optparse.OptionParser(usage=usage) | 265 | + parser = optparse.OptionParser(usage=__doc__ + '\n' + usage) |
| 250 | ## parser.add_option('-o', '--ole', action='store_true', dest='ole', help='Parse an OLE file (e.g. Word, Excel) to look for SWF in each stream') | 266 | ## parser.add_option('-o', '--ole', action='store_true', dest='ole', help='Parse an OLE file (e.g. Word, Excel) to look for SWF in each stream') |
| 251 | 267 | ||
| 252 | (options, args) = parser.parse_args() | 268 | (options, args) = parser.parse_args() |