#pragma once #include "binaryninjaapi.h" constexpr const char *VIEW_METADATA_RTTI = "rtti"; constexpr int RTTI_CONFIDENCE = 100; namespace BinaryNinja::RTTI { std::optional DemangleNameMS(BinaryView* view, bool allowMangled, const std::string &mangledName); std::optional DemangleNameItanium(BinaryView* view, bool allowMangled, const std::string &mangledName); std::optional DemangleNameLLVM(bool allowMangled, const std::string &mangledName); struct VirtualFunctionInfo { uint64_t funcAddr; Ref SerializedMetadata(); static VirtualFunctionInfo DeserializedMetadata(const Ref &metadata); }; struct VirtualFunctionTableInfo { uint64_t address; std::vector virtualFunctions; Ref SerializedMetadata(); static VirtualFunctionTableInfo DeserializedMetadata(const Ref &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 baseClassName; std::optional classOffset; std::optional vft; std::optional baseVft; Ref SerializedMetadata(); static ClassInfo DeserializedMetadata(const Ref &metadata); }; class RTTIProcessor { protected: Ref m_view; Ref m_logger; std::map m_classInfo; std::map m_unhandledClassInfo; virtual std::optional ProcessRTTI(uint64_t objectAddr) = 0; virtual std::optional ProcessVFT(uint64_t vftAddr, ClassInfo &classInfo) = 0; public: virtual ~RTTIProcessor() = default; void DeserializedMetadata(RTTIProcessorType type, const Ref &metadata); Ref SerializedMetadata(); virtual void ProcessRTTI() = 0; virtual void ProcessVFT() = 0; }; }