Commit 6d2d684468dc7cd53ec2a965df2f809e11ae1f56

Authored by decalage2
1 parent e712f8ca

olemap: added header display, added options --header, --fat and --minifat

Showing 1 changed file with 36 additions and 3 deletions
oletools/olemap.py
@@ -46,6 +46,8 @@ http://www.decalage.info/python/oletools @@ -46,6 +46,8 @@ http://www.decalage.info/python/oletools
46 # 2017-03-20 v0.51 PL: - fixed absolute imports, added optparse 46 # 2017-03-20 v0.51 PL: - fixed absolute imports, added optparse
47 # - added support for zip files and wildcards 47 # - added support for zip files and wildcards
48 # - improved MiniFAT display with tablestream 48 # - improved MiniFAT display with tablestream
  49 +# 2017-03-21 PL: - added header display
  50 +# - added options --header, --fat and --minifat
49 51
50 52
51 __version__ = '0.51dev3' 53 __version__ = '0.51dev3'
@@ -55,7 +57,7 @@ __version__ = '0.51dev3' @@ -55,7 +57,7 @@ __version__ = '0.51dev3'
55 57
56 # === IMPORTS ================================================================ 58 # === IMPORTS ================================================================
57 59
58 -import sys, os, optparse 60 +import sys, os, optparse, binascii
59 61
60 # IMPORTANT: it should be possible to run oletools directly as scripts 62 # IMPORTANT: it should be possible to run oletools directly as scripts
61 # in any directory without installing them with pip or setup.py. 63 # in any directory without installing them with pip or setup.py.
@@ -111,6 +113,21 @@ def sid_display(sid): @@ -111,6 +113,21 @@ def sid_display(sid):
111 return sid 113 return sid
112 114
113 115
  116 +def show_header(ole):
  117 + print("OLE HEADER:")
  118 + t = tablestream.TableStream([20, 20, 79-(4+20+20)], header_row=['Attribute', 'Value', 'Description'])
  119 + t.write_row(['OLE Signature (hex)', binascii.b2a_hex(ole.header_signature).upper(), 'Should be D0CF11E0A1B11AE1'])
  120 + t.write_row(['Header CLSID (hex)', binascii.b2a_hex(ole.header_clsid).upper(), 'Should be 0'])
  121 + t.write_row(['Minor Version', '%04X' % ole.minor_version, 'Should be 003E'])
  122 + t.write_row(['Major Version', '%04X' % ole.dll_version, 'Should be 3 or 4'])
  123 + t.write_row(['Byte Order', '%04X' % ole.byte_order, 'Should be FFFE (little endian)'])
  124 + t.write_row(['Sector Shift', '%04X' % ole.sector_shift, 'Should be 0009 or 000C'])
  125 + t.write_row(['Sector Size (bytes)', '%d' % ole.sector_size, 'Should be 512 or 4096 bytes'])
  126 + t.write_row(['Number of Directory Sectors', ole.num_dir_sectors, 'Should be 0 if major version is 3'])
  127 + t.close()
  128 + print('')
  129 +
  130 +
114 def show_fat(ole): 131 def show_fat(ole):
115 print('FAT:') 132 print('FAT:')
116 t = tablestream.TableStream([8, 12, 8, 8], header_row=['Sector #', 'Type', 'Offset', 'Next #']) 133 t = tablestream.TableStream([8, 12, 8, 8], header_row=['Sector #', 'Type', 'Offset', 'Next #'])
@@ -156,6 +173,12 @@ def main(): @@ -156,6 +173,12 @@ def main():
156 help='if the file is a zip archive, file(s) to be opened within the zip. Wildcards * and ? are supported. (default:*)') 173 help='if the file is a zip archive, file(s) to be opened within the zip. Wildcards * and ? are supported. (default:*)')
157 # parser.add_option('-l', '--loglevel', dest="loglevel", action="store", default=DEFAULT_LOG_LEVEL, 174 # parser.add_option('-l', '--loglevel', dest="loglevel", action="store", default=DEFAULT_LOG_LEVEL,
158 # help="logging level debug/info/warning/error/critical (default=%default)") 175 # help="logging level debug/info/warning/error/critical (default=%default)")
  176 + parser.add_option("--header", action="store_true", dest="header",
  177 + help='Display the OLE header (default: yes)')
  178 + parser.add_option("--fat", action="store_true", dest="fat",
  179 + help='Display the FAT (default: yes)')
  180 + parser.add_option("--minifat", action="store_true", dest="minifat",
  181 + help='Display the MiniFAT (default: yes)')
159 182
160 # TODO: add logfile option 183 # TODO: add logfile option
161 184
@@ -168,6 +191,12 @@ def main(): @@ -168,6 +191,12 @@ def main():
168 parser.print_help() 191 parser.print_help()
169 sys.exit() 192 sys.exit()
170 193
  194 + # if no diplay option is provided, set defaults:
  195 + if not (options.header or options.fat or options.minifat):
  196 + options.header = True
  197 + options.fat = True
  198 + options.minifat = True
  199 +
171 # print banner with version 200 # print banner with version
172 print(BANNER) 201 print(BANNER)
173 202
@@ -187,8 +216,12 @@ def main(): @@ -187,8 +216,12 @@ def main():
187 # normal filename 216 # normal filename
188 ole = olefile.OleFileIO(filename) 217 ole = olefile.OleFileIO(filename)
189 218
190 - show_fat(ole)  
191 - show_minifat(ole) 219 + if options.header:
  220 + show_header(ole)
  221 + if options.fat:
  222 + show_fat(ole)
  223 + if options.minifat:
  224 + show_minifat(ole)
192 225
193 ole.close() 226 ole.close()
194 227