summaryrefslogtreecommitdiff
path: root/python/transform.py
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2025-09-30 15:09:48 -0400
committerBrian Potchik <brian@vector35.com>2025-09-30 15:09:48 -0400
commit796932b62e7d007a46d8ad31cdb618e8125073ab (patch)
tree35937ae27a646cc6a1d7e79cafd4b46b0991a0b1 /python/transform.py
parent36a06931b3eac492eb1e609949e2cc5a3a03bf57 (diff)
Initial support for opening container formats.
Diffstat (limited to 'python/transform.py')
-rw-r--r--python/transform.py31
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