Commit 84e83d0f by devttys0

Added --cast option

parent 5c4291ec
...@@ -12,6 +12,7 @@ class Magic(object): ...@@ -12,6 +12,7 @@ class Magic(object):
binwalk.core.C.Function(name="magic_buffer", type=str), binwalk.core.C.Function(name="magic_buffer", type=str),
] ]
MAGIC_CONTINUE = 0x000020
MAGIC_NO_CHECK_TEXT = 0x020000 MAGIC_NO_CHECK_TEXT = 0x020000
MAGIC_NO_CHECK_APPTYPE = 0x008000 MAGIC_NO_CHECK_APPTYPE = 0x008000
MAGIC_NO_CHECK_TOKENS = 0x100000 MAGIC_NO_CHECK_TOKENS = 0x100000
...@@ -19,13 +20,15 @@ class Magic(object): ...@@ -19,13 +20,15 @@ class Magic(object):
MAGIC_FLAGS = MAGIC_NO_CHECK_TEXT | MAGIC_NO_CHECK_ENCODING | MAGIC_NO_CHECK_APPTYPE | MAGIC_NO_CHECK_TOKENS MAGIC_FLAGS = MAGIC_NO_CHECK_TEXT | MAGIC_NO_CHECK_ENCODING | MAGIC_NO_CHECK_APPTYPE | MAGIC_NO_CHECK_TOKENS
def __init__(self, magic_file=None): def __init__(self, magic_file=None, flags=0):
if magic_file: if magic_file:
self.magic_file = str2bytes(magic_file) self.magic_file = str2bytes(magic_file)
else:
self.magic_file = None
self.libmagic = binwalk.core.C.Library("magic", self.LIBMAGIC_FUNCTIONS) self.libmagic = binwalk.core.C.Library("magic", self.LIBMAGIC_FUNCTIONS)
self.magic_cookie = self.libmagic.magic_open(self.MAGIC_FLAGS) self.magic_cookie = self.libmagic.magic_open(self.MAGIC_FLAGS | flags)
self.libmagic.magic_load(self.magic_cookie, self.magic_file) self.libmagic.magic_load(self.magic_cookie, self.magic_file)
def buffer(self, data): def buffer(self, data):
......
...@@ -28,6 +28,7 @@ class Settings: ...@@ -28,6 +28,7 @@ class Settings:
EXTRACT_FILE = "extract.conf" EXTRACT_FILE = "extract.conf"
BINWALK_MAGIC_FILE = "binwalk" BINWALK_MAGIC_FILE = "binwalk"
BINARCH_MAGIC_FILE = "binarch" BINARCH_MAGIC_FILE = "binarch"
BINCAST_MAGIC_FILE = "bincast"
def __init__(self): def __init__(self):
''' '''
...@@ -47,12 +48,14 @@ class Settings: ...@@ -47,12 +48,14 @@ class Settings:
# Build the paths to all user-specific files # Build the paths to all user-specific files
self.paths['user'][self.BINWALK_MAGIC_FILE] = self._user_path(self.BINWALK_MAGIC_DIR, self.BINWALK_MAGIC_FILE) self.paths['user'][self.BINWALK_MAGIC_FILE] = self._user_path(self.BINWALK_MAGIC_DIR, self.BINWALK_MAGIC_FILE)
self.paths['user'][self.BINARCH_MAGIC_FILE] = self._user_path(self.BINWALK_MAGIC_DIR, self.BINARCH_MAGIC_FILE) self.paths['user'][self.BINARCH_MAGIC_FILE] = self._user_path(self.BINWALK_MAGIC_DIR, self.BINARCH_MAGIC_FILE)
self.paths['user'][self.BINCAST_MAGIC_FILE] = self._user_path(self.BINWALK_MAGIC_DIR, self.BINCAST_MAGIC_FILE)
self.paths['user'][self.EXTRACT_FILE] = self._user_path(self.BINWALK_CONFIG_DIR, self.EXTRACT_FILE) self.paths['user'][self.EXTRACT_FILE] = self._user_path(self.BINWALK_CONFIG_DIR, self.EXTRACT_FILE)
self.paths['user'][self.PLUGINS] = self._user_path(self.BINWALK_PLUGINS_DIR) self.paths['user'][self.PLUGINS] = self._user_path(self.BINWALK_PLUGINS_DIR)
# Build the paths to all system-wide files # Build the paths to all system-wide files
self.paths['system'][self.BINWALK_MAGIC_FILE] = self._system_path(self.BINWALK_MAGIC_DIR, self.BINWALK_MAGIC_FILE) self.paths['system'][self.BINWALK_MAGIC_FILE] = self._system_path(self.BINWALK_MAGIC_DIR, self.BINWALK_MAGIC_FILE)
self.paths['system'][self.BINARCH_MAGIC_FILE] = self._system_path(self.BINWALK_MAGIC_DIR, self.BINARCH_MAGIC_FILE) self.paths['system'][self.BINARCH_MAGIC_FILE] = self._system_path(self.BINWALK_MAGIC_DIR, self.BINARCH_MAGIC_FILE)
self.paths['system'][self.BINCAST_MAGIC_FILE] = self._system_path(self.BINWALK_MAGIC_DIR, self.BINCAST_MAGIC_FILE)
self.paths['system'][self.EXTRACT_FILE] = self._system_path(self.BINWALK_CONFIG_DIR, self.EXTRACT_FILE) self.paths['system'][self.EXTRACT_FILE] = self._system_path(self.BINWALK_CONFIG_DIR, self.EXTRACT_FILE)
self.paths['system'][self.PLUGINS] = self._system_path(self.BINWALK_PLUGINS_DIR) self.paths['system'][self.PLUGINS] = self._system_path(self.BINWALK_PLUGINS_DIR)
......
...@@ -22,6 +22,10 @@ class Signature(Module): ...@@ -22,6 +22,10 @@ class Signature(Module):
long='opcodes', long='opcodes',
kwargs={'enabled' : True, 'search_for_opcodes' : True}, kwargs={'enabled' : True, 'search_for_opcodes' : True},
description='Scan target file(s) for common executable opcodes'), description='Scan target file(s) for common executable opcodes'),
Option(short='C',
long='cast',
kwargs={'enabled' : True, 'cast_data_types' : True},
description='Cast offsets as various data types'),
Option(short='m', Option(short='m',
long='magic', long='magic',
kwargs={'magic_files' : []}, kwargs={'magic_files' : []},
...@@ -38,6 +42,7 @@ class Signature(Module): ...@@ -38,6 +42,7 @@ class Signature(Module):
Kwarg(name='enabled', default=False), Kwarg(name='enabled', default=False),
Kwarg(name='raw_bytes', default=None), Kwarg(name='raw_bytes', default=None),
Kwarg(name='search_for_opcodes', default=False), Kwarg(name='search_for_opcodes', default=False),
Kwarg(name='cast_data_types', default=False),
Kwarg(name='dumb_scan', default=False), Kwarg(name='dumb_scan', default=False),
Kwarg(name='magic_files', default=[]), Kwarg(name='magic_files', default=[]),
] ]
...@@ -45,6 +50,8 @@ class Signature(Module): ...@@ -45,6 +50,8 @@ class Signature(Module):
VERBOSE_FORMAT = "%s %d" VERBOSE_FORMAT = "%s %d"
def init(self): def init(self):
flags = 0
# Create Signature and MagicParser class instances. These are mostly for internal use. # Create Signature and MagicParser class instances. These are mostly for internal use.
self.smart = binwalk.core.smart.Signature(self.config.filter, ignore_smart_signatures=self.dumb_scan) self.smart = binwalk.core.smart.Signature(self.config.filter, ignore_smart_signatures=self.dumb_scan)
self.parser = binwalk.core.parser.MagicParser(self.config.filter, self.smart) self.parser = binwalk.core.parser.MagicParser(self.config.filter, self.smart)
...@@ -54,14 +61,21 @@ class Signature(Module): ...@@ -54,14 +61,21 @@ class Signature(Module):
self.magic_files = [self.parser.file_from_string(self.raw_bytes)] self.magic_files = [self.parser.file_from_string(self.raw_bytes)]
# Use the system default magic file if no other was specified # Use the system default magic file if no other was specified
# Append the user's magic file first so that those signatures take precedence
if not self.magic_files: if not self.magic_files:
if self.search_for_opcodes: if self.search_for_opcodes:
flags |= binwalk.core.magic.Magic.MAGIC_CONTINUE
self.magic_files = [ self.magic_files = [
self.config.settings.paths['user'][self.config.settings.BINARCH_MAGIC_FILE], self.config.settings.paths['user'][self.config.settings.BINARCH_MAGIC_FILE],
self.config.settings.paths['system'][self.config.settings.BINARCH_MAGIC_FILE], self.config.settings.paths['system'][self.config.settings.BINARCH_MAGIC_FILE],
] ]
elif self.cast_data_types:
self.magic_files = [
self.config.settings.paths['user'][self.config.settings.BINCAST_MAGIC_FILE],
self.config.settings.paths['system'][self.config.settings.BINCAST_MAGIC_FILE],
]
else: else:
# Append the user's magic file first so that those signatures take precedence
self.magic_files = [ self.magic_files = [
self.config.settings.paths['user'][self.config.settings.BINWALK_MAGIC_FILE], self.config.settings.paths['user'][self.config.settings.BINWALK_MAGIC_FILE],
self.config.settings.paths['system'][self.config.settings.BINWALK_MAGIC_FILE], self.config.settings.paths['system'][self.config.settings.BINWALK_MAGIC_FILE],
...@@ -69,7 +83,7 @@ class Signature(Module): ...@@ -69,7 +83,7 @@ class Signature(Module):
# Parse the magic file(s) and initialize libmagic # Parse the magic file(s) and initialize libmagic
self.mfile = self.parser.parse(self.magic_files) self.mfile = self.parser.parse(self.magic_files)
self.magic = binwalk.core.magic.Magic(self.mfile) self.magic = binwalk.core.magic.Magic(self.mfile, flags)
# Once the temporary magic files are loaded into libmagic, we don't need them anymore; delete the temp files # Once the temporary magic files are loaded into libmagic, we don't need them anymore; delete the temp files
self.parser.rm_magic_files() self.parser.rm_magic_files()
...@@ -145,3 +159,4 @@ class Signature(Module): ...@@ -145,3 +159,4 @@ class Signature(Module):
self.header() self.header()
self.scan_file(fp) self.scan_file(fp)
self.footer() self.footer()
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