Commit e3d190b1 by heffnercj

Basic signature scans now work in python3; other features TBD

parent 6cf71c2d
...@@ -539,8 +539,11 @@ class Binwalk(object): ...@@ -539,8 +539,11 @@ class Binwalk(object):
results = [] results = []
results_offset = -1 results_offset = -1
# In python3 we need a bytes object to pass to magic.buffer
candidate_data = str2bytes(data[i+candidate:i+candidate+fd.MAX_TRAILING_SIZE])
# Pass the data to libmagic, and split out multiple results into a list # Pass the data to libmagic, and split out multiple results into a list
for magic_result in self.parser.split(self.magic.buffer(data[i+candidate:i+candidate+fd.MAX_TRAILING_SIZE])): for magic_result in self.parser.split(self.magic.buffer(candidate_data)):
i_set_results_offset = False i_set_results_offset = False
......
...@@ -158,6 +158,8 @@ class BlockFile(io.FileIO): ...@@ -158,6 +158,8 @@ class BlockFile(io.FileIO):
data = self.read(self.READ_BLOCK_SIZE + self.MAX_TRAILING_SIZE) data = self.read(self.READ_BLOCK_SIZE + self.MAX_TRAILING_SIZE)
if data and data is not None: if data and data is not None:
data = bytes2str(data)
# Get the actual length of the read in data # Get the actual length of the read in data
dlen = len(data) dlen = len(data)
seek_offset = dlen - self.READ_BLOCK_SIZE seek_offset = dlen - self.READ_BLOCK_SIZE
......
...@@ -33,7 +33,7 @@ def str2bytes(string): ...@@ -33,7 +33,7 @@ def str2bytes(string):
For cross compatibility between Python 2 and Python 3 strings. For cross compatibility between Python 2 and Python 3 strings.
''' '''
if isinstance(string, type('')) and sys.version_info.major > 2: if isinstance(string, type('')) and sys.version_info.major > 2:
return bytes(string, 'ascii') return bytes(string, 'latin1')
else: else:
return string return string
...@@ -42,7 +42,7 @@ def bytes2str(bs): ...@@ -42,7 +42,7 @@ def bytes2str(bs):
For cross compatibility between Python 2 and Python 3 strings. For cross compatibility between Python 2 and Python 3 strings.
''' '''
if isinstance(bs, type(b'')) and sys.version_info.major > 2: if isinstance(bs, type(b'')) and sys.version_info.major > 2:
return bs.decode('ascii') return bs.decode('latin1')
else: else:
return bs return bs
......
...@@ -141,6 +141,7 @@ class MagicParser: ...@@ -141,6 +141,7 @@ class MagicParser:
try: try:
for line in io.FileIO(file_name).readlines(): for line in io.FileIO(file_name).readlines():
line = bytes2str(line)
line_count += 1 line_count += 1
# Check if this is the first line of a signature entry # Check if this is the first line of a signature entry
...@@ -164,7 +165,7 @@ class MagicParser: ...@@ -164,7 +165,7 @@ class MagicParser:
# Keep writing lines of the signature to the temporary magic file until # Keep writing lines of the signature to the temporary magic file until
# we detect a signature that should not be included. # we detect a signature that should not be included.
if include: if include:
self.fd.write(line) self.fd.write(str2bytes(line))
self.build_signature_set() self.build_signature_set()
except Exception as e: except Exception as e:
...@@ -191,14 +192,14 @@ class MagicParser: ...@@ -191,14 +192,14 @@ class MagicParser:
# Quick and dirty pre-filter. We are only concerned with the first line of a # Quick and dirty pre-filter. We are only concerned with the first line of a
# signature, which will always start with a number. Make sure the first byte of # signature, which will always start with a number. Make sure the first byte of
# the line is a number; if not, don't process. # the line is a number; if not, don't process.
if bytes2str(line[:1]) < '0' or bytes2str(line[:1]) > '9': if line[:1] < '0' or line[:1] > '9':
return None return None
try: try:
# Split the line into white-space separated parts. # Split the line into white-space separated parts.
# For this to work properly, replace escaped spaces ('\ ') with '\x20'. # For this to work properly, replace escaped spaces ('\ ') with '\x20'.
# This means the same thing, but doesn't confuse split(). # This means the same thing, but doesn't confuse split().
line_parts = bytes2str(line).replace('\\ ', '\\x20').split() line_parts = line.replace('\\ ', '\\x20').split()
entry['offset'] = line_parts[0] entry['offset'] = line_parts[0]
entry['type'] = line_parts[1] entry['type'] = line_parts[1]
# The condition line may contain escaped sequences, so be sure to decode it properly. # The condition line may contain escaped sequences, so be sure to decode it properly.
...@@ -281,7 +282,6 @@ class MagicParser: ...@@ -281,7 +282,6 @@ class MagicParser:
Returns an ordered list of offsets inside of data at which candidate offsets were found. Returns an ordered list of offsets inside of data at which candidate offsets were found.
''' '''
candidate_offsets = [] candidate_offsets = []
data = bytes2str(data)
for regex in self.signature_set: for regex in self.signature_set:
candidate_offsets += [match.start() for match in regex.finditer(data) if match.start() < end] candidate_offsets += [match.start() for match in regex.finditer(data) if match.start() < end]
......
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