From 0bad362009c60a18364a0b153004b6c00aa34653 Mon Sep 17 00:00:00 2001 From: kat Date: Thu, 11 Jul 2024 13:48:50 -0400 Subject: Fix a database upgrade issue regarding mac-aarch64 dbs that are now loaded as ios-aarch64 (skip-ci) --- platform/mac/platform_mac.cpp | 60 +++++++++++++++++++++++++++++++++++-------- view/macho/machoview.cpp | 4 +-- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/platform/mac/platform_mac.cpp b/platform/mac/platform_mac.cpp index 6a539f66..c922dd18 100644 --- a/platform/mac/platform_mac.cpp +++ b/platform/mac/platform_mac.cpp @@ -108,10 +108,19 @@ public: static Ref Recognize(BinaryView* view, Metadata* metadata) { + bool shouldRecognizeOnIOS = false; + if (view->GetFile()->IsBackedByDatabase()) + { + if (auto database = view->GetFile()->GetDatabase()) + { + if (database->HasGlobal("original_version") && database->ReadGlobal("original_version").asInt64() < 6) + shouldRecognizeOnIOS = true; + } + } auto machoPlatform = metadata->Get("machoplatform"); if (!machoPlatform || !machoPlatform->IsUnsignedInteger()) return nullptr; - if (machoPlatform->GetUnsignedInteger() != 2) + if (machoPlatform->GetUnsignedInteger() != 2 || shouldRecognizeOnIOS) return g_macArmv7; return nullptr; @@ -143,10 +152,19 @@ public: static Ref Recognize(BinaryView* view, Metadata* metadata) { + bool shouldRecognizeOnIOS = false; + if (view->GetFile()->IsBackedByDatabase()) + { + if (auto database = view->GetFile()->GetDatabase()) + { + if (database->HasGlobal("original_version") && database->ReadGlobal("original_version").asInt64() < 6) + shouldRecognizeOnIOS = true; + } + } auto machoPlatform = metadata->Get("machoplatform"); if (!machoPlatform || !machoPlatform->IsUnsignedInteger()) return nullptr; - if (machoPlatform->GetUnsignedInteger() != 2) + if (machoPlatform->GetUnsignedInteger() != 2 || shouldRecognizeOnIOS) return g_macArm64; return nullptr; @@ -179,12 +197,23 @@ public: static Ref Recognize(BinaryView* view, Metadata* metadata) { auto machoPlatform = metadata->Get("machoplatform"); + if (machoPlatform->GetUnsignedInteger() != 2) + return nullptr; if (!machoPlatform || !machoPlatform->IsUnsignedInteger()) return nullptr; - if (machoPlatform->GetUnsignedInteger() == 2) - return g_iosArmv7; - - return nullptr; + if (view->GetFile()->IsBackedByDatabase()) + { + if (auto database = view->GetFile()->GetDatabase()) + { + if (database->HasGlobal("original_version") && database->ReadGlobal("original_version").asInt64() < 6) + { + LogError("%s", "iOS database was saved with mac platform. Unable to upgrade. For iOS typelibs to" + " function properly, this binary must be reopened."); + return nullptr; + } + } + } + return g_iosArmv7; } }; @@ -215,10 +244,21 @@ public: auto machoPlatform = metadata->Get("machoplatform"); if (!machoPlatform || !machoPlatform->IsUnsignedInteger()) return nullptr; - if (machoPlatform->GetUnsignedInteger() == 2) - return g_iosArm64; - - return nullptr; + if (machoPlatform->GetUnsignedInteger() != 2) + return nullptr; + if (view->GetFile()->IsBackedByDatabase()) + { + if (auto database = view->GetFile()->GetDatabase()) + { + if (database->HasGlobal("original_version") && database->ReadGlobal("original_version").asInt64() < 6) + { + LogError("%s", "iOS database was saved with mac platform. Unable to upgrade. For iOS typelibs to" + " function properly, this binary must be reopened."); + return nullptr; + } + } + } + return g_iosArm64; } }; diff --git a/view/macho/machoview.cpp b/view/macho/machoview.cpp index 69cf394a..2180bb96 100644 --- a/view/macho/machoview.cpp +++ b/view/macho/machoview.cpp @@ -1838,8 +1838,6 @@ bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_ BinaryReader virtualReader(this); virtualReader.SetEndianness(m_endian); - Ref platform = m_plat ? m_plat : g_machoViewType->GetPlatform(0, m_arch); - bool parseObjCStructs = true; bool parseCFStrings = true; if (settings && settings->Contains("loader.macho.processObjectiveC")) @@ -2025,7 +2023,7 @@ bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_ { m_logger->LogDebug("Parsing function starts\n"); if (header.functionStartsPresent) - ParseFunctionStarts(platform, header.textBase, header.functionStarts); + ParseFunctionStarts(GetDefaultPlatform(), header.textBase, header.functionStarts); } BeginBulkModifySymbols(); -- cgit v1.3.1