Source code for plaso.parsers.olecf

"""Parser for OLE Compound Files (OLECF)."""

import pyolecf

from plaso.lib import specification
from plaso.parsers import interface
from plaso.parsers import logger
from plaso.parsers import manager


[docs] class OLECFParser(interface.FileObjectParser): """Parses OLE Compound Files (OLECF).""" # pylint: disable=no-member NAME = 'olecf' DATA_FORMAT = 'OLE Compound File (OLECF) format' _INITIAL_FILE_OFFSET = None _plugin_classes = {}
[docs] @classmethod def GetFormatSpecification(cls): """Retrieves the format specification. Returns: FormatSpecification: format specification. """ format_specification = specification.FormatSpecification(cls.NAME) # OLECF format_specification.AddNewSignature( b'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1', offset=0) # OLECF beta format_specification.AddNewSignature( b'\x0e\x11\xfc\x0d\xd0\xcf\x11\x0e', offset=0) return format_specification
[docs] def ParseFileObject(self, parser_mediator, file_object): """Parses an OLE Compound File (OLECF) file-like object. Args: parser_mediator (ParserMediator): mediates interactions between parsers and other components, such as storage and dfVFS. file_object (dfvfs.FileIO): file-like object. """ code_page = parser_mediator.GetCodePage() olecf_file = pyolecf.file() olecf_file.set_ascii_codepage(code_page) try: olecf_file.open_file_object(file_object) except (OSError, TypeError) as exception: parser_mediator.ProduceExtractionWarning( f'unable to open file with error: {exception!s}') return root_item = olecf_file.root_item if not root_item: return display_name = parser_mediator.GetDisplayName() # Get a list of all items in the root item from the OLECF file. item_names = [item.name for item in root_item.sub_items] # Compare the list of available plugin objects. # We will try to use every plugin against the file (except # the default plugin) and run it. Only if none of the plugins # works will we use the default plugin. item_names = frozenset(item_names) try: for plugin_name, plugin in self._plugins_per_name.items(): if parser_mediator.abort: break profiling_name = '/'.join([self.NAME, plugin.NAME]) parser_mediator.SampleFormatCheckStartTiming(profiling_name) try: result = plugin.REQUIRED_ITEMS.issubset(item_names) finally: parser_mediator.SampleFormatCheckStopTiming(profiling_name) if not result: logger.debug( f'Skipped parsing file: {display_name:s} with plugin: ' f'{plugin_name:s}') continue logger.debug( f'Parsing file: {display_name:s} with plugin: {plugin_name:s}') parser_mediator.SampleStartTiming(profiling_name) try: plugin.UpdateChainAndProcess(parser_mediator, root_item=root_item) except Exception as exception: # pylint: disable=broad-except parser_mediator.ProduceExtractionWarning( f'plugin: {plugin_name:s} unable to parse OLECF file with error: ' f'{exception!s}') finally: parser_mediator.SampleStopTiming(profiling_name) if self._default_plugin and not parser_mediator.abort: profiling_name = '/'.join([self.NAME, self._default_plugin.NAME]) parser_mediator.SampleStartTiming(profiling_name) try: self._default_plugin.UpdateChainAndProcess( parser_mediator, root_item=root_item) except Exception as exception: # pylint: disable=broad-except parser_mediator.ProduceExtractionWarning( f'plugin: {self._default_plugin_name:s} unable to parse OLECF ' f'file with error: {exception!s}') finally: parser_mediator.SampleStopTiming(profiling_name) finally: olecf_file.close()
manager.ParsersManager.RegisterParser(OLECFParser)