From 25cc02431b61097b2adfc2fbc493b648b0300c3b Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Mon, 10 Mar 2025 11:05:40 -0400 Subject: [SharedCache] Refactor Shared Cache In absence of a better name, this commit refactors the shared cache code. --- view/sharedcache/core/ObjC.h | 65 ++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 23 deletions(-) (limited to 'view/sharedcache/core/ObjC.h') diff --git a/view/sharedcache/core/ObjC.h b/view/sharedcache/core/ObjC.h index 13790364..6576564b 100644 --- a/view/sharedcache/core/ObjC.h +++ b/view/sharedcache/core/ObjC.h @@ -1,52 +1,71 @@ -// -// Created by kat on 5/23/23. -// - -#ifndef SHAREDCACHE_OBJC_H -#define SHAREDCACHE_OBJC_H +#pragma once #include #include #include "SharedCache.h" +struct ObjCOptimizationHeader +{ + uint32_t version; + uint32_t flags; + uint64_t headerInfoROCacheOffset; + uint64_t headerInfoRWCacheOffset; + uint64_t selectorHashTableCacheOffset; + uint64_t classHashTableCacheOffset; + uint64_t protocolHashTableCacheOffset; + uint64_t relativeMethodSelectorBaseAddressOffset; +}; + namespace DSCObjC { - class DSCObjCReader : public ObjCReader { - private: - VMReader m_reader; - size_t m_addressSize; + class SharedCacheObjCReader : public BinaryNinja::ObjCReader + { + VirtualMemoryReader m_reader; public: void Read(void* dest, size_t len) override; - std::string ReadCString() override; + + std::string ReadCString(size_t maxLength = -1) override; + uint8_t Read8() override; + uint16_t Read16() override; + uint32_t Read32() override; + uint64_t Read64() override; + int8_t ReadS8() override; + int16_t ReadS16() override; + int32_t ReadS32() override; + int64_t ReadS64() override; + uint64_t ReadPointer() override; + uint64_t GetOffset() const override; + void Seek(uint64_t offset) override; + void SeekRelative(int64_t offset) override; - VMReader& GetVMReader(); + VirtualMemoryReader& GetVMReader(); - DSCObjCReader(SharedCacheCore::SharedCache* cache, size_t addressSize); + SharedCacheObjCReader(VirtualMemoryReader reader); }; - class DSCObjCProcessor : public ObjCProcessor { + class SharedCacheObjCProcessor : public BinaryNinja::ObjCProcessor + { std::optional m_customRelativeMethodSelectorBase = std::nullopt; - SharedCacheCore::SharedCache* m_cache; - std::shared_ptr GetReader() override; - void GetRelativeMethod(ObjCReader* reader, method_t& meth) override; - + std::shared_ptr GetReader() override; + + void GetRelativeMethod(BinaryNinja::ObjCReader* reader, BinaryNinja::method_t& meth) override; + public: - DSCObjCProcessor(BinaryView* data, SharedCacheCore::SharedCache* cache, bool isBackedByDatabase); - - uint64_t GetObjCRelativeMethodBaseAddress(ObjCReader* reader) override; + SharedCacheObjCProcessor(BinaryNinja::BinaryView* data, bool isBackedByDatabase); + + uint64_t GetObjCRelativeMethodBaseAddress(BinaryNinja::ObjCReader* reader) override; }; -} -#endif //SHAREDCACHE_OBJC_H +} // namespace DSCObjC -- cgit v1.3.1