diff options
Diffstat (limited to 'miasm2')
| -rw-r--r-- | miasm2/analysis/binary.py | 4 | ||||
| -rw-r--r-- | miasm2/core/bin_stream.py | 38 |
2 files changed, 23 insertions, 19 deletions
diff --git a/miasm2/analysis/binary.py b/miasm2/analysis/binary.py index 90d71369..93bd74b2 100644 --- a/miasm2/analysis/binary.py +++ b/miasm2/analysis/binary.py @@ -68,7 +68,7 @@ class Container(object): """Instantiate a container and parse the binary @stream: stream to use as binary @vm: (optional) VmMngr instance to link with the executable - @addr: (optional) Shift to apply before parsing the binary. If set, + @addr: (optional) Base address of the parsed binary. If set, force the unknown format """ return Container.from_string(stream.read(), *args, **kwargs) @@ -215,7 +215,7 @@ class ContainerUnknown(Container): "Container abstraction for unknown format" def parse(self, data, vm=None, addr=0, **kwargs): - self._bin_stream = bin_stream_str(data, shift=addr) + self._bin_stream = bin_stream_str(data, base_address=addr) if vm is not None: vm.add_memory_page(addr, PAGE_READ, diff --git a/miasm2/core/bin_stream.py b/miasm2/core/bin_stream.py index 1dada90f..af31a52c 100644 --- a/miasm2/core/bin_stream.py +++ b/miasm2/core/bin_stream.py @@ -160,61 +160,65 @@ class bin_stream(object): class bin_stream_str(bin_stream): - def __init__(self, input_str="", offset=0L, shift=0): + def __init__(self, input_str="", offset=0L, base_address=0, shift=None): bin_stream.__init__(self) + if shift is not None: + raise DeprecationWarning("use base_address instead of shift") self.bin = input_str self.offset = offset - self.shift = shift + self.base_address = base_address self.l = len(input_str) def _getbytes(self, start, l=1): - if start + l + self.shift > self.l: + if start + l - self.base_address > self.l: raise IOError("not enough bytes in str") - if start + self.shift < 0: + if start - self.base_address < 0: raise IOError("Negative offset") - return super(bin_stream_str, self)._getbytes(start + self.shift, l) + return super(bin_stream_str, self)._getbytes(start - self.base_address, l) def readbs(self, l=1): - if self.offset + l + self.shift > self.l: + if self.offset + l - self.base_address > self.l: raise IOError("not enough bytes in str") - if self.offset + self.shift < 0: + if self.offset - self.base_address < 0: raise IOError("Negative offset") self.offset += l - return self.bin[self.offset - l + self.shift:self.offset + self.shift] + return self.bin[self.offset - l - self.base_address:self.offset - self.base_address] def __str__(self): - out = self.bin[self.offset + self.shift:] + out = self.bin[self.offset - self.base_address:] return out def setoffset(self, val): self.offset = val def getlen(self): - return self.l - (self.offset + self.shift) + return self.l - (self.offset - self.base_address) class bin_stream_file(bin_stream): - def __init__(self, binary, offset=0L, shift=0): + def __init__(self, binary, offset=0L, base_address=0, shift=None): bin_stream.__init__(self) + if shift is not None: + raise DeprecationWarning("use base_address instead of shift") self.bin = binary self.bin.seek(0, 2) - self.shift = shift + self.base_address = base_address self.l = self.bin.tell() self.offset = offset def getoffset(self): - return self.bin.tell() - self.shift + return self.bin.tell() + self.base_address def setoffset(self, val): - self.bin.seek(val + self.shift) + self.bin.seek(val - self.base_address) offset = property(getoffset, setoffset) def readbs(self, l=1): - if self.offset + l + self.shift > self.l: + if self.offset + l - self.base_address > self.l: raise IOError("not enough bytes in file") - if self.offset + self.shift < 0: + if self.offset - self.base_address < 0: raise IOError("Negative offset") return self.bin.read(l) @@ -222,7 +226,7 @@ class bin_stream_file(bin_stream): return str(self.bin) def getlen(self): - return self.l - (self.offset + self.shift) + return self.l - (self.offset - self.base_address) class bin_stream_container(bin_stream): |