From 917829d87f7c7cdc37bcbdcba99a3ff62293858a Mon Sep 17 00:00:00 2001 From: Mike Auty Date: Fri, 24 Nov 2017 22:27:36 +0000 Subject: [PATCH] Reduce the number of times a ResourceAccessor is created, and use all handlers. --- volatility/framework/layers/__init__.py | 11 ++++++++++- volatility/framework/layers/physical.py | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/volatility/framework/layers/__init__.py b/volatility/framework/layers/__init__.py index 8c173d4d2..63d1887af 100644 --- a/volatility/framework/layers/__init__.py +++ b/volatility/framework/layers/__init__.py @@ -10,6 +10,8 @@ import urllib.request import zipfile from urllib import request +from volatility import framework + try: import magic @@ -28,12 +30,19 @@ class ResourceAccessor(object): """Object for openning URLs as files (downloading locally first if necessary)""" def __init__(self, progress_callback = None, context = None): + """Creates a resource accessor + + Note: context is an SSL context, not a volatility context + """ self._progress_callback = progress_callback self._context = context + self._handlers = list(framework.class_subclasses(request.BaseHandler)) + vollog.log(constants.LOGLEVEL_VVV, + "Available URL handlers: {}".format(", ".join([x.__name__ for x in self._handlers]))) def open(self, url, mode = "rb"): """Returns a file-like object for a particular URL opened in mode""" - urllib.request.install_opener(urllib.request.build_opener(JarHandler)) + urllib.request.install_opener(urllib.request.build_opener(*self._handlers)) with contextlib.closing(urllib.request.urlopen(url, context = self._context)) as fp: # Cache the file locally diff --git a/volatility/framework/layers/physical.py b/volatility/framework/layers/physical.py index 8f0db49e2..7daa37678 100644 --- a/volatility/framework/layers/physical.py +++ b/volatility/framework/layers/physical.py @@ -59,6 +59,7 @@ class FileLayer(interfaces.layers.DataLayerInterface): super().__init__(context, config_path, name) self._location = self.config["location"] + self._accessor = layers.ResourceAccessor() self._file_ = None self._size = None # Instantiate the file to throw exceptions if the file doesn't open @@ -75,7 +76,7 @@ class FileLayer(interfaces.layers.DataLayerInterface): # FIXME: Add "+" to the mode once we've determined whether write mode is enabled mode = "rb" if not self._file_: - self._file_ = layers.ResourceAccessor().open(self._location, mode) + self._file_ = self._accessor.open(self._location, mode) return self._file_ @property