From 69c92e0f3eaf366ea81390b37f73c470f3f11e38 Mon Sep 17 00:00:00 2001 From: Ryan Snyder Date: Tue, 11 Oct 2022 21:42:46 -0400 Subject: api: expose methods needed to construct offset pointers --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 2 ++ python/types.py | 49 +++++++++++++++++++++++++++++++------------------ type.cpp | 14 ++++++++++++++ 4 files changed, 49 insertions(+), 18 deletions(-) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 36b37006..b1b2be65 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -6451,6 +6451,7 @@ namespace BinaryNinja { Ref GetEnumeration() const; Ref GetNamedTypeReference() const; Confidence GetScope() const; + TypeBuilder& SetNamedTypeReference(NamedTypeReference* ntr); TypeBuilder& SetScope(const Confidence& scope); TypeBuilder& SetConst(const Confidence& cnst); TypeBuilder& SetVolatile(const Confidence& vltl); @@ -6466,6 +6467,7 @@ namespace BinaryNinja { uint64_t GetOffset() const; uint32_t GetSystemCallNumber() const; + TypeBuilder& SetOffset(uint64_t offset); TypeBuilder& SetFunctionCanReturn(const Confidence& canReturn); TypeBuilder& SetParameters(const std::vector& params); diff --git a/binaryninjacore.h b/binaryninjacore.h index 2eb698fe..c3209b80 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -5302,8 +5302,10 @@ extern "C" BINARYNINJACOREAPI BNStructure* BNGetTypeBuilderStructure(BNTypeBuilder* type); BINARYNINJACOREAPI BNEnumeration* BNGetTypeBuilderEnumeration(BNTypeBuilder* type); BINARYNINJACOREAPI BNNamedTypeReference* BNGetTypeBuilderNamedTypeReference(BNTypeBuilder* type); + BINARYNINJACOREAPI void BNSetTypeBuilderNamedTypeReference(BNTypeBuilder* type, BNNamedTypeReference* ntr); BINARYNINJACOREAPI uint64_t BNGetTypeBuilderElementCount(BNTypeBuilder* type); BINARYNINJACOREAPI uint64_t BNGetTypeBuilderOffset(BNTypeBuilder* type); + BINARYNINJACOREAPI void BNSetTypeBuilderOffset(BNTypeBuilder* type, uint64_t offset); BINARYNINJACOREAPI void BNSetFunctionTypeBuilderCanReturn(BNTypeBuilder* type, BNBoolWithConfidence* canReturn); BINARYNINJACOREAPI void BNSetFunctionTypeBuilderParameters( BNTypeBuilder* type, BNFunctionParameter* params, size_t paramCount); diff --git a/python/types.py b/python/types.py index 6ca9434c..51f71c90 100644 --- a/python/types.py +++ b/python/types.py @@ -884,6 +884,32 @@ class PointerBuilder(TypeBuilder): def children(self) -> List[TypeBuilder]: return [self.target] + @property + def offset(self) -> int: + return core.BNGetTypeBuilderOffset(self._handle) + + @offset.setter + def offset(self, offset: int) -> int: + return core.BNSetTypeBuilderOffset(self._handle, offset) + + @property + def origin(self) -> Optional[Tuple['QualifiedName', int]]: + ntr_handle = core.BNGetTypeBuilderNamedTypeReference(self._handle) + if ntr_handle is None: + return None + name = core.BNGetTypeReferenceName(ntr_handle) + core.BNFreeNamedTypeReference(ntr_handle) + if name is None: + return None + qn = QualifiedName._from_core_struct(name) + core.BNFreeQualifiedName(name) + return (qn, self.offset) + + @origin.setter + def origin(self, origin: 'NamedTypeReferenceType'): + core.BNSetTypeBuilderNamedTypeReference(self._handle, origin.ntr_handle) + + class ArrayBuilder(TypeBuilder): @classmethod def create( @@ -2460,26 +2486,13 @@ class PointerType(Type): ntr_handle = core.BNGetTypeNamedTypeReference(self._handle) if ntr_handle is None: return None - name = core.BNGetTypeReferenceName(ntr_handle) - type_name = QualifiedName._from_core_struct(name) + core.BNFreeNamedTypeReference(ntr_handle) + if name is None: + return None + qn = QualifiedName._from_core_struct(name) core.BNFreeQualifiedName(name) - - type_id = core.BNGetTypeReferenceId(ntr_handle) - t = None - if bv is not None: - t = bv.get_type_by_id(type_id) - - alignment = 0 - if t is not None: - alignment = t.alignment - width = 0 - if t is not None: - width = t.width - - type_class = core.BNGetTypeReferenceClass(ntr_handle) - - return (NamedTypeReferenceType.create(type_class, type_id, type_name, alignment, width, self.platform, self.confidence, self.const, self.volatile), self.offset) + return (qn, self.offset) @property def target(self) -> Type: diff --git a/type.cpp b/type.cpp index d563ce29..3b00a3c9 100644 --- a/type.cpp +++ b/type.cpp @@ -1409,6 +1409,13 @@ Ref TypeBuilder::GetNamedTypeReference() const } +TypeBuilder& TypeBuilder::SetNamedTypeReference(NamedTypeReference* ntr) +{ + BNSetTypeBuilderNamedTypeReference(m_object, ntr ? ntr->GetObject() : nullptr); + return *this; +} + + uint64_t TypeBuilder::GetElementCount() const { return BNGetTypeBuilderElementCount(m_object); @@ -1421,6 +1428,13 @@ uint64_t TypeBuilder::GetOffset() const } +TypeBuilder& TypeBuilder::SetOffset(uint64_t offset) +{ + BNSetTypeBuilderOffset(m_object, offset); + return *this; +} + + Confidence TypeBuilder::GetStackAdjustment() const { BNOffsetWithConfidence result = BNGetTypeBuilderStackAdjustment(m_object); -- cgit v1.3.1