From 9ff2b8d804a34941a6085af85b6749c20549240e Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Fri, 22 Nov 2024 18:16:32 -0500 Subject: Itanium RTTI scaffolding --- plugins/rtti/microsoft.h | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 plugins/rtti/microsoft.h (limited to 'plugins/rtti/microsoft.h') diff --git a/plugins/rtti/microsoft.h b/plugins/rtti/microsoft.h new file mode 100644 index 00000000..b67431ec --- /dev/null +++ b/plugins/rtti/microsoft.h @@ -0,0 +1,88 @@ +#pragma once + +#include "binaryninjaapi.h" +#include "rtti.h" + +namespace BinaryNinja::RTTI::Microsoft { + struct BaseClassArray + { + uint32_t length; + std::vector descriptors; + + BaseClassArray(BinaryView *view, uint64_t address, uint32_t length); + }; + + struct ClassHierarchyDescriptor + { + uint32_t signature; + uint32_t attributes; + uint32_t numBaseClasses; + int32_t pBaseClassArray; + + ClassHierarchyDescriptor(BinaryView *view, uint64_t address); + }; + + struct BaseClassDescriptor + { + int32_t pTypeDescriptor; + uint32_t numContainedBases; + int32_t where_mdisp; + int32_t where_pdisp; + int32_t where_vdisp; + uint32_t attributes; + int32_t pClassHierarchyDescriptor; + + BaseClassDescriptor(BinaryView *view, uint64_t address); + }; + + struct TypeDescriptor + { + uint64_t pVFTable; + uint64_t spare; + std::string name; + + TypeDescriptor(BinaryView *view, uint64_t address); + }; + + struct CompleteObjectLocator + { + uint32_t signature; + uint32_t offset; + uint32_t cdOffset; + int32_t pTypeDescriptor; + int32_t pClassHierarchyDescriptor; + // Only on 64 bit + int32_t pSelf; + + CompleteObjectLocator(BinaryView *view, uint64_t address); + }; + + class MicrosoftRTTIProcessor + { + Ref m_view; + Ref m_logger; + bool allowMangledClassNames; + bool allowAnonymousClassNames; + bool checkWritableRData; + bool virtualFunctionTableSweep; + + std::map m_classInfo; + + std::set m_visitedClassHierarchyDescAddrs; + + void DeserializedMetadata(const Ref &metadata); + + std::optional ProcessRTTI(uint64_t coLocatorAddr); + + std::optional ProcessVFT(uint64_t vftAddr, const ClassInfo &classInfo); + + public: + MicrosoftRTTIProcessor(const Ref &view, bool useMangled = true, bool checkRData = true, bool vftSweep = true, bool allowAnonymous = true); + + Ref SerializedMetadata(); + + void ProcessRTTI(); + + void ProcessVFT(); + }; +} \ No newline at end of file -- cgit v1.3.1