From 4431ddb07ac63b5cd8da5ff4050e335b5ab4d0ba Mon Sep 17 00:00:00 2001 From: Xusheng Date: Thu, 3 Aug 2023 10:49:32 +0800 Subject: Add an API to get structure member including inherited ones. Fix auto structure creation overwrites inherited fields. Close https://github.com/Vector35/binaryninja-api/issues/4540 --- python/types.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'python/types.py') diff --git a/python/types.py b/python/types.py index 94b90527..97f131e1 100644 --- a/python/types.py +++ b/python/types.py @@ -2434,7 +2434,7 @@ class StructureType(Type): try: member = core.BNGetStructureMemberAtOffset(self.struct_handle, offset, None) if member is None: - raise ValueError(f"No member exists a offset {offset}") + raise ValueError(f"No member exists at offset {offset}") return StructureMember( Type.create(core.BNNewTypeReference(member.contents.type), confidence=member.contents.typeConfidence), member.contents.name, member.contents.offset, MemberAccess(member.contents.access), @@ -2541,6 +2541,37 @@ class StructureType(Type): core.BNFreeInheritedStructureMemberList(members, count.value) return result + def member_at_offset_including_inherited(self, view: 'binaryview.BinaryView', offset: int) -> InheritedStructureMember: + """Returns the member (including inherited member at the specified offset""" + member = None + try: + member = core.BNGetMemberIncludingInheritedAtOffset(self.struct_handle, view.handle, offset) + result = None + if member is None: + raise ValueError(f"No member exists at offset {offset}") + + if member[0].base: + const_conf = BoolWithConfidence.get_core_struct(False, 0) + volatile_conf = BoolWithConfidence.get_core_struct(False, 0) + handle = core.BNCreateNamedTypeReference(member[0].base, 0, 1, const_conf, volatile_conf) + base_type = NamedTypeReferenceType(handle, self.platform) + else: + base_type = None + + result = InheritedStructureMember( + base_type, + member[0].baseOffset, + StructureMember( + Type.create(core.BNNewTypeReference(member[0].member.type), confidence=member[0].member.typeConfidence), + member[0].member.name, member[0].member.offset, MemberAccess(member[0].member.access), + MemberScope(member[0].member.scope) + ), + member[0].memberIndex + ) + finally: + core.BNFreeInheritedStructureMember(member) + return result + def with_replaced_structure(self, from_struct, to_struct) -> 'StructureType': return StructureType( core.BNStructureWithReplacedStructure(self.struct_handle, from_struct.handle, to_struct.handle) -- cgit v1.3.1