From cfc2d4197ec17986a09a4940883748fac90c4d94 Mon Sep 17 00:00:00 2001 From: Maschell Date: Wed, 3 Jun 2020 18:22:44 +0200 Subject: [PATCH] Use alloc/free from memorymapping module if possible --- source/PluginManagement.cpp | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/source/PluginManagement.cpp b/source/PluginManagement.cpp index d7df5e5..c7ce403 100644 --- a/source/PluginManagement.cpp +++ b/source/PluginManagement.cpp @@ -12,19 +12,36 @@ bool PluginManagement::doRelocation(const std::vector &relocData, relocation_trampolin_entry_t *tramp_data, uint32_t tramp_length, uint32_t trampolinID) { std::map moduleHandleCache; for (auto const &cur : relocData) { + uint32_t functionAddress = 0; std::string functionName = cur.getName(); - std::string rplName = cur.getImportRPLInformation().getName(); - int32_t isData = cur.getImportRPLInformation().isData(); - OSDynLoad_Module rplHandle = 0; - if (moduleHandleCache.count(rplName) > 0) { - rplHandle = moduleHandleCache[rplName]; - } else { - OSDynLoad_Acquire(rplName.c_str(), &rplHandle); - moduleHandleCache[rplName] = rplHandle; + + if (functionName.compare("MEMAllocFromDefaultHeap") == 0) { + OSDynLoad_Module rplHandle; + OSDynLoad_Acquire("homebrew_memorymapping", &rplHandle); + OSDynLoad_FindExport(rplHandle, 1, "MEMAllocFromMappedMemory", (void **) &functionAddress); + } else if (functionName.compare("MEMAllocFromDefaultHeapEx") == 0) { + OSDynLoad_Module rplHandle; + OSDynLoad_Acquire("homebrew_memorymapping", &rplHandle); + OSDynLoad_FindExport(rplHandle, 1, "MEMAllocFromMappedMemoryEx", (void **) &functionAddress); + } else if (functionName.compare("MEMFreeToDefaultHeap") == 0) { + OSDynLoad_Module rplHandle; + OSDynLoad_Acquire("homebrew_memorymapping", &rplHandle); + OSDynLoad_FindExport(rplHandle, 1, "MEMFreeToMappedMemory", (void **) &functionAddress); + } + + if (functionAddress == 0) { + std::string rplName = cur.getImportRPLInformation().getName(); + int32_t isData = cur.getImportRPLInformation().isData(); + OSDynLoad_Module rplHandle = 0; + if (moduleHandleCache.count(rplName) > 0) { + rplHandle = moduleHandleCache[rplName]; + } else { + OSDynLoad_Acquire(rplName.c_str(), &rplHandle); + moduleHandleCache[rplName] = rplHandle; + } + OSDynLoad_FindExport(rplHandle, isData, functionName.c_str(), (void **) &functionAddress); } - uint32_t functionAddress = 0; - OSDynLoad_FindExport(rplHandle, isData, functionName.c_str(), (void **) &functionAddress); if (functionAddress == 0) { DEBUG_FUNCTION_LINE("Failed to find export for %s", functionName.c_str()); return false;