From 81fbf9ded76cb5dced029058832fda72e7a01a4c Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Fri, 2 Dec 2022 11:10:53 +0100 Subject: [PATCH] Finish signature cache map implementation in CModule --- r5dev/public/utility/module.cpp | 17 +++++++++++++---- r5dev/public/utility/module.h | 3 ++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/r5dev/public/utility/module.cpp b/r5dev/public/utility/module.cpp index cd757698..de9edafd 100644 --- a/r5dev/public/utility/module.cpp +++ b/r5dev/public/utility/module.cpp @@ -149,6 +149,12 @@ CMemory CModule::FindStringReadOnly(const string& svString, bool bNullTerminator if (!m_ReadOnlyData.IsSectionValid()) return CMemory(); + uint64_t nRVA; + if (g_SigCache.FindEntry(svString, nRVA)) + { + return CMemory(nRVA + GetModuleBase()); + } + const vector vBytes = StringToBytes(svString, bNullTerminator); // Convert our string to a byte array. const pair bytesInfo = std::make_pair(vBytes.size(), vBytes.data()); // Get the size and data of our bytes. @@ -171,7 +177,10 @@ CMemory CModule::FindStringReadOnly(const string& svString, bool bNullTerminator if (bFound) { - return CMemory(&pBase[i]); + CMemory result = CMemory(&pBase[i]); + g_SigCache.AddEntry(svString, GetRVA(result.GetPtr())); + + return result; } } @@ -234,8 +243,8 @@ CMemory CModule::FindString(const string& svString, const ptrdiff_t nOccurrence, } resultAddress = CMemory(pLatestOccurrence); - g_SigCache.AddEntry(svPackedString, GetRVA(resultAddress.GetPtr())); + return resultAddress; } @@ -330,9 +339,9 @@ CMemory CModule::GetVirtualMethodTable(const string& svTableName, const uint32_t } CMemory vfTable = FindPatternSIMD(reinterpret_cast(&referenceOffset), "xxxxxxxx", { ".rdata", m_ReadOnlyData.m_pSectionBase, m_ReadOnlyData.m_nSectionSize }).OffsetSelf(0x8); - g_SigCache.AddEntry(svPackedTableName, GetRVA(vfTable.GetPtr())); - return FindPatternSIMD(reinterpret_cast(&referenceOffset), "xxxxxxxx", { ".rdata", m_ReadOnlyData.m_pSectionBase, m_ReadOnlyData.m_nSectionSize }).OffsetSelf(0x8); + + return vfTable; } return CMemory(); diff --git a/r5dev/public/utility/module.h b/r5dev/public/utility/module.h index e20b208f..d685b62e 100644 --- a/r5dev/public/utility/module.h +++ b/r5dev/public/utility/module.h @@ -22,7 +22,6 @@ public: CModule(void) = default; CModule(const string& moduleName); - CMemory FindPatternSIMD(const uint8_t* szPattern, const char* szMask, const ModuleSections_t& moduleSection = {}, const uint32_t nOccurrence = 0) const; CMemory FindPatternSIMD(const string& svPattern, const ModuleSections_t& moduleSection = {}) const; CMemory FindString(const string& string, const ptrdiff_t occurrence = 1, bool nullTerminator = false) const; CMemory FindStringReadOnly(const string& svString, bool nullTerminator) const; @@ -41,6 +40,8 @@ public: ModuleSections_t m_ReadOnlyData; private: + CMemory FindPatternSIMD(const uint8_t* szPattern, const char* szMask, const ModuleSections_t& moduleSection = {}, const uint32_t nOccurrence = 0) const; + string m_svModuleName; uintptr_t m_pModuleBase{}; DWORD m_nModuleSize{};