diff options
| -rw-r--r-- | binaryninjaapi.h | 10 | ||||
| -rw-r--r-- | binaryninjacore.h | 3 | ||||
| -rw-r--r-- | python/types.py | 33 | ||||
| -rw-r--r-- | type.cpp | 19 |
4 files changed, 64 insertions, 1 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index e14e12b4..62177289 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -8136,6 +8136,16 @@ namespace BinaryNinja { */ std::vector<InheritedStructureMember> GetMembersIncludingInherited(BinaryView* view) const; + /*! Get a structure member (including inherited members) at a certain offset + + \param view The relevant binary view + \param offset Offset to check + \param result Reference to a InheritedStructureMember to copy the result to + \return Whether a member was found + */ + bool GetMemberIncludingInheritedAtOffset(BinaryView* view, int64_t offset, + InheritedStructureMember& result) const; + /*! Get a structure member by name \param name Name of the member to retrieve diff --git a/binaryninjacore.h b/binaryninjacore.h index 4e38b8a9..e6b34506 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -5510,6 +5510,9 @@ extern "C" BINARYNINJACOREAPI BNInheritedStructureMember* BNGetStructureMembersIncludingInherited( BNStructure* s, BNBinaryView* view, size_t* count); BINARYNINJACOREAPI void BNFreeInheritedStructureMemberList(BNInheritedStructureMember* members, size_t count); + BINARYNINJACOREAPI BNInheritedStructureMember* BNGetMemberIncludingInheritedAtOffset(BNStructure* s, + BNBinaryView* view, int64_t offset); + BINARYNINJACOREAPI void BNFreeInheritedStructureMember(BNInheritedStructureMember* members); BINARYNINJACOREAPI uint64_t BNGetStructureWidth(BNStructure* s); BINARYNINJACOREAPI int64_t BNGetStructurePointerOffset(BNStructure* s); BINARYNINJACOREAPI size_t BNGetStructureAlignment(BNStructure* s); 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) @@ -2167,6 +2167,25 @@ vector<InheritedStructureMember> Structure::GetMembersIncludingInherited(BinaryV } +bool Structure::GetMemberIncludingInheritedAtOffset(BinaryView* view, int64_t offset, + InheritedStructureMember& result) const +{ + BNInheritedStructureMember* member = BNGetMemberIncludingInheritedAtOffset(m_object, view->GetObject(), offset); + if (!member) + return false; + + result.base = member->base ? new NamedTypeReference(BNNewNamedTypeReference(member->base)) : nullptr; + result.baseOffset = member->baseOffset; + result.member.type = new Type(BNNewTypeReference(member->member.type)); + result.member.name = member->member.name; + result.member.offset = member->member.offset; + result.memberIndex = member->memberIndex; + + BNFreeInheritedStructureMember(member); + return true; +} + + bool Structure::GetMemberByName(const string& name, StructureMember& result) const { BNStructureMember* member = BNGetStructureMemberByName(m_object, name.c_str()); |
