diff options
| author | Brian Potchik <brian@vector35.com> | 2025-09-30 15:09:48 -0400 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2025-09-30 15:09:48 -0400 |
| commit | 796932b62e7d007a46d8ad31cdb618e8125073ab (patch) | |
| tree | 35937ae27a646cc6a1d7e79cafd4b46b0991a0b1 /python/transform.py | |
| parent | 36a06931b3eac492eb1e609949e2cc5a3a03bf57 (diff) | |
Initial support for opening container formats.
Diffstat (limited to 'python/transform.py')
| -rw-r--r-- | python/transform.py | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/python/transform.py b/python/transform.py index 54641f91..3ef5c4b6 100644 --- a/python/transform.py +++ b/python/transform.py @@ -26,6 +26,7 @@ import abc import binaryninja from .log import log_error_for_exception from . import databuffer +from . import binaryview from . import _binaryninjacore as core from .enums import TransformType @@ -99,6 +100,8 @@ class Transform(metaclass=_TransformMetaClass): b'173d3b2c2c373923720f242d39' """ transform_type = None + capabilities = 0 + supports_detection = False name = None long_name = None group = None @@ -113,6 +116,7 @@ class Transform(metaclass=_TransformMetaClass): self._cb.freeParameters = self._cb.freeParameters.__class__(self._free_parameters) self._cb.decode = self._cb.decode.__class__(self._decode) self._cb.encode = self._cb.encode.__class__(self._encode) + self._cb.canDecode = self._cb.canDecode.__class__(self._can_decode) self._pending_param_lists = {} self.type = self.__class__.transform_type if not isinstance(self.type, str): @@ -125,6 +129,8 @@ class Transform(metaclass=_TransformMetaClass): else: self.handle = handle self.type = TransformType(core.BNGetTransformType(self.handle)) + self.capabilities = core.BNGetTransformCapabilities(self.handle) + self.supports_detection = core.BNTransformSupportsDetection(self.handle) self.name = core.BNGetTransformName(self.handle) self.long_name = core.BNGetTransformLongName(self.handle) self.group = core.BNGetTransformGroup(self.handle) @@ -165,7 +171,7 @@ class Transform(metaclass=_TransformMetaClass): cls.group = "" xform = cls(None) cls._registered_cb = xform._cb - xform.handle = core.BNRegisterTransformType(cls.transform_type, cls.name, cls.long_name, cls.group, xform._cb) + xform.handle = core.BNRegisterTransformTypeWithCapabilities(cls.transform_type, cls.capabilities, cls.name, cls.long_name, cls.group, xform._cb) def _get_parameters(self, ctxt, count): try: @@ -226,6 +232,14 @@ class Transform(metaclass=_TransformMetaClass): log_error_for_exception("Unhandled Python exception in Transform._encode") return False + def _can_decode(self, ctxt, input): + try: + input_obj = binaryview.BinaryView(handle=core.BNNewViewReference(input)) + return self.can_decode(input_obj) + except: + log_error_for_exception("Unhandled Python exception in Transform._can_decode") + return False + @abc.abstractmethod def perform_decode(self, data, params): if self.type == TransformType.InvertingTransform: @@ -267,3 +281,18 @@ class Transform(metaclass=_TransformMetaClass): if not core.BNEncode(self.handle, input_buf.handle, output_buf.handle, param_buf, len(keys)): return None return bytes(output_buf) + + def can_decode(self, input): + """ + ``can_decode`` checks if this transform can decode the given input. + + :param input: can be a :py:class:`bytes`, :py:class:`bytearray`, :py:class:`DataBuffer`, or :py:class:`BinaryView` + :return: :py:class:`bool` indicating whether the transform can decode the input + :rtype: bool + """ + if isinstance(input, bytes) or isinstance(input, bytearray) or isinstance(input, databuffer.DataBuffer): + with binaryview.BinaryView.new(input) as view: + return core.BNCanDecode(self.handle, view.handle) + elif isinstance(input, binaryview.BinaryView): + return core.BNCanDecode(self.handle, input.handle) + return False |
