summaryrefslogtreecommitdiff
path: root/plugins/rtti/microsoft.h
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2024-11-22 18:16:32 -0500
committerMason Reed <mason@vector35.com>2025-03-19 21:17:34 -0400
commit9ff2b8d804a34941a6085af85b6749c20549240e (patch)
tree9b78b478476cfb66fc68828087ad9ff99cdfacb5 /plugins/rtti/microsoft.h
parent7d66d87a4600c8954c585c3c690546fc56903d44 (diff)
Itanium RTTI scaffolding
Diffstat (limited to 'plugins/rtti/microsoft.h')
-rw-r--r--plugins/rtti/microsoft.h88
1 files changed, 88 insertions, 0 deletions
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<uint64_t> 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<BinaryView> m_view;
+ Ref<Logger> m_logger;
+ bool allowMangledClassNames;
+ bool allowAnonymousClassNames;
+ bool checkWritableRData;
+ bool virtualFunctionTableSweep;
+
+ std::map<uint64_t, ClassInfo> m_classInfo;
+
+ std::set<uint64_t> m_visitedClassHierarchyDescAddrs;
+
+ void DeserializedMetadata(const Ref<Metadata> &metadata);
+
+ std::optional<ClassInfo> ProcessRTTI(uint64_t coLocatorAddr);
+
+ std::optional<VirtualFunctionTableInfo> ProcessVFT(uint64_t vftAddr, const ClassInfo &classInfo);
+
+ public:
+ MicrosoftRTTIProcessor(const Ref<BinaryView> &view, bool useMangled = true, bool checkRData = true, bool vftSweep = true, bool allowAnonymous = true);
+
+ Ref<Metadata> SerializedMetadata();
+
+ void ProcessRTTI();
+
+ void ProcessVFT();
+ };
+} \ No newline at end of file