Commit 5c4291ec by devttys0

Fixed heursitc module bug; fixed fundamental issue with specifying module-level dependencies.

parent 9258050b
...@@ -140,15 +140,17 @@ class Module(object): ...@@ -140,15 +140,17 @@ class Module(object):
# A list of binwalk.core.module.Kwargs accepted by __init__ # A list of binwalk.core.module.Kwargs accepted by __init__
KWARGS = [] KWARGS = []
# A dictionary of module dependencies; all modules depend on the General and Extractor modules. # A list of default dependencies for all modules; do not override this unless you
# Note that if overriding these default DEPENDS for a module, you MUST include these default # understand the consequences of doing so.
# dependencies, with the same attribute values. DEFAULT_DEPENDS = [
DEPENDS = [
Dependency(name='General', Dependency(name='General',
attribute='config'), attribute='config'),
Dependency(name='Extractor', Dependency(name='Extractor',
attribute='extractor'), attribute='extractor'),
] ]
# A list of dependencies that can be filled in as needed by each individual module.
DEPENDS = []
# Format string for printing the header during a scan. # Format string for printing the header during a scan.
# Must be set prior to calling self.header. # Must be set prior to calling self.header.
...@@ -195,12 +197,14 @@ class Module(object): ...@@ -195,12 +197,14 @@ class Module(object):
def __init__(self, **kwargs): def __init__(self, **kwargs):
self.errors = [] self.errors = []
self.results = [] self.results = []
self.target_file_list = [] self.target_file_list = []
self.status = None self.status = None
self.enabled = False self.enabled = False
self.current_target_file_name = None self.current_target_file_name = None
self.name = self.__class__.__name__ self.name = self.__class__.__name__
self.plugins = binwalk.core.plugin.Plugins(self) self.plugins = binwalk.core.plugin.Plugins(self)
self.dependencies = self.DEFAULT_DEPENDS + self.DEPENDS
process_kwargs(self, kwargs) process_kwargs(self, kwargs)
...@@ -357,7 +361,7 @@ class Module(object): ...@@ -357,7 +361,7 @@ class Module(object):
self.validate(r) self.validate(r)
self._plugins_result(r) self._plugins_result(r)
for dependency in self.DEPENDS: for dependency in self.dependencies:
try: try:
getattr(self, dependency.attribute).callback(r) getattr(self, dependency.attribute).callback(r)
except AttributeError: except AttributeError:
...@@ -424,7 +428,7 @@ class Module(object): ...@@ -424,7 +428,7 @@ class Module(object):
self.modules = parent.loaded_modules self.modules = parent.loaded_modules
# Reset all dependency modules # Reset all dependency modules
for dependency in self.DEPENDS: for dependency in self.dependencies:
if hasattr(self, dependency.attribute): if hasattr(self, dependency.attribute):
getattr(self, dependency.attribute).reset() getattr(self, dependency.attribute).reset()
...@@ -628,34 +632,32 @@ class Modules(object): ...@@ -628,34 +632,32 @@ class Modules(object):
import binwalk.modules import binwalk.modules
attributes = {} attributes = {}
if hasattr(module, "DEPENDS"): for dependency in module.DEFAULT_DEPENDS+module.DEPENDS:
for dependency in module.DEPENDS:
# The dependency module must be imported by binwalk.modules.__init__.py # The dependency module must be imported by binwalk.modules.__init__.py
if hasattr(binwalk.modules, dependency.name): if hasattr(binwalk.modules, dependency.name):
dependency.module = getattr(binwalk.modules, dependency.name) dependency.module = getattr(binwalk.modules, dependency.name)
else: else:
raise ModuleException("%s depends on %s which was not found in binwalk.modules.__init__.py\n" % (str(module), dependency.name)) raise ModuleException("%s depends on %s which was not found in binwalk.modules.__init__.py\n" % (str(module), dependency.name))
# No recursive dependencies, thanks # No recursive dependencies, thanks
if dependency.module == module: if dependency.module == module:
continue continue
# Only load dependencies with custom kwargs from modules that are enabled, else madness ensues. # Only load dependencies with custom kwargs from modules that are enabled, else madness ensues.
# Example: Heursitic module depends on entropy module, and sets entropy kwargs to contain 'enabled' : True. # Example: Heursitic module depends on entropy module, and sets entropy kwargs to contain 'enabled' : True.
# Without this check, an entropy scan would always be run, even if -H or -E weren't specified! # Without this check, an entropy scan would always be run, even if -H or -E weren't specified!
# #
# Modules that are not enabled (e.g., extraction module) can load any dependency as long as they don't # Modules that are not enabled (e.g., extraction module) can load any dependency as long as they don't
# set any custom kwargs for those dependencies. # set any custom kwargs for those dependencies.
if module_enabled or not dependency.kwargs: if module_enabled or not dependency.kwargs:
depobj = self.run(dependency.module, dependency=True, kwargs=dependency.kwargs) depobj = self.run(dependency.module, dependency=True, kwargs=dependency.kwargs)
# If a dependency failed, consider this a non-recoverable error and raise an exception # If a dependency failed, consider this a non-recoverable error and raise an exception
if depobj.errors: if depobj.errors:
raise ModuleException("Failed to load " + dependency.name) raise ModuleException("Failed to load " + dependency.name)
else: else:
attributes[dependency.attribute] = depobj attributes[dependency.attribute] = depobj
return attributes return attributes
......
...@@ -13,7 +13,7 @@ class General(Module): ...@@ -13,7 +13,7 @@ class General(Module):
TITLE = "General" TITLE = "General"
ORDER = 0 ORDER = 0
DEPENDS = [] DEFAULT_DEPENDS = []
CLI = [ CLI = [
Option(long='length', Option(long='length',
......
...@@ -88,8 +88,6 @@ class HeuristicCompressionAnalyzer(Module): ...@@ -88,8 +88,6 @@ class HeuristicCompressionAnalyzer(Module):
TITLE = "Heuristic Compression" TITLE = "Heuristic Compression"
DEPENDS = [ DEPENDS = [
Dependency(name='General',
attribute='config'),
Dependency(name='Entropy', Dependency(name='Entropy',
attribute='entropy', attribute='entropy',
kwargs={'enabled' : True, 'do_plot' : False, 'display_results' : False, 'block_size' : ENTROPY_BLOCK_SIZE}), kwargs={'enabled' : True, 'do_plot' : False, 'display_results' : False, 'block_size' : ENTROPY_BLOCK_SIZE}),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment