diff options
| author | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-10-14 09:09:29 +0000 |
|---|---|---|
| committer | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-10-14 09:09:29 +0000 |
| commit | 579cf1d03fb932083e6317967d1613d5c2587fb6 (patch) | |
| tree | 629f039935382a2a7391bce9253f6c9968159049 /src/miasm/core/bin_stream_ida.py | |
| parent | 51c15d3ea2e16d4fc5f0f01a3b9befc66b1f982e (diff) | |
| download | focaccia-miasm-ta/nix.tar.gz focaccia-miasm-ta/nix.zip | |
Convert to src-layout ta/nix
Diffstat (limited to 'src/miasm/core/bin_stream_ida.py')
| -rw-r--r-- | src/miasm/core/bin_stream_ida.py | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/miasm/core/bin_stream_ida.py b/src/miasm/core/bin_stream_ida.py new file mode 100644 index 00000000..15bd9d8b --- /dev/null +++ b/src/miasm/core/bin_stream_ida.py @@ -0,0 +1,45 @@ +from builtins import range +from idc import get_wide_byte, get_segm_end +from idautils import Segments +from idaapi import is_mapped + +from miasm.core.utils import int_to_byte +from miasm.core.bin_stream import bin_stream_str + + +class bin_stream_ida(bin_stream_str): + """ + bin_stream implementation for IDA + + Don't generate xrange using address computation: + It can raise error on overflow 7FFFFFFF with 32 bit python + """ + def _getbytes(self, start, l=1): + out = [] + for ad in range(l): + offset = ad + start + self.base_address + if not is_mapped(offset): + raise IOError(f"not enough bytes @ offset {offset:x}") + out.append(int_to_byte(get_wide_byte(offset))) + return b''.join(out) + + def readbs(self, l=1): + if self.offset + l > self.l: + raise IOError("not enough bytes") + content = self.getbytes(self.offset) + self.offset += l + return content + + def __str__(self): + raise NotImplementedError('Not fully functional') + + def setoffset(self, val): + self.offset = val + + def getlen(self): + # Lazy version + if hasattr(self, "_getlen"): + return self._getlen + max_addr = get_segm_end(list(Segments())[-1] - (self.offset - self.base_address)) + self._getlen = max_addr + return max_addr |