From 4ad488744d87543c31e453dc7b6d8182b3a7f440 Mon Sep 17 00:00:00 2001 From: Dawid Krajcarz <80264606+drobotk@users.noreply.github.com> Date: Thu, 19 Jun 2025 08:06:46 +0200 Subject: [PATCH] fix(Messenger - Remove Meta AI): Improve patch logic (#5153) --- .../messenger/metaai/RemoveMetaAIPatch.java | 22 +++++++++++++------ .../patches/messenger/metaai/Fingerprints.kt | 12 ++++++++++ .../messenger/metaai/RemoveMetaAIPatch.kt | 22 +++++++++++++++++-- .../misc/extension/ExtensionPatch.kt | 2 +- .../patches/messenger/misc/extension/Hooks.kt | 6 +++-- 5 files changed, 52 insertions(+), 12 deletions(-) diff --git a/extensions/messenger/src/main/java/app/revanced/extension/messenger/metaai/RemoveMetaAIPatch.java b/extensions/messenger/src/main/java/app/revanced/extension/messenger/metaai/RemoveMetaAIPatch.java index 92c27eb99..c09fe7edc 100644 --- a/extensions/messenger/src/main/java/app/revanced/extension/messenger/metaai/RemoveMetaAIPatch.java +++ b/extensions/messenger/src/main/java/app/revanced/extension/messenger/metaai/RemoveMetaAIPatch.java @@ -1,15 +1,23 @@ package app.revanced.extension.messenger.metaai; +import java.util.*; + +import app.revanced.extension.shared.Logger; + @SuppressWarnings("unused") public class RemoveMetaAIPatch { + private static final Set loggedIDs = Collections.synchronizedSet(new HashSet<>()); + public static boolean overrideBooleanFlag(long id, boolean value) { - // This catches all flag IDs related to Meta AI. - // The IDs change slightly with every update, - // so to work around this, IDs from different versions were compared - // to find what they have in common, which turned out to be those first bits. - // TODO: Find the specific flags that we care about and patch the code they control instead. - if ((id & 0x7FFFFFC000000000L) == 0x810A8000000000L) { - return false; + try { + if (Long.toString(id).startsWith("REPLACED_BY_PATCH")) { + if (loggedIDs.add(id)) + Logger.printInfo(() -> "Overriding " + id + " from " + value + " to false"); + + return false; + } + } catch (Exception ex) { + Logger.printException(() -> "overrideBooleanFlag failure", ex); } return value; diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt index 3de83f775..b8dd008e4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt @@ -11,3 +11,15 @@ internal val getMobileConfigBoolFingerprint = fingerprint { classDef.interfaces.contains("Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;") } } + +internal val metaAIKillSwitchCheckFingerprint = fingerprint { + strings("SearchAiagentImplementationsKillSwitch") + opcodes(Opcode.CONST_WIDE) +} + +internal val extensionMethodFingerprint = fingerprint { + strings("REPLACED_BY_PATCH") + custom { method, classDef -> + method.name == EXTENSION_METHOD_NAME && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt index 1cc0b6a95..adee83a30 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt @@ -2,11 +2,14 @@ package app.revanced.patches.messenger.metaai import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.messenger.misc.extension.sharedExtensionPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/messenger/metaai/RemoveMetaAIPatch;" +internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/messenger/metaai/RemoveMetaAIPatch;" +internal const val EXTENSION_METHOD_NAME = "overrideBooleanFlag" @Suppress("unused") val removeMetaAIPatch = bytecodePatch( @@ -25,10 +28,25 @@ val removeMetaAIPatch = bytecodePatch( addInstructions( returnIndex, """ - invoke-static { p1, p2, v$returnRegister }, $EXTENSION_CLASS_DESCRIPTOR->overrideBooleanFlag(JZ)Z + invoke-static { p1, p2, v$returnRegister }, $EXTENSION_CLASS_DESCRIPTOR->$EXTENSION_METHOD_NAME(JZ)Z move-result v$returnRegister """ ) } + + // Extract the common starting digits of Meta AI flag IDs from a flag found in code. + val relevantDigits = with(metaAIKillSwitchCheckFingerprint) { + method.getInstruction(patternMatch!!.startIndex).wideLiteral + }.toString().substring(0, 7) + + // Replace placeholder in the extension method. + with(extensionMethodFingerprint) { + method.replaceInstruction( + stringMatches!!.first().index, + """ + const-string v1, "$relevantDigits" + """ + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/ExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/ExtensionPatch.kt index ed502e772..002638f8f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/ExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/ExtensionPatch.kt @@ -2,4 +2,4 @@ package app.revanced.patches.messenger.misc.extension import app.revanced.patches.shared.misc.extension.sharedExtensionPatch -val sharedExtensionPatch = sharedExtensionPatch("messenger", mainActivityOnCreateHook) +val sharedExtensionPatch = sharedExtensionPatch("messenger", messengerApplicationOnCreateHook) diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt index 0700c3209..55bd9aaa0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt @@ -2,6 +2,8 @@ package app.revanced.patches.messenger.misc.extension import app.revanced.patches.shared.misc.extension.extensionHook -internal val mainActivityOnCreateHook = extensionHook { - strings("MainActivity_onCreate_begin") +internal val messengerApplicationOnCreateHook = extensionHook { + custom { method, classDef -> + method.name == "onCreate" && classDef.endsWith("/MessengerApplication;") + } }