summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h10
-rw-r--r--binaryninjacore.h3
-rw-r--r--python/types.py33
-rw-r--r--type.cpp19
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)
diff --git a/type.cpp b/type.cpp
index 8affdc37..e6e348e5 100644
--- a/type.cpp
+++ b/type.cpp
@@ -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());