From 7302d29383c0b3a71afe87b06bfb3cf3f85cd506 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sun, 25 Jan 2026 21:39:35 +0100 Subject: [PATCH] made by AI --- .../feed/LimitFeedToFollowedProfiles.kt | 15 ++--- .../instagram/hide/navigation/Fingerprints.kt | 13 ++--- .../hide/navigation/HideNavigationButtons.kt | 18 +++--- .../instagram/hide/stories/Fingerprints.kt | 2 +- .../instagram/hide/stories/HideStories.kt | 8 ++- .../misc/devmenu/EnableDeveloperMenuPatch.kt | 6 +- .../instagram/misc/devmenu/Fingerprints.kt | 15 ++--- .../misc/links/OpenLinksExternallyPatch.kt | 34 +++++------ .../misc/share/EditShareLinksPatch.kt | 11 ++-- .../PermalinkResponseJsonParserFingerprint.kt | 31 +++++----- .../misc/share/domain/Fingerprint.kt | 12 ++-- .../instagram/misc/signature/Fingerprints.kt | 16 +++-- .../misc/signature/SignatureCheckPatch.kt | 2 +- .../patches/messenger/metaai/Fingerprints.kt | 8 +-- .../messenger/metaai/RemoveMetaAIPatch.kt | 23 ++++---- .../youtube/layout/startpage/Fingerprints.kt | 23 +++----- .../youtube/layout/theme/Fingerprints.kt | 16 ++--- .../youtube/layout/theme/ThemePatch.kt | 20 +++---- .../misc/dimensions/spoof/Fingerprints.kt | 15 +++-- .../spoof/SpoofDeviceDimensionsPatch.kt | 3 +- .../gms/AccountCredentialsInvalidTextPatch.kt | 26 ++++----- .../patches/youtube/misc/gms/Fingerprints.kt | 18 +++--- .../DisableHapticFeedbackPatch.kt | 24 ++++---- .../misc/hapticfeedback/Fingerprints.kt | 23 +++++--- .../misc/imageurlhook/CronetImageUrlHook.kt | 6 +- .../youtube/misc/imageurlhook/Fingerprints.kt | 58 +++++++------------ .../youtube/misc/links/Fingerprints.kt | 35 ++++++----- .../video/speed/remember/Fingerprints.kt | 11 ++-- .../youtube/video/videoid/Fingerprints.kt | 42 +++++++------- .../youtube/video/videoid/VideoIdPatch.kt | 24 ++++---- 30 files changed, 256 insertions(+), 302 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt index 7ba3c0c24..d5d4c0508 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt @@ -1,8 +1,9 @@ package app.revanced.patches.instagram.feed -import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstMutableMethodDeclaratively +import app.revanced.patcher.name import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch import app.revanced.util.getReference @@ -33,20 +34,16 @@ val `Limit feed to followed profiles` by creatingBytecodePatch( mainFeedRequestHeaderFieldName = indexOfFirstInstructionOrThrow { getReference().let { ref -> ref?.type == "Ljava/util/Map;" && - ref.definingClass == mainFeedRequestClassMethod.classDef.toString() + ref.definingClass == mainFeedRequestClassMethod.immutableClassDef.toString() } }.let { instructionIndex -> getInstruction(instructionIndex).getReference()!!.name } } - val initMainFeedRequestMethod = fingerprint { - custom { method, classDef -> - method.name == "" && - classDef == mainFeedRequestClassMethod.classDef - } - } - initMainFeedRequestMethod.apply { + mainFeedRequestClassMethod.immutableClassDef.firstMutableMethodDeclaratively { + name("") + }.apply { // Finds the instruction where the map is being initialized in the constructor val getHeaderIndex = indexOfFirstInstructionOrThrow { getReference().let { diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt index e04eb42e6..27c91b4c8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt @@ -1,19 +1,16 @@ package app.revanced.patches.instagram.hide.navigation -import app.revanced.patcher.accessFlags -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.parameterTypes +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val BytecodePatchContext.initializeNavigationButtonsListMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.initializeNavigationButtonsListMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("Lcom/instagram/common/session/UserSession;", "Z") returnType("Ljava/util/List;") } -internal val navigationButtonsEnumClassDef = fingerprint { - strings("FEED", "fragment_feed", "SEARCH", "fragment_search") -} +internal val navigationButtonsEnumClassDefMatch = firstMethodComposite( + "FEED", "fragment_feed", "SEARCH", "fragment_search", +) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt index d2380e65c..587196938 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt @@ -1,6 +1,8 @@ package app.revanced.patches.instagram.hide.navigation import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstMutableMethodDeclaratively +import app.revanced.patcher.name import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch @@ -71,20 +73,14 @@ val `Hide navigation buttons` by creatingBytecodePatch( // Get the field name which contains the name of the enum for the navigation button // ("fragment_clips", "fragment_share", ...) - val navigationButtonsEnumInitFingerprint = fingerprint { - custom { method, classDef -> - method.name == "" && - classDef == navigationButtonsEnumClassDef.classDef - } - } - - val enumNameField: String - with(navigationButtonsEnumInitFingerprint.method) { - enumNameField = indexOfFirstInstructionOrThrow { + val enumNameField = navigationButtonsEnumClassDefMatch.classDef.firstMutableMethodDeclaratively { + name("") + }.let { method -> + method.indexOfFirstInstructionOrThrow { opcode == Opcode.IPUT_OBJECT && (this as TwoRegisterInstruction).registerA == 2 // p2 register. }.let { - getInstruction(it).getReference()!!.name + method.getInstruction(it).getReference()!!.name } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt index 54ed1888d..d5609e89a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.instagram.hide.stories import app.revanced.patcher.* import com.android.tools.smali.dexlib2.Opcode -internal val getOrCreateAvatarViewMethod = firstMethodComposite { +internal val getOrCreateAvatarViewMethodMatch = firstMethodComposite { definingClass("Lcom/instagram/reels/ui/views/reelavatar/RecyclerReelAvatarView;") parameterTypes() returnType("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt index 2af9dd5e4..4ac080030 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt @@ -11,9 +11,11 @@ val `Hide Stories from Home` by creatingBytecodePatch( compatibleWith("com.instagram.android") apply { - val addStoryEndIndex = getOrCreateAvatarViewMethod.indices.last() + getOrCreateAvatarViewMethodMatch.let { + val addStoryEndIndex = it.indices.last() - // Remove addView of Story. - getOrCreateAvatarViewMethod.removeInstruction(addStoryEndIndex) + // Remove addView of Story. + it.method.removeInstruction(addStoryEndIndex) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt index b8ee11359..82b52a6ae 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt @@ -4,6 +4,7 @@ import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.util.Utils.trimIndentMultiline import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.indexOfFirstStringInstruction import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -20,8 +21,9 @@ val `Enable developer menu` by creatingBytecodePatch( compatibleWith("com.instagram.android") apply { - with(clearNotificationReceiverMethod) { - indexOfFirstInstructionReversedOrThrow(clearNotificationReceiverMethod.stringMatches.first().index) { + clearNotificationReceiverMethod.apply { + val stringIndex = indexOfFirstStringInstruction("NOTIFICATION_DISMISSED") + indexOfFirstInstructionReversedOrThrow(stringIndex) { val reference = getReference() opcode in listOf(Opcode.INVOKE_STATIC, Opcode.INVOKE_STATIC_RANGE) && reference?.parameterTypes?.size == 1 && diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt index 7b53e2936..45936b370 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt @@ -1,10 +1,11 @@ - package app.revanced.patches.instagram.misc.devmenu -internal val BytecodePatchContext.clearNotificationReceiverMethod by gettingFirstMethodDeclaratively { - custom { method, classDef -> - method.name == "onReceive" && - classDef.type == "Lcom/instagram/notifications/push/ClearNotificationReceiver;" - } - strings("NOTIFICATION_DISMISSED") +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext + +internal val BytecodePatchContext.clearNotificationReceiverMethod by gettingFirstMutableMethodDeclaratively( + "NOTIFICATION_DISMISSED", +) { + name("onReceive") + definingClass("Lcom/instagram/notifications/push/ClearNotificationReceiver;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt index 3faeb280d..f47b3dad9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt @@ -21,27 +21,25 @@ val `Open links externally` by creatingBytecodePatch( compatibleWith("com.instagram.android") apply { - inAppBrowserFunctionMethodMatch.let { - val stringMatchIndex = it.stringMatches?.first { match -> match.string == TARGET_STRING }!!.index + inAppBrowserFunctionMethodMatch.method.apply { + val stringMatchIndex = inAppBrowserFunctionMethodMatch.indices.first() - it.method.apply { - val urlResultObjIndex = indexOfFirstInstructionOrThrow( - stringMatchIndex, - Opcode.MOVE_OBJECT_FROM16, - ) + val urlResultObjIndex = indexOfFirstInstructionOrThrow( + stringMatchIndex, + Opcode.MOVE_OBJECT_FROM16, + ) - // Register that contains the url after moving from a higher register. - val urlRegister = getInstruction(urlResultObjIndex).registerA + // Register that contains the url after moving from a higher register. + val urlRegister = getInstruction(urlResultObjIndex).registerA - addInstructions( - urlResultObjIndex + 1, - """ - invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->openExternally(Ljava/lang/String;)Z - move-result v$urlRegister - return v$urlRegister - """, - ) - } + addInstructions( + urlResultObjIndex + 1, + """ + invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->openExternally(Ljava/lang/String;)Z + move-result v$urlRegister + return v$urlRegister + """, + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt index dfdea5602..8c71f8e1a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt @@ -3,23 +3,24 @@ package app.revanced.patches.instagram.misc.share import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.indexOfFirstStringInstruction import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.mutable.MutableMethod -context(BytecodePatchContext) +context(_: BytecodePatchContext) internal fun editShareLinksPatch(block: MutableMethod.(index: Int, register: Int) -> Unit) { - val fingerprintsToPatch = arrayOf( + val methodsToPatch = arrayOf( permalinkResponseJsonParserMethod, storyUrlResponseJsonParserMethod, profileUrlResponseJsonParserMethod, liveUrlResponseJsonParserMethod, ) - for (fingerprint in fingerprintsToPatch) { - fingerprint.method.apply { + for (method in methodsToPatch) { + method.apply { val putSharingUrlIndex = indexOfFirstInstruction( - permalinkResponseJsonParserMethod.stringMatches.first().index, + indexOfFirstStringInstruction("permalink"), Opcode.IPUT_OBJECT, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt index c11bbd028..650313c71 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt @@ -1,23 +1,28 @@ package app.revanced.patches.instagram.misc.share -import com.google.common.util.concurrent.Striped.custom +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val BytecodePatchContext.permalinkResponseJsonParserMethod by gettingFirstMethodDeclaratively { - strings("permalink", "PermalinkResponse") - custom { method, _ -> method.name == "parseFromJson" } +internal val BytecodePatchContext.permalinkResponseJsonParserMethod by gettingFirstMutableMethodDeclaratively( + "permalink", "PermalinkResponse", +) { + name("parseFromJson") } -internal val BytecodePatchContext.storyUrlResponseJsonParserMethod by gettingFirstMethodDeclaratively { - strings("story_item_to_share_url", "StoryItemUrlResponse") - custom { method, _ -> method.name == "parseFromJson" } +internal val BytecodePatchContext.storyUrlResponseJsonParserMethod by gettingFirstMutableMethodDeclaratively( + "story_item_to_share_url", "StoryItemUrlResponse", +) { + name("parseFromJson") } -internal val BytecodePatchContext.profileUrlResponseJsonParserMethod by gettingFirstMethodDeclaratively { - strings("profile_to_share_url", "ProfileUrlResponse") - custom { method, _ -> method.name == "parseFromJson" } +internal val BytecodePatchContext.profileUrlResponseJsonParserMethod by gettingFirstMutableMethodDeclaratively( + "profile_to_share_url", "ProfileUrlResponse", +) { + name("parseFromJson") } -internal val BytecodePatchContext.liveUrlResponseJsonParserMethod by gettingFirstMethodDeclaratively { - strings("live_to_share_url", "LiveItemLinkUrlResponse") - custom { method, _ -> method.name == "parseFromJson" } +internal val BytecodePatchContext.liveUrlResponseJsonParserMethod by gettingFirstMutableMethodDeclaratively( + "live_to_share_url", "LiveItemLinkUrlResponse", +) { + name("parseFromJson") } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt index 5bcf40e6a..33ed47d1b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt @@ -1,17 +1,13 @@ package app.revanced.patches.instagram.misc.share.domain -import app.revanced.patcher.accessFlags -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.parameterTypes +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val BytecodePatchContext.getCustomShareDomainMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.getCustomShareDomainMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Ljava/lang/String;") parameterTypes() - custom { method, classDef -> - method.name == "getCustomShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + name("getCustomShareDomain") + definingClass(EXTENSION_CLASS_DESCRIPTOR) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt index 2ca14ce1b..a0350d596 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt @@ -1,22 +1,20 @@ package app.revanced.patches.instagram.misc.signature -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.parameterTypes +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val BytecodePatchContext.isValidSignatureClassMethod by gettingFirstMethodDeclaratively { - strings("The provider for uri '", "' is not trusted: ") -} +internal val isValidSignatureClassMethodMatch = firstMethodComposite( + "The provider for uri '", "' is not trusted: ", +) -internal val BytecodePatchContext.isValidSignatureMethodMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.isValidSignatureMethodMethod by gettingFirstMutableMethodDeclaratively { parameterTypes("L", "Z") returnType("Z") - custom { method, _ -> - method.indexOfFirstInstruction { + custom { + indexOfFirstInstruction { getReference()?.name == "keySet" } >= 0 } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt index 12fe23ea5..4d7641260 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt @@ -13,7 +13,7 @@ val `Disable signature check` by creatingBytecodePatch( apply { isValidSignatureMethodMethod - .match(isValidSignatureClassMethod.classDef) + .match(isValidSignatureClassMethodMatch.classDef) .method .returnEarly(true) } 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 bf0cc14e6..ec43ea258 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 @@ -1,19 +1,19 @@ package app.revanced.patches.messenger.metaai import app.revanced.patcher.* -import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val BytecodePatchContext.getMobileConfigBoolMethod by gettingFirstMutableMethodDeclaratively { +internal val getMobileConfigBoolMethodMatch = firstMethodComposite { returnType("Z") opcodes(Opcode.RETURN) custom { "Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;" in immutableClassDef.interfaces } } -internal val BytecodePatchContext.metaAIKillSwitchCheckMethod by gettingFirstMutableMethodDeclaratively("SearchAiagentImplementationsKillSwitch") { +internal val metaAIKillSwitchCheckMethodMatch = firstMethodComposite("SearchAiagentImplementationsKillSwitch") { opcodes(Opcode.CONST_WIDE) } -internal val BytecodePatchContext.extensionMethodMethod by gettingFirstMutableMethodDeclaratively("REPLACED_BY_PATCH") { + +internal val extensionMethodMethodMatch = firstMethodComposite("REPLACED_BY_PATCH") { name(EXTENSION_METHOD_NAME) definingClass(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 08cc68de1..ac17c44e6 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 @@ -3,7 +3,6 @@ package app.revanced.patches.messenger.metaai import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.extensions.replaceInstruction -import app.revanced.patcher.method import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.messenger.misc.extension.sharedExtensionPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -21,11 +20,11 @@ val `Remove Meta AI` by creatingBytecodePatch( dependsOn(sharedExtensionPatch) apply { - getMobileConfigBoolMethod.apply { - val returnIndex = getMobileConfigBoolMethod.patternMatch.startIndex // TODO - val returnRegister = getInstruction(returnIndex).registerA + getMobileConfigBoolMethodMatch.let { + val returnIndex = it.indices.first() + val returnRegister = it.method.getInstruction(returnIndex).registerA - addInstructions( + it.method.addInstructions( returnIndex, """ invoke-static { p1, p2, v$returnRegister }, $EXTENSION_CLASS_DESCRIPTOR->$EXTENSION_METHOD_NAME(JZ)Z @@ -35,16 +34,18 @@ val `Remove Meta AI` by creatingBytecodePatch( } // Extract the common starting digits of Meta AI flag IDs from a flag found in code. - val relevantDigits = with(metaAIKillSwitchCheckMethod) { - method.getInstruction(patternMatch.startIndex).wideLiteral // TODO + val relevantDigits = metaAIKillSwitchCheckMethodMatch.let { + it.method.getInstruction(it.indices.first()).wideLiteral }.toString().substring(0, 7) // Replace placeholder in the extension method. - extensionMethodMethod.replaceInstruction( - stringM.first().index, // TODO - """ + extensionMethodMethodMatch.let { + it.method.replaceInstruction( + it.indices.first(), + """ const-string v1, "$relevantDigits" """, - ) + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt index b076d576e..bd673da4d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt @@ -1,27 +1,22 @@ package app.revanced.patches.youtube.layout.startpage -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.instructions -import app.revanced.patcher.invoke -import app.revanced.patcher.parameterTypes +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.Opcode -internal val BytecodePatchContext.intentActionMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.intentActionMethod by gettingFirstMutableMethodDeclaratively( + "has_handled_intent", +) { parameterTypes("Landroid/content/Intent;") - instructions( - "has_handled_intent"(), - ) } -internal val BytecodePatchContext.browseIdMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.browseIdMethod by gettingFirstMutableMethodDeclaratively( + "FEwhat_to_watch", +) { returnType("Lcom/google/android/apps/youtube/app/common/ui/navigation/PaneDescriptor;") - // parameterTypes() // 20.30 and earlier is no parameters. 20.31+ parameter is L. instructions( - "FEwhat_to_watch"(), - 512(), - fieldAccess(opcode = Opcode.IPUT_OBJECT, type = "Ljava/lang/String;"), + 512L(), + allOf(Opcode.IPUT_OBJECT(), field { type == "Ljava/lang/String;" }), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt index 0c9372d7a..76afb98d1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt @@ -1,21 +1,16 @@ package app.revanced.patches.youtube.layout.theme -import app.revanced.patcher.anyInstruction -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.instructions -import app.revanced.patcher.invoke -import app.revanced.patcher.parameterTypes +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE -internal val BytecodePatchContext.useGradientLoadingScreenMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.useGradientLoadingScreenMethod by gettingFirstMutableMethodDeclaratively { instructions( 45412406L(), ) } -internal val BytecodePatchContext.splashScreenStyleMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.splashScreenStyleMethod by gettingFirstMutableMethodDeclaratively { returnType("V") parameterTypes("Landroid/os/Bundle;") instructions( @@ -24,7 +19,6 @@ internal val BytecodePatchContext.splashScreenStyleMethod by gettingFirstMethodD 269032877L(), // 20.29 and lower. ), ) - custom { method, classDef -> - method.name == "onCreate" && classDef.type == YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE - } + definingClass(YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE) + name("onCreate") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt index 8bdb9ee16..b566c6405 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt @@ -200,21 +200,17 @@ val themePatch = baseThemePatch( ) } - useGradientLoadingScreenMethod.let { - it.method.insertLiteralOverride( - it.instructionMatches.first().index, - "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z", - ) - } + useGradientLoadingScreenMethod.insertLiteralOverride( + 45412406L, + "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z", + ) if (is_19_47_or_greater) { // Lottie splash screen exists in earlier versions, but it may not be always on. - splashScreenStyleMethod.let { - it.method.insertLiteralOverride( - it.instructionMatches.first().index, - "$EXTENSION_CLASS_DESCRIPTOR->getLoadingScreenType(I)I", - ) - } + splashScreenStyleMethod.insertLiteralOverride( + 1074339245L, + "$EXTENSION_CLASS_DESCRIPTOR->getLoadingScreenType(I)I", + ) } }, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt index bcb18f405..8431e18d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt @@ -1,14 +1,13 @@ package app.revanced.patches.youtube.misc.dimensions.spoof -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.instructions +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType -internal val BytecodePatchContext.deviceDimensionsModelToStringMethod by gettingFirstMethodDeclaratively { +// Strings are partial matches (format delimiters), so keep in instructions block. +internal val deviceDimensionsModelToStringMethodMatch = firstMethodComposite { returnType("L") - instructions( - "minh."(), - ";maxh."(), - ) + strings { + +"minh." + +";maxh." + } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index dc3f91e97..52653e521 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -38,8 +38,7 @@ val `Spoof device dimensions` by creatingBytecodePatch( SwitchPreference("revanced_spoof_device_dimensions"), ) - deviceDimensionsModelToStringMethod - .classDef.methods.first { method -> method.name == "" } + deviceDimensionsModelToStringMethodMatch.classDef.methods.first { method -> method.name == "" } // Override the parameters containing the dimensions. .addInstructions( 1, // Add after super call. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt index f6f1d9b28..452b01ea6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt @@ -30,21 +30,19 @@ internal val accountCredentialsInvalidTextPatch = bytecodePatch { // MicroG accounts look almost identical to Google device accounts // and it's more foolproof to instead uninstall/reinstall. arrayOf( - specificNetworkErrorViewControllerMethod, - loadingFrameLayoutControllerMethod, - ).forEach { fingerprint -> - fingerprint.apply { - val index = indices.last() - val register = method.getInstruction(index).registerA + specificNetworkErrorViewControllerMethodMatch, + loadingFrameLayoutControllerMethodMatch, + ).forEach { match -> + val index = match.indices.last() + val register = match.method.getInstruction(index).registerA - method.addInstructions( - index + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getOfflineNetworkErrorString(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$register - """, - ) - } + match.method.addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getOfflineNetworkErrorString(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """, + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt index b37e8d4a1..d8ca1b7ba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt @@ -1,37 +1,33 @@ package app.revanced.patches.youtube.misc.gms -import app.revanced.patcher.accessFlags -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.instructions -import app.revanced.patcher.parameterTypes +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val BytecodePatchContext.specificNetworkErrorViewControllerMethod by gettingFirstMethodDeclaratively { +internal val specificNetworkErrorViewControllerMethodMatch = firstMethodComposite { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() instructions( ResourceType.DRAWABLE("ic_offline_no_content_upside_down"), ResourceType.STRING("offline_no_content_body_text_not_offline_eligible"), - methodCall(name = "getString", returnType = "Ljava/lang/String;"), - after(Opcode.MOVE_RESULT_OBJECT()), + method { name == "getString" && returnType == "Ljava/lang/String;" }, + Opcode.MOVE_RESULT_OBJECT(), ) } // It's not clear if this second class is ever used and it may be dead code, // but it the layout image/text is identical to the network error fingerprint above. -internal val BytecodePatchContext.loadingFrameLayoutControllerMethod by gettingFirstMethodDeclaratively { +internal val loadingFrameLayoutControllerMethodMatch = firstMethodComposite { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") instructions( ResourceType.DRAWABLE("ic_offline_no_content_upside_down"), ResourceType.STRING("offline_no_content_body_text_not_offline_eligible"), - methodCall(name = "getString", returnType = "Ljava/lang/String;"), - after(Opcode.MOVE_RESULT_OBJECT()), + method { name == "getString" && returnType == "Ljava/lang/String;" }, + Opcode.MOVE_RESULT_OBJECT(), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt index 56453dd72..39b94c00d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt @@ -52,19 +52,17 @@ val `Disable haptic feedback` by creatingBytecodePatch( scrubbingHapticsMethod to "disablePreciseSeekingVibrate", seekUndoHapticsMethod to "disableSeekUndoVibrate", zoomHapticsMethod to "disableZoomVibrate", - ).forEach { (fingerprint, methodName) -> - fingerprint.method.apply { - addInstructionsWithLabels( - 0, - """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->$methodName()Z - move-result v0 - if-eqz v0, :vibrate - return-void - """, - ExternalLabel("vibrate", getInstruction(0)), - ) - } + ).forEach { (method, methodName) -> + method.addInstructionsWithLabels( + 0, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->$methodName()Z + move-result v0 + if-eqz v0, :vibrate + return-void + """, + ExternalLabel("vibrate", method.getInstruction(0)), + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt index d124a969f..20c975ce2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt @@ -1,21 +1,28 @@ package app.revanced.patches.youtube.misc.hapticfeedback -internal val BytecodePatchContext.markerHapticsMethod by gettingFirstMethodDeclaratively { +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext + +internal val BytecodePatchContext.markerHapticsMethod by gettingFirstMutableMethodDeclaratively( + "Failed to execute markers haptics vibrate.", +) { returnType("V") - strings("Failed to execute markers haptics vibrate.") } -internal val BytecodePatchContext.scrubbingHapticsMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.scrubbingHapticsMethod by gettingFirstMutableMethodDeclaratively( + "Failed to haptics vibrate for fine scrubbing.", +) { returnType("V") - strings("Failed to haptics vibrate for fine scrubbing.") } -internal val BytecodePatchContext.seekUndoHapticsMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.seekUndoHapticsMethod by gettingFirstMutableMethodDeclaratively( + "Failed to execute seek undo haptics vibrate.", +) { returnType("V") - strings("Failed to execute seek undo haptics vibrate.") } -internal val BytecodePatchContext.zoomHapticsMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.zoomHapticsMethod by gettingFirstMutableMethodDeclaratively( + "Failed to haptics vibrate for video zoom", +) { returnType("V") - strings("Failed to haptics vibrate for video zoom") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt index 5645573d2..1f3e3b543 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt @@ -31,13 +31,13 @@ val cronetImageUrlHookPatch = bytecodePatch( apply { loadImageUrlMethod = messageDigestImageUrlMethod - .match(messageDigestImageUrlParentMethod.immutableClassDef).method + .match(messageDigestImageUrlParentMethodMatch.classDef) loadImageSuccessCallbackMethod = onSucceededMethod - .match(onResponseStartedMethod.immutableClassDef).method + .match(onResponseStartedMethodMatch.classDef) loadImageErrorCallbackMethod = onFailureMethod - .match(onResponseStartedMethod.immutableClassDef).method + .match(onResponseStartedMethodMatch.classDef) // The URL is required for the failure callback hook, but the URL field is obfuscated. // Add a helper get method that returns the URL field. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt index 4e625314a..7f86ebfd9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt @@ -1,15 +1,10 @@ package app.revanced.patches.youtube.misc.imageurlhook -import app.revanced.patcher.accessFlags -import app.revanced.patcher.anyInstruction -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.instructions -import app.revanced.patcher.parameterTypes +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val BytecodePatchContext.onFailureMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.onFailureMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes( @@ -17,58 +12,49 @@ internal val BytecodePatchContext.onFailureMethod by gettingFirstMethodDeclarati "Lorg/chromium/net/UrlResponseInfo;", "Lorg/chromium/net/CronetException;", ) - custom { method, _ -> - method.name == "onFailed" - } + name("onFailed") } // Acts as a parent fingerprint. -internal val BytecodePatchContext.onResponseStartedMethod by gettingFirstMethodDeclaratively { +internal val onResponseStartedMethodMatch = firstMethodComposite( + "Content-Length", + "Content-Type", + "identity", + "application/x-protobuf", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") - strings( - "Content-Length", - "Content-Type", - "identity", - "application/x-protobuf", - ) - custom { method, _ -> - method.name == "onResponseStarted" - } + name("onResponseStarted") } -internal val BytecodePatchContext.onSucceededMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.onSucceededMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") - custom { method, _ -> - method.name == "onSucceeded" - } + name("onSucceeded") } internal const val CRONET_URL_REQUEST_CLASS_DESCRIPTOR = "Lorg/chromium/net/impl/CronetUrlRequest;" -internal val BytecodePatchContext.requestMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.requestMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - custom { _, classDef -> - classDef.type == CRONET_URL_REQUEST_CLASS_DESCRIPTOR - } + definingClass(CRONET_URL_REQUEST_CLASS_DESCRIPTOR) } -internal val BytecodePatchContext.messageDigestImageUrlMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.messageDigestImageUrlMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes("Ljava/lang/String;", "L") } -internal val BytecodePatchContext.messageDigestImageUrlParentMethod by gettingFirstMethodDeclaratively { +internal val messageDigestImageUrlParentMethodMatch = firstMethodComposite { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/String;") parameterTypes() - instructions( - anyInstruction( - "@#&=*+-_.,:!?()/~'%;\$"(), - "@#&=*+-_.,:!?()/~'%;\$[]"(), // 20.38+ - ), - ) + strings { + anyOf( + "@#&=*+-_.,:!?()/~'%;\$", + "@#&=*+-_.,:!?()/~'%;\$[]", // 20.38+ + ) + } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index 65ae30625..07219eced 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -1,12 +1,6 @@ package app.revanced.patches.youtube.misc.links -import app.revanced.patcher.StringComparisonType -import app.revanced.patcher.accessFlags -import app.revanced.patcher.firstMethodComposite -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.instructions -import app.revanced.patcher.parameterTypes -import app.revanced.patcher.returnType +import app.revanced.patcher.* import com.android.tools.smali.dexlib2.AccessFlags /** @@ -16,10 +10,13 @@ internal val abUriParserLegacyMethodMatch = firstMethodComposite { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/Object;") parameterTypes("Ljava/lang/Object;") + strings { + // Partial string match - keep in instructions block + +"Found entityKey=`" + // "that does not contain a PlaylistVideoEntityId" - partial, skipped + } instructions( - "Found entityKey=`"(), - addString("that does not contain a PlaylistVideoEntityId", comparison = StringComparisonType.CONTAINS), - methodCall(smali = "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"), + method { smali == "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;" }, ) } @@ -33,10 +30,10 @@ internal val abUriParserMethodMatch = firstMethodComposite { instructions( // Method is a switch statement of unrelated code, // and there's no strings or anything unique to fingerprint. - methodCall(smali = "Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;"), - methodCall(smali = "Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;"), - methodCall(smali = "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"), - methodCall(smali = "Ljava/util/List;->get(I)Ljava/lang/Object;"), + method { smali == "Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;" }, + method { smali == "Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;" }, + method { smali == "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;" }, + method { smali == "Ljava/util/List;->get(I)Ljava/lang/Object;" }, ) } @@ -45,9 +42,11 @@ internal val httpUriParserMethodMatch = firstMethodComposite { returnType("Landroid/net/Uri;") parameterTypes("Ljava/lang/String;") instructions( - methodCall(smali = "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"), - "https"(), - "://"(), - "https:"(), + method { smali == "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;" }, ) + strings { + +"https" + +"://" + +"https:" + } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt index 36af3d678..6f10b2dd5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt @@ -1,13 +1,10 @@ package app.revanced.patches.youtube.video.speed.remember -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.instructions -import app.revanced.patcher.parameterTypes +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -internal val BytecodePatchContext.initializePlaybackSpeedValuesMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.initializePlaybackSpeedValuesMethod by gettingFirstMutableMethodDeclaratively( + "menu_item_playback_speed", +) { parameterTypes("[L", "I") - instructions( - "menu_item_playback_speed"(), - ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index f6f7cdb17..3acd379b1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -1,37 +1,37 @@ package app.revanced.patches.youtube.video.videoid -import app.revanced.patcher.accessFlags -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.instructions -import app.revanced.patcher.invoke -import app.revanced.patcher.parameterTypes +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val BytecodePatchContext.videoIdMethod by gettingFirstMethodDeclaratively { +/** + * Matches using the class found in [videoIdParentMethodMatch]. + */ +context(_: BytecodePatchContext) +internal fun ClassDef.getVideoIdMethodMatch() = firstMethodComposite { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") instructions( - methodCall( - definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", - returnType = "Ljava/lang/String;", - ), + method { + definingClass == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" + && returnType == "Ljava/lang/String;" + }, Opcode.MOVE_RESULT_OBJECT(), ) } -internal val BytecodePatchContext.videoIdBackgroundPlayMethod by gettingFirstMethodDeclaratively { +internal val videoIdBackgroundPlayMethodMatch = firstMethodComposite { accessFlags(AccessFlags.DECLARED_SYNCHRONIZED, AccessFlags.FINAL, AccessFlags.PUBLIC) returnType("V") parameterTypes("L") instructions( - methodCall( - definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", - returnType = "Ljava/lang/String;", - ), + method { + definingClass == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" + && returnType == "Ljava/lang/String;" + }, Opcode.MOVE_RESULT_OBJECT(), Opcode.IPUT_OBJECT(), Opcode.MONITOR_EXIT(), @@ -39,16 +39,16 @@ internal val BytecodePatchContext.videoIdBackgroundPlayMethod by gettingFirstMet Opcode.MONITOR_EXIT(), Opcode.RETURN_VOID(), ) - custom { method, classDef -> - method.implementation != null && + custom { + implementation != null && ( - classDef.methods.count() == 17 || // 20.39 and lower. - classDef.methods.count() == 16 + definingClass.methods.count() == 17 || // 20.39 and lower. + definingClass.methods.count() == 16 ) // 20.40+ } } -internal val videoIdParentFingerprint = fingerprint { +internal val videoIdParentMethodMatch = firstMethodComposite { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("[L") parameterTypes("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 2f034656a..121827f79 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -92,22 +92,18 @@ val videoIdPatch = bytecodePatch( ) apply { - videoIdMethod.match(videoIdParentFingerprint.immutableClassDef).let { - it.method.apply { - videoIdMethod = this - val index = it.instructionMatches.first().index - videoIdRegister = getInstruction(index + 1).registerA - videoIdInsertIndex = index + 2 - } + videoIdParentMethodMatch.classDef.getVideoIdMethodMatch().let { + videoIdMethod = it.method + val index = it.indices.first() + videoIdRegister = videoIdMethod.getInstruction(index + 1).registerA + videoIdInsertIndex = index + 2 } - videoIdBackgroundPlayMethod.let { - it.method.apply { - backgroundPlaybackMethod = this - val index = it.instructionMatches.first().index - backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA - backgroundPlaybackInsertIndex = index + 2 - } + videoIdBackgroundPlayMethodMatch.let { + backgroundPlaybackMethod = it.method + val index = it.indices.first() + backgroundPlaybackVideoIdRegister = backgroundPlaybackMethod.getInstruction(index + 1).registerA + backgroundPlaybackInsertIndex = index + 2 } } }