summaryrefslogtreecommitdiff
path: root/plugins/rtti/rtti.h
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2024-12-04 18:17:10 -0500
committerMason Reed <mason@vector35.com>2025-03-19 21:17:34 -0400
commit93e92844d77b72f07bd7563211d60dc3595cc2e0 (patch)
tree5339586f4e2ebbbfa1c754fd175bc9264b6cb668 /plugins/rtti/rtti.h
parent845dcf25563ed4982ea3f8fbca9aa6893bba7b16 (diff)
Consolidate metadata for RTTI processors and a bunch of misc fixes
Also allows for both processors to be ran for a single binary
Diffstat (limited to 'plugins/rtti/rtti.h')
-rw-r--r--plugins/rtti/rtti.h33
1 files changed, 32 insertions, 1 deletions
diff --git a/plugins/rtti/rtti.h b/plugins/rtti/rtti.h
index 9740b68f..474253ec 100644
--- a/plugins/rtti/rtti.h
+++ b/plugins/rtti/rtti.h
@@ -31,9 +31,16 @@ namespace BinaryNinja::RTTI {
static VirtualFunctionTableInfo DeserializedMetadata(const Ref<Metadata> &metadata);
};
+ enum class RTTIProcessorType
+ {
+ Microsoft = 0,
+ Itanium = 1,
+ };
+
// TODO: This needs to have some flags. Virtual, pure iirc.
struct ClassInfo
{
+ RTTIProcessorType processor;
std::string className;
std::optional<std::string> baseClassName;
std::optional<uint64_t> classOffset;
@@ -44,4 +51,28 @@ namespace BinaryNinja::RTTI {
static ClassInfo DeserializedMetadata(const Ref<Metadata> &metadata);
};
-} \ No newline at end of file
+
+ class RTTIProcessor
+ {
+ protected:
+ Ref<BinaryView> m_view;
+ Ref<Logger> m_logger;
+
+ std::map<uint64_t, ClassInfo> m_classInfo;
+ std::map<uint64_t, ClassInfo> m_unhandledClassInfo;
+
+ virtual std::optional<ClassInfo> ProcessRTTI(uint64_t objectAddr) = 0;
+
+ virtual std::optional<VirtualFunctionTableInfo> ProcessVFT(uint64_t vftAddr, ClassInfo &classInfo) = 0;
+ public:
+ virtual ~RTTIProcessor() = default;
+
+ void DeserializedMetadata(RTTIProcessorType type, const Ref<Metadata> &metadata);
+
+ Ref<Metadata> SerializedMetadata();
+
+ virtual void ProcessRTTI() = 0;
+
+ virtual void ProcessVFT() = 0;
+ };
+}