From c071ce221784269a10c8b4ccc7be4005085c46c3 Mon Sep 17 00:00:00 2001 From: Marvin D <41352111+IcePixelx@users.noreply.github.com> Date: Tue, 20 Dec 2022 23:38:45 +0100 Subject: [PATCH] Prevent constant ModuleSections_t allocation. --- r5dev/public/utility/module.cpp | 20 ++++++++++++-------- r5dev/public/utility/module.h | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/r5dev/public/utility/module.cpp b/r5dev/public/utility/module.cpp index 44f80df3..14f11a6d 100644 --- a/r5dev/public/utility/module.cpp +++ b/r5dev/public/utility/module.cpp @@ -42,15 +42,15 @@ CModule::CModule(const string& svModuleName) : m_svModuleName(svModuleName) // *szMask - // Output : CMemory //----------------------------------------------------------------------------- -CMemory CModule::FindPatternSIMD(const uint8_t* szPattern, const char* szMask, const ModuleSections_t& moduleSection, const uint32_t nOccurrence) const +CMemory CModule::FindPatternSIMD(const uint8_t* szPattern, const char* szMask, const ModuleSections_t* moduleSection, const uint32_t nOccurrence) const { if (!m_ExecutableCode.IsSectionValid()) return CMemory(); - const bool bSectionValid = moduleSection.IsSectionValid(); + const bool bSectionValid = moduleSection ? moduleSection->IsSectionValid() : false; - const uintptr_t nBase = bSectionValid ? moduleSection.m_pSectionBase : m_ExecutableCode.m_pSectionBase; - const uintptr_t nSize = bSectionValid ? moduleSection.m_nSectionSize : m_ExecutableCode.m_nSectionSize; + const uintptr_t nBase = bSectionValid ? moduleSection->m_pSectionBase : m_ExecutableCode.m_pSectionBase; + const uintptr_t nSize = bSectionValid ? moduleSection->m_nSectionSize : m_ExecutableCode.m_nSectionSize; const size_t nMaskLen = strlen(szMask); const uint8_t* pData = reinterpret_cast(nBase); @@ -120,7 +120,7 @@ CMemory CModule::FindPatternSIMD(const uint8_t* szPattern, const char* szMask, c // &moduleSection // Output : CMemory //----------------------------------------------------------------------------- -CMemory CModule::FindPatternSIMD(const string& svPattern, const ModuleSections_t& moduleSection) const +CMemory CModule::FindPatternSIMD(const string& svPattern, const ModuleSections_t* moduleSection) const { uint64_t nRVA; if (g_SigCache.FindEntry(svPattern, nRVA)) @@ -261,8 +261,10 @@ CMemory CModule::GetVirtualMethodTable(const string& svTableName, const uint32_t return CMemory(nRVA + GetModuleBase()); } + ModuleSections_t moduleSection = { ".data", m_RunTimeData.m_pSectionBase, m_RunTimeData.m_nSectionSize }; + const auto tableNameInfo = StringToMaskedBytes(svTableName, false); - CMemory rttiTypeDescriptor = FindPatternSIMD(tableNameInfo.first.data(), tableNameInfo.second.c_str(), { ".data", m_RunTimeData.m_pSectionBase, m_RunTimeData.m_nSectionSize }).OffsetSelf(-0x10); + CMemory rttiTypeDescriptor = FindPatternSIMD(tableNameInfo.first.data(), tableNameInfo.second.c_str(), &moduleSection).OffsetSelf(-0x10); if (!rttiTypeDescriptor) return CMemory(); @@ -272,7 +274,8 @@ CMemory CModule::GetVirtualMethodTable(const string& svTableName, const uint32_t const uintptr_t rttiTDRva = rttiTypeDescriptor.GetPtr() - m_pModuleBase; // The RTTI gets referenced by a 4-Byte RVA address. We need to scan for that address. while (scanStart < scanEnd) { - CMemory reference = FindPatternSIMD(reinterpret_cast(&rttiTDRva), "xxxx", { ".rdata", scanStart, m_ReadOnlyData.m_nSectionSize }, nRefIndex); + moduleSection = { ".rdata", scanStart, m_ReadOnlyData.m_nSectionSize }; + CMemory reference = FindPatternSIMD(reinterpret_cast(&rttiTDRva), "xxxx", &moduleSection, nRefIndex); if (!reference) break; @@ -283,7 +286,8 @@ CMemory CModule::GetVirtualMethodTable(const string& svTableName, const uint32_t continue; } - CMemory vfTable = FindPatternSIMD(reinterpret_cast(&referenceOffset), "xxxxxxxx", { ".rdata", m_ReadOnlyData.m_pSectionBase, m_ReadOnlyData.m_nSectionSize }).OffsetSelf(0x8); + moduleSection = { ".rdata", m_ReadOnlyData.m_pSectionBase, m_ReadOnlyData.m_nSectionSize }; + CMemory vfTable = FindPatternSIMD(reinterpret_cast(&referenceOffset), "xxxxxxxx", &moduleSection).OffsetSelf(0x8); g_SigCache.AddEntry(svPackedTableName, GetRVA(vfTable.GetPtr())); return vfTable; diff --git a/r5dev/public/utility/module.h b/r5dev/public/utility/module.h index 710917f2..dc653818 100644 --- a/r5dev/public/utility/module.h +++ b/r5dev/public/utility/module.h @@ -23,7 +23,7 @@ public: CModule(void) = default; CModule(const string& moduleName); #ifndef PLUGINSDK - CMemory FindPatternSIMD(const string& svPattern, const ModuleSections_t& moduleSection = {}) const; + CMemory FindPatternSIMD(const string& svPattern, const ModuleSections_t* moduleSection = nullptr) const; CMemory FindString(const string& string, const ptrdiff_t occurrence = 1, bool nullTerminator = false) const; CMemory FindStringReadOnly(const string& svString, bool nullTerminator) const; @@ -42,7 +42,7 @@ 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; + CMemory FindPatternSIMD(const uint8_t* szPattern, const char* szMask, const ModuleSections_t* moduleSection = nullptr, const uint32_t nOccurrence = 0) const; string m_svModuleName; uintptr_t m_pModuleBase{};