From 69aa6839010817fabaa17c9306b7959daf4fd120 Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 22 Jan 2026 07:08:20 +0300 Subject: [PATCH] refactor: Modernize APIs --- .../patches/amazon/DeepLinkingPatch.kt | 2 +- .../revanced/patches/amazon/Fingerprints.kt | 16 +++-- .../patches/angulus/ads/Fingerprints.kt | 10 ++-- .../patches/angulus/ads/RemoveAdsPatch.kt | 2 +- .../bandcamp/limitations/Fingerprints.kt | 10 ++-- .../limitations/RemovePlayLimitsPatch.kt | 2 +- .../root/BypassRootChecksPatch.kt | 2 +- .../cieid/restrictions/root/Fingerprints.kt | 12 ++-- .../com/sbs/ondemand/tv/Fingerprints.kt | 40 ++++++------- .../com/sbs/ondemand/tv/RemoveAdsPatch.kt | 6 +- .../patches/cricbuzz/ads/DisableAdsPatch.kt | 6 +- .../patches/cricbuzz/ads/Fingerprints.kt | 24 ++++---- .../patches/crunchyroll/ads/Fingerprints.kt | 9 +-- .../patches/crunchyroll/ads/HideAdsPatch.kt | 13 ++-- .../patches/disneyplus/Fingerprints.kt | 28 +++++---- .../patches/disneyplus/SkipAdsPatch.kt | 4 +- .../patches/duolingo/ad/DisableAdsPatch.kt | 7 ++- .../patches/duolingo/ad/Fingerprints.kt | 14 +++-- .../duolingo/debug/EnableDebugMenuPatch.kt | 13 ++-- .../patches/duolingo/debug/Fingerprints.kt | 32 +++++----- .../patches/duolingo/energy/Fingerprints.kt | 20 ++++--- .../energy/SkipEnergyRechargeAdsPatch.kt | 9 +-- .../facebook/ads/mainfeed/Fingerprints.kt | 29 ++++----- .../bootloader/BootloaderDetectionPatch.kt | 4 +- .../detection/bootloader/Fingerprints.kt | 26 +++++--- .../detection/root/Fingerprints.kt | 11 ++-- .../detection/root/RootDetectionPatch.kt | 2 +- .../customtabs/EnableCustomTabsPatch.kt | 4 +- .../googlenews/customtabs/Fingerprints.kt | 10 +++- .../EnableDCIMFoldersBackupControlPatch.kt | 2 +- .../googlephotos/misc/backup/Fingerprints.kt | 9 +-- .../misc/features/Fingerprints.kt | 7 +-- .../misc/features/SpoofFeaturesPatch.kt | 2 +- .../patches/hexeditor/ad/DisableAdsPatch.kt | 2 +- .../patches/hexeditor/ad/Fingerprints.kt | 12 ++-- .../iconpackstudio/misc/pro/Fingerprints.kt | 11 ++-- .../iconpackstudio/misc/pro/UnlockProPatch.kt | 2 +- .../detection/deviceintegrity/Fingerprints.kt | 23 ++++--- .../RemoveDeviceIntegrityChecksPatch.kt | 7 +-- .../detection/signature/Fingerprints.kt | 14 ++--- .../signature/SpoofSignaturePatch.kt | 2 +- .../patches/inshorts/ad/Fingerprints.kt | 11 ++-- .../patches/inshorts/ad/InshortsAdsPatch.kt | 2 +- .../patches/instagram/ads/HideAdsPatch.kt | 4 +- .../patches/instagram/feed/Fingerprints.kt | 15 ++--- .../feed/LimitFeedToFollowedProfiles.kt | 7 ++- .../ghost/story/AnonymousStoryViewingPatch.kt | 2 +- .../instagram/ghost/story/Fingerprints.kt | 12 ++-- .../instagram/misc/links/Fingerprint.kt | 13 ++-- .../reels/DisableReelsScrollingPatch.kt | 7 ++- .../patches/instagram/reels/Fingerprints.kt | 17 +++--- .../flipping/DisableStoryAutoFlippingPatch.kt | 2 +- .../instagram/story/flipping/Fingerprints.kt | 17 +++--- .../patches/irplus/ad/Fingerprints.kt | 10 ++-- .../patches/irplus/ad/RemoveAdsPatch.kt | 2 +- .../patches/letterboxd/ads/Fingerprints.kt | 36 +++++------ .../patches/letterboxd/ads/HideAdsPatch.kt | 9 ++- .../unlock/unlockAppIcons/Fingerprints.kt | 12 ++-- .../unlockAppIcons/UnlockAppIconsPatch.kt | 2 +- .../DisableVersionCheckPatch.kt | 7 +-- .../misc/bypassVersionCheck/Fingerprints.kt | 16 ++--- .../misc/login/DisableMandatoryLoginPatch.kt | 2 +- .../lightroom/misc/login/Fingerprints.kt | 12 ++-- .../lightroom/misc/premium/Fingerprints.kt | 13 ++-- .../misc/premium/UnlockPremiumPatch.kt | 2 +- .../detection/license/Fingerprints.kt | 11 ++-- .../license/LicenseValidationPatch.kt | 2 +- .../detection/signature/Fingerprints.kt | 11 ++-- .../signature/SignatureVerificationPatch.kt | 2 +- .../memegenerator/misc/pro/Fingerprints.kt | 12 ++-- .../misc/pro/UnlockProVersionPatch.kt | 2 +- .../patches/messenger/inbox/Fingerprints.kt | 36 +++++------ .../messenger/inbox/HideInboxAdsPatch.kt | 2 +- .../messenger/inbox/HideInboxSubtabsPatch.kt | 2 +- .../patches/messenger/layout/Fingerprints.kt | 12 ++-- .../layout/HideFacebookButtonPatch.kt | 2 +- .../patches/messenger/metaai/Fingerprints.kt | 25 ++++---- .../messenger/metaai/RemoveMetaAIPatch.kt | 19 +++--- .../revanced/patches/meta/ads/Fingerprints.kt | 17 +++--- .../mifitness/misc/locale/Fingerprints.kt | 14 +++-- .../misc/locale/ForceEnglishLocalePatch.kt | 4 +- .../mifitness/misc/login/Fingerprints.kt | 14 +++-- .../mifitness/misc/login/FixLoginPatch.kt | 2 +- .../permanentrepeat/Fingerprints.kt | 12 ++-- .../permanentrepeat/PermanentRepeatPatch.kt | 6 +- .../layout/branding/CustomBrandingPatch.kt | 2 +- .../music/layout/branding/Fingerprints.kt | 14 ++--- .../music/layout/premium/Fingerprints.kt | 17 +++--- .../layout/premium/HideGetPremiumPatch.kt | 8 +-- .../BypassCertificateChecksPatch.kt | 2 +- .../music/misc/androidauto/Fingerprints.kt | 19 +++--- .../BackgroundPlaybackPatch.kt | 4 +- .../misc/backgroundplayback/Fingerprints.kt | 21 +++---- .../misc/fileprovider/FileProviderPatch.kt | 3 +- .../music/misc/fileprovider/Fingerprints.kt | 17 +++--- .../patches/piccomafr/misc/Fingerprints.kt | 18 ++++-- .../misc/SpoofAndroidDeviceIdPatch.kt | 2 +- .../protonvpn/splittunneling/Fingerprints.kt | 15 +++-- .../splittunneling/UnlockSplitTunneling.kt | 6 +- .../radio/misc/fix/crash/Fingerprints.kt | 17 +++--- .../radio/misc/fix/crash/FixCrashPatch.kt | 2 +- .../detection/root/Fingerprints.kt | 16 ++--- .../detection/root/RootDetectionPatch.kt | 2 +- .../functionality/filesize/Fingerprints.kt | 13 ++-- .../filesize/RemoveFileSizeLimitPatch.kt | 4 +- .../patches/soundcloud/ad/Fingerprints.kt | 14 ++--- .../patches/soundcloud/ad/HideAdsPatch.kt | 16 ++--- .../analytics/DisableTelemetryPatch.kt | 2 +- .../soundcloud/analytics/Fingerprints.kt | 18 +++--- .../offlinesync/EnableOfflineSyncPatch.kt | 15 ++--- .../soundcloud/offlinesync/Fingerprints.kt | 20 ++++--- .../patches/soundcloud/shared/Fingerprints.kt | 10 +++- .../password/EnablePasswordLoginPatch.kt | 6 +- .../patches/strava/password/Fingerprints.kt | 20 ++++--- .../privacy/BlockSnowplowTrackingPatch.kt | 2 +- .../patches/strava/privacy/Fingerprints.kt | 7 +-- .../strava/quickedit/DisableQuickEditPatch.kt | 2 +- .../patches/strava/quickedit/Fingerprints.kt | 13 ++-- .../strava/subscription/Fingerprints.kt | 12 ++-- .../subscription/UnlockSubscriptionPatch.kt | 2 +- .../DisableSubscriptionSuggestionsPatch.kt | 9 +-- .../patches/strava/upselling/Fingerprints.kt | 13 ++-- .../swissid/integritycheck/Fingerprints.kt | 12 ++-- .../RemoveGooglePlayIntegrityCheckPatch.kt | 2 +- .../revanced/patches/threads/HideAdsPatch.kt | 4 +- .../ticktick/misc/themeunlock/Fingerprints.kt | 19 +++--- .../misc/themeunlock/UnlockThemePatch.kt | 4 +- .../tiktok/feedfilter/FeedFilterPatch.kt | 4 +- .../patches/tiktok/feedfilter/Fingerprints.kt | 15 +++-- .../interaction/cleardisplay/Fingerprints.kt | 14 +++-- .../cleardisplay/RememberClearDisplayPatch.kt | 2 +- .../interaction/downloads/DownloadsPatch.kt | 10 ++-- .../interaction/downloads/Fingerprints.kt | 60 +++++++++---------- .../interaction/seekbar/Fingerprints.kt | 15 ++--- .../interaction/seekbar/ShowSeekbarPatch.kt | 4 +- .../tiktok/interaction/speed/Fingerprints.kt | 19 +++--- .../interaction/speed/PlaybackSpeedPatch.kt | 7 ++- .../misc/login/fixgoogle/Fingerprints.kt | 25 ++++---- .../login/fixgoogle/FixGoogleLoginPatch.kt | 4 +- .../patches/tiktok/misc/share/Fingerprints.kt | 22 +++---- .../misc/share/SanitizeShareUrlsPatch.kt | 2 +- .../revanced/patches/trakt/Fingerprints.kt | 13 ++-- .../revanced/patches/trakt/UnlockProPatch.kt | 7 ++- .../popups/DisableGiftMessagePopupPatch.kt | 2 +- .../tumblr/annoyances/popups/Fingerprints.kt | 12 ++-- .../patches/twitch/ad/audio/AudioAdsPatch.kt | 4 +- .../patches/twitch/ad/audio/Fingerprints.kt | 12 ++-- .../twitch/ad/embedded/EmbeddedAdsPatch.kt | 2 +- .../twitch/ad/embedded/Fingerprints.kt | 12 ++-- .../patches/twitch/ad/video/Fingerprints.kt | 37 ++++++------ .../patches/twitch/ad/video/VideoAdsPatch.kt | 10 ++-- .../twitch/chat/antidelete/Fingerprints.kt | 26 ++++---- .../antidelete/ShowDeletedMessagesPatch.kt | 6 +- .../autoclaim/AutoClaimChannelPointsPatch.kt | 2 +- .../twitch/chat/autoclaim/Fingerprints.kt | 13 ++-- .../patches/twitch/debug/DebugModePatch.kt | 8 +-- .../patches/twitch/debug/Fingerprints.kt | 26 ++++---- .../twitch/misc/settings/Fingerprints.kt | 38 +++++------- .../twitter/layout/viewcount/Fingerprints.kt | 10 ++-- .../layout/viewcount/HideViewCountPatch.kt | 2 +- .../misc/firebasegetcert/Fingerprints.kt | 30 +++++----- .../firebasegetcert/FirebaseGetCertPatch.kt | 4 +- .../warnwetter/misc/promocode/Fingerprints.kt | 14 +++-- .../misc/promocode/PromoCodeUnlockPatch.kt | 2 +- .../patches/willhaben/ads/Fingerprints.kt | 32 +++++----- .../patches/willhaben/ads/HideAdsPatch.kt | 4 +- 166 files changed, 969 insertions(+), 885 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/amazon/DeepLinkingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/amazon/DeepLinkingPatch.kt index 7dff3513c2..723ee432fa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/amazon/DeepLinkingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/amazon/DeepLinkingPatch.kt @@ -11,7 +11,7 @@ val deepLinkingPatch = bytecodePatch( compatibleWith("com.amazon.mShop.android.shopping") apply { - deepLinkingFingerprint.method.addInstructions( + deepLinkingMethod.addInstructions( 0, """ const/4 v0, 0x1 diff --git a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt index 1339149f43..54ca09bd33 100644 --- a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt @@ -1,11 +1,17 @@ package app.revanced.patches.amazon -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val deepLinkingFingerprint = fingerprint { +internal val BytecodePatchContext.deepLinkingMethod by gettingFirstMutableMethodDeclaratively( + "https://www.", + "android.intent.action.VIEW" +) { accessFlags(AccessFlags.PRIVATE) - returns("Z") - parameters("L") - strings("https://www.", "android.intent.action.VIEW") + returnType("Z") + parameterTypes("L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt index 3196adb7e1..282441aaf0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt @@ -1,6 +1,9 @@ package app.revanced.patches.angulus.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags // Keywords to search for in case the method name changes: @@ -11,8 +14,7 @@ import com.android.tools.smali.dexlib2.AccessFlags // This fingerprint targets a method that returns the daily measurement count. // This method is used to determine if the user has reached the daily limit of measurements. -internal val getDailyMeasurementCountFingerprint = fingerprint { +internal val BytecodePatchContext.getDailyMeasurementCountMethod by gettingFirstMutableMethodDeclaratively("dailyMeasurementCount") { accessFlags(AccessFlags.PRIVATE) - returns("I") - strings("dailyMeasurementCount") + returnType("I") } diff --git a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/RemoveAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/RemoveAdsPatch.kt index c8c726de38..843767c9bf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/RemoveAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/RemoveAdsPatch.kt @@ -12,6 +12,6 @@ val angulusPatch = bytecodePatch(name = "Hide ads") { apply { // Always return 0 as the daily measurement count. - getDailyMeasurementCountFingerprint.method.returnEarly(0) + getDailyMeasurementCountMethod.returnEarly(0) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt index 15d306bc94..d550c88eac 100644 --- a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt @@ -1,7 +1,9 @@ package app.revanced.patches.bandcamp.limitations -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val handlePlaybackLimitsFingerprint = fingerprint { - strings("track_id", "play_count") -} +internal val BytecodePatchContext.handlePlaybackLimitsMethod by gettingFirstMutableMethodDeclaratively( + "track_id", + "play_count" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch.kt index a9326cc94d..6fda82ae46 100644 --- a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch.kt @@ -11,6 +11,6 @@ val removePlayLimitsPatch = bytecodePatch( compatibleWith("com.bandcamp.android") apply { - handlePlaybackLimitsFingerprint.method.returnEarly() + handlePlaybackLimitsMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt index c559aa1e7c..199be0b70e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt @@ -11,6 +11,6 @@ val bypassRootChecksPatch = bytecodePatch( compatibleWith("it.ipzs.cieid") apply { - checkRootFingerprint.method.addInstruction(1, "return-void") + checkRootMethod.addInstruction(1, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt index 387b0a0be8..032a8da1a1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.cieid.restrictions.root -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val checkRootFingerprint = fingerprint { - custom { method, _ -> - method.name == "onResume" && method.definingClass == "Lit/ipzs/cieid/BaseActivity;" - } +internal val BytecodePatchContext.checkRootMethod by gettingFirstMutableMethodDeclaratively { + name("onResume") + definingClass("Lit/ipzs/cieid/BaseActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt index bf2ee4120c..533294d492 100644 --- a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt @@ -1,28 +1,26 @@ package app.revanced.patches.com.sbs.ondemand.tv -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val shouldShowAdvertisingTVFingerprint = fingerprint { - returns("Z") - custom { method, classDef -> - method.name == "getShouldShowAdvertisingTV" && - classDef.type == "Lcom/sbs/ondemand/common/InMemoryStorage;" - } +internal val BytecodePatchContext.shouldShowAdvertisingTVMethod by gettingFirstMutableMethodDeclaratively { + name("getShouldShowAdvertisingTV") + definingClass("Lcom/sbs/ondemand/common/InMemoryStorage;") + returnType("Z") } -internal val shouldShowPauseAdFingerprint = fingerprint { - returns("Z") - custom { method, classDef -> - method.name == "shouldShowPauseAd" && - classDef.type == "Lcom/sbs/ondemand/player/viewmodels/PauseAdController;" - } -} - -internal val requestAdStreamFingerprint = fingerprint { - returns("V") - custom { method, classDef -> - method.name == "requestAdStream\$player_googleStoreTvRelease" && - classDef.type == "Lcom/sbs/ondemand/player/viewmodels/AdsController;" - } +internal val BytecodePatchContext.shouldShowPauseAdMethod by gettingFirstMutableMethodDeclaratively { + name("shouldShowPauseAd") + definingClass("Lcom/sbs/ondemand/player/viewmodels/PauseAdController;") + returnType("Z") + } +internal val BytecodePatchContext.requestAdStreamMethod by gettingFirstMutableMethodDeclaratively { + name("requestAdStream\$player_googleStoreTvRelease") + definingClass("Lcom/sbs/ondemand/player/viewmodels/AdsController;") + returnType("V") +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/RemoveAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/RemoveAdsPatch.kt index 2eebe8f259..01da9829da 100644 --- a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/RemoveAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/RemoveAdsPatch.kt @@ -15,8 +15,8 @@ val removeAdsPatch = bytecodePatch( dependsOn(disableLicenseCheckPatch) apply { - shouldShowAdvertisingTVFingerprint.method.returnEarly(true) - shouldShowPauseAdFingerprint.method.returnEarly(false) + shouldShowAdvertisingTVMethod.returnEarly(true) + shouldShowPauseAdMethod.returnEarly(false) // Remove on-demand pre-roll advertisements using exception handling. // Exception handling is used instead of returnEarly() because: @@ -24,7 +24,7 @@ val removeAdsPatch = bytecodePatch( // 2. SBS app has built-in exception handling in handleProviderFailure(). // 3. Exception triggers fallbackToAkamaiProvider() which loads actual content. // 4. This preserves the intended app flow: first try ads, then fail gracefully, then load content. - requestAdStreamFingerprint.method.addInstructions( + requestAdStreamMethod.addInstructions( 0, """ new-instance v0, Ljava/lang/RuntimeException; diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt index b99aca9077..4f46f01e6d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt @@ -23,11 +23,11 @@ val disableAdsPatch = bytecodePatch ( dependsOn(sharedExtensionPatch) apply { - userStateSwitchFingerprint.method.returnEarly(true) + userStateSwitchMethod.returnEarly(true) // Remove region-specific Cricbuzz11 elements. - cb11ConstructorFingerprint.method.addInstruction(0, "const/4 p7, 0x0") - getBottomBarFingerprint.method.apply { + cb11ConstructorMethod.addInstruction(0, "const/4 p7, 0x0") + getBottomBarMethod.apply { val getIndex = indexOfFirstInstructionOrThrow() { opcode == Opcode.IGET_OBJECT && getReference()?.name == "bottomBar" } diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt index 9dd6844fda..c0af706e7d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt @@ -1,15 +1,16 @@ package app.revanced.patches.cricbuzz.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val userStateSwitchFingerprint = fingerprint { +internal val BytecodePatchContext.userStateSwitchMethod by gettingFirstMutableMethodDeclaratively("key.user.state", "NA") { opcodes(Opcode.SPARSE_SWITCH) - strings("key.user.state", "NA") -} -internal val cb11ConstructorFingerprint = fingerprint { - parameters( +} +internal val BytecodePatchContext.cb11ConstructorMethod by gettingFirstMutableMethodDeclaratively { + definingClass("CB11Details;"::endsWith) + parameterTypes( "Ljava/lang/String;", "Ljava/lang/String;", "Ljava/lang/String;", @@ -21,13 +22,8 @@ internal val cb11ConstructorFingerprint = fingerprint { "Ljava/lang/String;", "L" ) - custom { _, classDef -> - classDef.endsWith("CB11Details;") - } } - -internal val getBottomBarFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getBottomBar" && classDef.endsWith("HomeMenu;") - } +internal val BytecodePatchContext.getBottomBarMethod by gettingFirstMutableMethodDeclaratively { + name("getBottombar") + definingClass("HomeMenu;"::endsWith) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt index 0266e0344d..ea66fd2577 100644 --- a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt @@ -1,7 +1,8 @@ package app.revanced.patches.crunchyroll.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val videoUrlReadyToStringFingerprint = fingerprint { - strings("VideoUrlReady(url=", ", enableAds=") -} +internal val BytecodePatchContext.videoUrlReadyToStringMethod by gettingFirstMutableMethodDeclaratively( + "VideoUrlReady(url=", ", enableAds=" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/HideAdsPatch.kt index 39c331affd..1d39beafcd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/HideAdsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.crunchyroll.ads +import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.extensions.instructions @@ -20,19 +21,19 @@ val hideAdsPatch = bytecodePatch( apply { // Get obfuscated "enableAds" field from toString method. - val enableAdsField = videoUrlReadyToStringFingerprint.let { - val strIndex = videoUrlReadyToStringFingerprint.stringMatches.last().index - val fieldIndex = it.method.indexOfFirstInstruction(strIndex, Opcode.IGET_BOOLEAN) - it.method.getInstruction(fieldIndex).getReference()!! + val enableAdsField = videoUrlReadyToStringMethod.let { + val strIndex = videoUrlReadyToStringMethod.stringMatches.last().index // TODO + val fieldIndex = it.indexOfFirstInstruction(strIndex, Opcode.IGET_BOOLEAN) + it.getInstruction(fieldIndex).getReference()!! } // Remove final access flag on field. - videoUrlReadyToStringFingerprint.classDef.fields + videoUrlReadyToStringMethod.classDef.fields .first { it.name == enableAdsField.name } .removeFlags(AccessFlags.FINAL) // Override enableAds field in non-default constructor. - val constructor = videoUrlReadyToStringFingerprint.classDef.methods.first { + val constructor = videoUrlReadyToStringMethod.classDef.methods.first { AccessFlags.CONSTRUCTOR.isSet(it.accessFlags) && it.parameters.isNotEmpty() } constructor.addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/disneyplus/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/disneyplus/Fingerprints.kt index 4a9749622b..94d999c5e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/disneyplus/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/disneyplus/Fingerprints.kt @@ -1,19 +1,21 @@ package app.revanced.patches.disneyplus -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val insertionGetPointsFingerprint = fingerprint { - returns("Ljava/util/List") - custom { method, _ -> - method.name == "getPoints" && - method.definingClass == "Lcom/dss/sdk/internal/media/Insertion;" - } + +internal val BytecodePatchContext.insertionGetPointsMethod by gettingFirstMutableMethodDeclaratively { + name("getPoints") + definingClass("Lcom/dss/sdk/internal/media/Insertion;") + returnType("Ljava/util/List") } -internal val insertionGetRangesFingerprint = fingerprint { - returns("Ljava/util/List") - custom { method, _ -> - method.name == "getRanges" && - method.definingClass == "Lcom/dss/sdk/internal/media/Insertion;" - } +internal val BytecodePatchContext.insertionGetRangesMethod by gettingFirstMutableMethodDeclaratively { + name("getRanges") + definingClass("Lcom/dss/sdk/internal/media/Insertion;") + returnType("Ljava/util/List") } + diff --git a/patches/src/main/kotlin/app/revanced/patches/disneyplus/SkipAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/disneyplus/SkipAdsPatch.kt index c5e58a48f4..864121ebc8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/disneyplus/SkipAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/disneyplus/SkipAdsPatch.kt @@ -11,8 +11,8 @@ val skipAdsPatch = bytecodePatch( compatibleWith("com.disney.disneyplus") apply { - arrayOf(insertionGetPointsFingerprint, insertionGetRangesFingerprint).forEach { - it.method.addInstructions( + arrayOf(insertionGetPointsMethod, insertionGetRangesMethod).forEach { + it.addInstructions( 0, """ new-instance v0, Ljava/util/ArrayList; diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt index ad068e96e2..a3565a931a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.duolingo.ad +import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch @@ -20,10 +21,10 @@ val disableAdsPatch = bytecodePatch( // SharedPreferences has a debug boolean value with key "disable_ads", which maps to "DebugCategory.DISABLE_ADS". // // MonetizationDebugSettings seems to be the most general setting to work fine. - initializeMonetizationDebugSettingsFingerprint.match( - monetizationDebugSettingsToStringFingerprint.classDef + initializeMonetizationDebugSettingsMethod.match( // TODO + monetizationDebugSettingsToStringMethod.classDef ).method.apply { - val insertIndex = initializeMonetizationDebugSettingsFingerprint.instructionMatches.first().index + val insertIndex = initializeMonetizationDebugSettingsMethod.instructionMatches.first().index val register = getInstruction(insertIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt index 6656e66efc..d6a2f4aa8a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt @@ -1,17 +1,19 @@ package app.revanced.patches.duolingo.ad -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val initializeMonetizationDebugSettingsFingerprint = fingerprint { +internal val BytecodePatchContext.initializeMonetizationDebugSettingsMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") + returnType("V") // Parameters have not been reliable for fingerprinting between versions. opcodes(Opcode.IPUT_BOOLEAN) } -internal val monetizationDebugSettingsToStringFingerprint = fingerprint { - strings("MonetizationDebugSettings(") // Partial string match. - custom { method, _ -> method.name == "toString" } +internal val BytecodePatchContext.monetizationDebugSettingsToStringMethod by gettingFirstMutableMethodDeclaratively( + "MonetizationDebugSettings(" // Partial string match. +) { + name("toString") } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt index 3d527834fc..7d19663c67 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.duolingo.debug +import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch @@ -15,16 +16,16 @@ val enableDebugMenuPatch = bytecodePatch( apply { // It seems all categories are allowed on release. Force this on anyway. - debugCategoryAllowOnReleaseBuildsFingerprint.method.returnEarly(true) + debugCategoryAllowOnReleaseBuildsMethod.returnEarly(true) // Change build config debug build flag. - buildConfigProviderConstructorFingerprint.match( - buildConfigProviderToStringFingerprint.classDef + buildConfigProviderConstructorMethod.match( // TODO + buildConfigProviderToStringMethod.classDef ).let { - val index = it.patternMatch.startIndex + val index = it.patternMatch.startIndex // TODO - it.method.apply { - val register = getInstruction(index).registerA + it.apply { + val register = getInstruction(index).registerA // TODO addInstruction( index + 1, "const/4 v$register, 0x1" diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt index c3d663c838..6e1e7fcfea 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt @@ -1,28 +1,28 @@ package app.revanced.patches.duolingo.debug -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val debugCategoryAllowOnReleaseBuildsFingerprint = fingerprint { - returns("Z") - parameters() - custom { method, classDef -> - method.name == "getAllowOnReleaseBuilds" && classDef.type == "Lcom/duolingo/debug/DebugCategory;" - } +internal val BytecodePatchContext.debugCategoryAllowOnReleaseBuildsMethod by gettingFirstMutableMethodDeclaratively { + name("getAllowOnReleaseBuilds") + definingClass("Lcom/duolingo/debug/DebugCategory;") + returnType("Z") + parameterTypes() } -internal val buildConfigProviderConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.buildConfigProviderConstructorMethod by gettingFirstMutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters() + parameterTypes() opcodes(Opcode.CONST_4) } -internal val buildConfigProviderToStringFingerprint = fingerprint { - parameters() - returns("Ljava/lang/String;") - strings("BuildConfigProvider(") // Partial string match. - custom { method, _ -> - method.name == "toString" - } +internal val BytecodePatchContext.buildConfigProviderToStringMethod by gettingFirstMutableMethodDeclaratively( + "BuildConfigProvider(" // Partial string match. +) { + name("toString") + parameterTypes() + returnType("Ljava/lang/String;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt index 73dbcf304c..ce8c9af665 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt @@ -1,21 +1,23 @@ package app.revanced.patches.duolingo.energy -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode /** - * Matches the class found in [energyConfigToStringFingerprint]. + * Matches the class found in [initializeEnergyConfigMethod]. */ -internal val initializeEnergyConfigFingerprint = fingerprint { +internal val BytecodePatchContext.initializeEnergyConfigMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes(Opcode.RETURN_VOID) } -// Class name currently is not obfuscated but it may be in the future. -internal val energyConfigToStringFingerprint = fingerprint { - parameters() - returns("Ljava/lang/String;") - strings("EnergyConfig(", "maxEnergy=") // Partial string matches. - custom { method, _ -> method.name == "toString" } +// Class name currently is not obfuscated, but it may be in the future. +internal val BytecodePatchContext.energyConfigToStringMethod by gettingFirstMutableMethodDeclaratively( + "EnergyConfig(", "maxEnergy=" // Partial string matches. +) { + name("toString") + parameterTypes() + returnType("Ljava/lang/String;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt index 9a99747c55..915dd11ae0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.duolingo.energy +import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.findFieldFromToString @@ -12,12 +13,12 @@ val skipEnergyRechargeAdsPatch = bytecodePatch( compatibleWith("com.duolingo") apply { - initializeEnergyConfigFingerprint - .match(energyConfigToStringFingerprint.classDef) + initializeEnergyConfigMethod + .match(energyConfigToStringMethod.classDef) // TODO .method.apply { - val energyField = energyConfigToStringFingerprint.method + val energyField = energyConfigToStringMethod .findFieldFromToString("energy=") - val insertIndex = initializeEnergyConfigFingerprint.patternMatch.startIndex + val insertIndex = initializeEnergyConfigMethod.patternMatch.startIndex // TODO addInstructions( insertIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt index e84a448baa..78704fd1c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.facebook.ads.mainfeed -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val baseModelMapperFingerprint = fingerprint { +internal val BytecodePatchContext.baseModelMapperMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Lcom/facebook/graphql/modelutil/BaseModelWithTree;") - parameters("Ljava/lang/Class", "I", "I") + returnType("Lcom/facebook/graphql/modelutil/BaseModelWithTree;") + parameterTypes("Ljava/lang/Class", "I", "I") opcodes( Opcode.SGET_OBJECT, Opcode.INVOKE_STATIC, @@ -16,11 +17,11 @@ internal val baseModelMapperFingerprint = fingerprint { Opcode.IF_EQ, ) } - -internal val getSponsoredDataModelTemplateFingerprint = fingerprint { +internal val BytecodePatchContext.getSponsoredDataModelTemplateMethod by gettingFirstMutableMethodDeclaratively { + definingClass("Lcom/facebook/graphql/model/GraphQLFBMultiAdsFeedUnit;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() + returnType("L") + parameterTypes() opcodes( Opcode.CONST, Opcode.CONST, @@ -28,14 +29,11 @@ internal val getSponsoredDataModelTemplateFingerprint = fingerprint { Opcode.MOVE_RESULT_OBJECT, Opcode.RETURN_OBJECT, ) - custom { _, classDef -> - classDef.type == "Lcom/facebook/graphql/model/GraphQLFBMultiAdsFeedUnit;" - } -} -internal val getStoryVisibilityFingerprint = fingerprint { +} +internal val BytecodePatchContext.getStoryVisibilityMethod by gettingFirstMutableMethodDeclaratively("This should not be called for base class object") { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/String;") + returnType("Ljava/lang/String;") opcodes( Opcode.INSTANCE_OF, Opcode.IF_NEZ, @@ -45,5 +43,4 @@ internal val getStoryVisibilityFingerprint = fingerprint { Opcode.IF_NEZ, Opcode.CONST, ) - strings("This should not be called for base class object") -} +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatch.kt index 77830cadcc..f84adf8f11 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatch.kt @@ -11,8 +11,8 @@ val bootloaderDetectionPatch = bytecodePatch( compatibleWith("at.gv.bmf.bmf2go") apply { - setOf(createKeyFingerprint, bootStateFingerprint).forEach { fingerprint -> - fingerprint.method.addInstructions( + setOf(createKeyMethod, bootStateMethod).forEach { fingerprint -> + fingerprint.addInstructions( 0, """ const/4 v0, 0x1 diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt index 4c8ee1c541..6f7ec158a8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt @@ -1,13 +1,17 @@ package app.revanced.patches.finanzonline.detection.bootloader -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#isBootStateOk (3.0.1) -internal val bootStateFingerprint = fingerprint { +internal val BytecodePatchContext.bootStateMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC) - returns("Z") + returnType("Z") opcodes( Opcode.INVOKE_DIRECT, Opcode.MOVE_RESULT_OBJECT, @@ -29,9 +33,15 @@ internal val bootStateFingerprint = fingerprint { ) } + // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#createKey (3.0.1) -internal val createKeyFingerprint = fingerprint { +internal val BytecodePatchContext.createKeyMethod by gettingFirstMutableMethodDeclaratively( + "attestation", + "SHA-256", + "random", + "EC", + "AndroidKeyStore" +) { accessFlags(AccessFlags.PUBLIC) - returns("Z") - strings("attestation", "SHA-256", "random", "EC", "AndroidKeyStore") -} \ No newline at end of file + returnType("Z") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt index fec7f1249f..6c21a0b53c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt @@ -1,14 +1,15 @@ package app.revanced.patches.finanzonline.detection.root -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.RootDetection#isRooted (3.0.1) -internal val rootDetectionFingerprint = fingerprint { +internal val BytecodePatchContext.rootDetectionMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - parameters("L") + returnType("L") + parameterTypes("L") opcodes( Opcode.NEW_INSTANCE, Opcode.INVOKE_DIRECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt index e403583882..3144a2f007 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt @@ -10,7 +10,7 @@ val `Remove root detection` by creatingBytecodePatch( compatibleWith("at.gv.bmf.bmf2go") apply { - rootDetectionFingerprint.method.addInstructions( + rootDetectionMethod.addInstructions( 0, """ sget-object v0, Ljava/lang/Boolean;->FALSE:Ljava/lang/Boolean; diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt index d491cabee1..d58a0ea34a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt @@ -13,8 +13,8 @@ val enableCustomTabsPatch = bytecodePatch( compatibleWith("com.google.android.apps.magazines") apply { - launchCustomTabFingerprint.method.apply { - val checkIndex = launchCustomTabFingerprint.instructionMatches.last().index + 1 + launchCustomTabMethod.apply { + val checkIndex = launchCustomTabMethod.instructionMatches.last().index + 1 // TODO val register = getInstruction(checkIndex).registerA replaceInstruction(checkIndex, "const/4 v$register, 0x1") diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt index 8880c010e9..aa5adaefe1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt @@ -1,10 +1,15 @@ package app.revanced.patches.googlenews.customtabs -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val launchCustomTabFingerprint = fingerprint { +internal val BytecodePatchContext.launchCustomTabMethod by gettingFirstMutableMethodDeclaratively { + definingClass("CustomTabsArticleLauncher;"::endsWith) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.IPUT_OBJECT, @@ -13,5 +18,4 @@ internal val launchCustomTabFingerprint = fingerprint { Opcode.CONST_4, Opcode.IPUT_BOOLEAN, ) - custom { _, classDef -> classDef.endsWith("CustomTabsArticleLauncher;") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/EnableDCIMFoldersBackupControlPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/EnableDCIMFoldersBackupControlPatch.kt index 232edb2e64..25da2d9b62 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/EnableDCIMFoldersBackupControlPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/EnableDCIMFoldersBackupControlPatch.kt @@ -13,6 +13,6 @@ val enableDCIMFoldersBackupControlPatch = bytecodePatch( compatibleWith("com.google.android.apps.photos") apply { - isDCIMFolderBackupControlDisabled.method.returnEarly(false) + isDCIMFolderBackupControlMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt index 71dda1f3ac..1b32b8d24a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt @@ -1,8 +1,9 @@ package app.revanced.patches.googlephotos.misc.backup -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val isDCIMFolderBackupControlDisabled = fingerprint { - returns("Z") - strings("/dcim", "/mars_files/") +internal val BytecodePatchContext.isDCIMFolderBackupControlMethod by gettingFirstMutableMethodDeclaratively("/dcim", "/mars_files/") { + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt index 95f2a3dba7..60797fe632 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt @@ -1,7 +1,6 @@ package app.revanced.patches.googlephotos.misc.features -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val initializeFeaturesEnumFingerprint = fingerprint { - strings("com.google.android.apps.photos.NEXUS_PRELOAD") -} +internal val BytecodePatchContext.initializeFeaturesEnumMethod by gettingFirstMutableMethodDeclaratively("com.google.android.apps.photos.NEXUS_PRELOAD") \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt index 8fd41bac46..71046d14eb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt @@ -60,7 +60,7 @@ val spoofFeaturesPatch = bytecodePatch( @Suppress("NAME_SHADOWING") val featuresToDisable = featuresToDisable!!.toSet() - initializeFeaturesEnumFingerprint.method.apply { + initializeFeaturesEnumMethod.apply { instructions.filter { it.opcode == Opcode.CONST_STRING }.forEach { val feature = it.getReference()!!.string diff --git a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt index 075ed46cff..70a906e747 100644 --- a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt @@ -10,7 +10,7 @@ val disableAdsPatch = bytecodePatch( compatibleWith("com.myprog.hexedit") apply { - primaryAdsFingerprint.method.replaceInstructions( + primaryAdsMethod.replaceInstructions( 0, """ const/4 v0, 0x1 diff --git a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt index 2fa2c5b851..fabf86ca2b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.hexeditor.ad -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val primaryAdsFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("PreferencesHelper;") && method.name == "isAdsDisabled" - } +internal val BytecodePatchContext.primaryAdsMethod by gettingFirstMutableMethodDeclaratively { + name("isAdsDisabled") + definingClass("PreferencesHelper;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt index 84db554572..15b84aeeaa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt @@ -1,8 +1,11 @@ package app.revanced.patches.iconpackstudio.misc.pro -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val checkProFingerprint = fingerprint { - returns("Z") - custom { _, classDef -> classDef.endsWith("IPSPurchaseRepository;") } +internal val BytecodePatchContext.checkProMethod by gettingFirstMutableMethodDeclaratively { + definingClass("IPSPurchaseRepository;"::endsWith) + returnType("Z") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatch.kt index 447c6713d6..2fa0ddf895 100644 --- a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatch.kt @@ -10,7 +10,7 @@ val unlockProPatch = bytecodePatch( compatibleWith("ginlemon.iconpackstudio"("2.2 build 016")) apply { - checkProFingerprint.method.addInstructions( + checkProMethod.addInstructions( 0, """ const/4 v0, 0x1 diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/Fingerprints.kt index c8ebd86df4..312b725815 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/Fingerprints.kt @@ -1,22 +1,19 @@ package app.revanced.patches.idaustria.detection.deviceintegrity -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val isDeviceBootloaderOpenFingerprint = fingerprint { +internal val BytecodePatchContext.isDeviceBootloaderOpenMethod by gettingFirstMutableMethodDeclaratively { + name("isDeviceBootloaderOpen") + definingClass("/DeviceIntegrityCheckProviderImpl;"::endsWith) accessFlags(AccessFlags.PUBLIC) - returns("Ljava/lang/Object;") - custom { method, classDef -> - method.name == "isDeviceBootloaderOpen" && - classDef.endsWith("/DeviceIntegrityCheckProviderImpl;") - } + returnType("Ljava/lang/Object;") } -internal val isDeviceRootedFingerprint = fingerprint { +internal val BytecodePatchContext.isDeviceRootedMethod by gettingFirstMutableMethodDeclaratively { + name("isDeviceRooted") + definingClass("/DeviceIntegrityCheckProviderImpl;"::endsWith) accessFlags(AccessFlags.PUBLIC) - returns("Z") - custom { method, classDef -> - method.name == "isDeviceRooted" && - classDef.endsWith("/DeviceIntegrityCheckProviderImpl;") - } + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/RemoveDeviceIntegrityChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/RemoveDeviceIntegrityChecksPatch.kt index 92e5a646ea..9cdb79a254 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/RemoveDeviceIntegrityChecksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/RemoveDeviceIntegrityChecksPatch.kt @@ -1,10 +1,9 @@ package app.revanced.patches.idaustria.detection.deviceintegrity -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly - @Suppress("unused") val removeDeviceIntegrityChecksPatch = bytecodePatch( name = "Remove device integrity checks", @@ -13,9 +12,9 @@ val removeDeviceIntegrityChecksPatch = bytecodePatch( compatibleWith("at.gv.oe.app") apply { - isDeviceRootedFingerprint.method.returnEarly(false) + isDeviceRootedMethod.returnEarly(false) - isDeviceBootloaderOpenFingerprint.method.apply { + isDeviceBootloaderOpenMethod.apply { addInstructions( 0, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt index 61cd9605f1..a2013d3e2a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt @@ -1,13 +1,13 @@ package app.revanced.patches.idaustria.detection.signature -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val spoofSignatureFingerprint = fingerprint { +internal val BytecodePatchContext.spoofSignatureMethod by gettingFirstMutableMethodDeclaratively { + name("getPubKey") + definingClass("/SL2Step1Task;"::endsWith) accessFlags(AccessFlags.PRIVATE) - returns("L") - parameters("L") - custom { method, classDef -> - classDef.endsWith("/SL2Step1Task;") && method.name == "getPubKey" - } + returnType("L") + parameterTypes("L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt index 26e02e0917..f25f35ed8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt @@ -24,6 +24,6 @@ val spoofSignaturePatch = bytecodePatch( "77ef1be61b2c01ebdabddcbf53cc4b6fd9a3c445606ee77b3758162c80ad8f8137b3c6864e92db904807dcb2be9d7717dd21" + "bf42c121d620ddfb7914f7a95c713d9e1c1b7bdb4a03d618e40cf7e9e235c0b5687e03b7ab3,publicExponent=10001}" - spoofSignatureFingerprint.method.returnEarly(expectedSignature) + spoofSignatureMethod.returnEarly(expectedSignature) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt index 573bd72e35..b1a246a7e6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt @@ -1,8 +1,11 @@ package app.revanced.patches.inshorts.ad -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val inshortsAdsFingerprint = fingerprint { - returns("V") - strings("GoogleAdLoader", "exception in requestAd") +internal val BytecodePatchContext.inshortsAdsMethod by gettingFirstMutableMethodDeclaratively( + "GoogleAdLoader", "exception in requestAd" +) { + returnType("V") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt index 5d3880c7cf..a16e7e92f0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt @@ -10,7 +10,7 @@ val hideAdsPatch = bytecodePatch( compatibleWith("com.nis.app") apply { - inshortsAdsFingerprint.method.addInstruction( + inshortsAdsMethod.addInstruction( 0, """ return-void diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/ads/HideAdsPatch.kt index 6fdc9708da..77bf4da385 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/ads/HideAdsPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.instagram.ads import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.meta.ads.adInjectorFingerprint +import app.revanced.patches.meta.ads.adInjectorMethod import app.revanced.util.returnEarly @Suppress("unused") @@ -11,6 +11,6 @@ val hideAdsPatch = bytecodePatch( compatibleWith("com.instagram.android") apply { - adInjectorFingerprint.method.returnEarly(false) + adInjectorMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt index dacedb40ed..343bc05d03 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt @@ -1,11 +1,12 @@ package app.revanced.patches.instagram.feed -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val mainFeedRequestClassFingerprint = fingerprint { - strings("Request{mReason=", ", mInstanceNumber=") -} +internal val BytecodePatchContext.mainFeedRequestClassMethod by gettingFirstMutableMethodDeclaratively( + "Request{mReason=", ", mInstanceNumber=" +) -internal val mainFeedHeaderMapFinderFingerprint = fingerprint { - strings("pagination_source", "FEED_REQUEST_SENT") -} +internal val BytecodePatchContext.mainFeedHeaderMapFinderMethod by gettingFirstMutableMethodDeclaratively( + "pagination_source", "FEED_REQUEST_SENT" +) 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 a8c7fcc1ff..b6091f402e 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,5 +1,6 @@ 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.fingerprint @@ -30,11 +31,11 @@ val limitFeedToFollowedProfiles = bytecodePatch( */ val mainFeedRequestHeaderFieldName: String - with(mainFeedHeaderMapFinderFingerprint.method) { + with(mainFeedHeaderMapFinderMethod) { mainFeedRequestHeaderFieldName = indexOfFirstInstructionOrThrow { getReference().let { ref -> ref?.type == "Ljava/util/Map;" && - ref.definingClass == mainFeedRequestClassFingerprint.classDef.toString() + ref.definingClass == mainFeedRequestClassMethod.classDef.toString() } }.let { instructionIndex -> @@ -45,7 +46,7 @@ val limitFeedToFollowedProfiles = bytecodePatch( val initMainFeedRequestFingerprint = fingerprint { custom { method, classDef -> method.name == "" && - classDef == mainFeedRequestClassFingerprint.classDef + classDef == mainFeedRequestClassMethod.classDef } } initMainFeedRequestFingerprint.method.apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/AnonymousStoryViewingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/AnonymousStoryViewingPatch.kt index 394fcc4f4f..1fe029a98a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/AnonymousStoryViewingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/AnonymousStoryViewingPatch.kt @@ -18,6 +18,6 @@ val anonymousStoryViewingPatch = bytecodePatch( apply { // Prevent the hashmap of the seen media to be filled - setMediaSeenHashmapFingerprint.method.returnEarly() + setMediaSeenHashmapMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/Fingerprints.kt index 59cce2aac0..769499d6ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.instagram.ghost.story -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val setMediaSeenHashmapFingerprint = fingerprint { - parameters() - returns("V") - strings("media/seen/") +internal val BytecodePatchContext.setMediaSeenHashmapMethod by gettingFirstMutableMethodDeclaratively("media/seen/") { + parameterTypes() + returnType("V") } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt index b33d5ace54..a371ae5312 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt @@ -1,9 +1,14 @@ package app.revanced.patches.instagram.misc.links -import app.revanced.patcher.fingerprint + +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType internal const val TARGET_STRING = "Tracking.ARG_CLICK_SOURCE" -internal val inAppBrowserFunctionFingerprint = fingerprint { - returns("Z") - strings("TrackingInfo.ARG_MODULE_NAME", TARGET_STRING) +internal val BytecodePatchContext.inAppBrowserFunctionMethod by gettingFirstMutableMethodDeclaratively( + "TrackingInfo.ARG_MODULE_NAME", + TARGET_STRING +) { + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/DisableReelsScrollingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/DisableReelsScrollingPatch.kt index a68b1fb914..6cf89dc0e4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/DisableReelsScrollingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/DisableReelsScrollingPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.instagram.reels +import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @@ -14,12 +15,12 @@ val disableReelsScrollingPatch = bytecodePatch( compatibleWith("com.instagram.android") apply { - val viewPagerField = clipsViewPagerImplGetViewAtIndexFingerprint.classDef.fields.first { + val viewPagerField = clipsViewPagerImplGetViewAtIndexMethod.classDef.fields.first { it.type == "Landroidx/viewpager2/widget/ViewPager2;" } // Disable user input on the ViewPager2 to prevent scrolling. - clipsViewPagerImplGetViewAtIndexFingerprint.method.addInstructions( + clipsViewPagerImplGetViewAtIndexMethod.addInstructions( 0, """ iget-object v0, p0, $viewPagerField @@ -29,6 +30,6 @@ val disableReelsScrollingPatch = bytecodePatch( ) // Return false in onInterceptTouchEvent to disable pull-to-refresh. - clipsSwipeRefreshLayoutOnInterceptTouchEventFingerprint.method.returnEarly(false) + clipsSwipeRefreshLayoutOnInterceptTouchEventMethod.returnEarly(false) } } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/Fingerprints.kt index d0b6b62667..7c4924ecdb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.instagram.reels -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext -internal val clipsViewPagerImplGetViewAtIndexFingerprint = fingerprint { - strings("ClipsViewPagerImpl_getViewAtIndex") -} - -internal val clipsSwipeRefreshLayoutOnInterceptTouchEventFingerprint = fingerprint { - parameters("Landroid/view/MotionEvent;") - custom { _, classDef -> classDef.type == "Linstagram/features/clips/viewer/ui/ClipsSwipeRefreshLayout;" } +internal val BytecodePatchContext.clipsViewPagerImplGetViewAtIndexMethod by gettingFirstMutableMethodDeclaratively("ClipsViewPagerImpl_getViewAtIndex") + +internal val BytecodePatchContext.clipsSwipeRefreshLayoutOnInterceptTouchEventMethod by gettingFirstMutableMethodDeclaratively { + parameterTypes("Landroid/view/MotionEvent;") + definingClass("Linstagram/features/clips/viewer/ui/ClipsSwipeRefreshLayout;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatch.kt index 1e0776b320..59b9fb47db 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatch.kt @@ -12,6 +12,6 @@ val disableStoryAutoFlippingPatch = bytecodePatch( compatibleWith("com.instagram.android") apply { - onStoryTimeoutActionFingerprint.method.returnEarly() + onStoryTimeoutActionMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/Fingerprints.kt index 3562dbde6b..6266ac1abc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/Fingerprints.kt @@ -1,12 +1,13 @@ package app.revanced.patches.instagram.story.flipping -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val onStoryTimeoutActionFingerprint = fingerprint { - parameters("Ljava/lang/Object;") - returns("V") - strings("userSession") - custom { _, classDef -> - classDef.type == "Linstagram/features/stories/fragment/ReelViewerFragment;" - } +internal val BytecodePatchContext.onStoryTimeoutActionMethod by gettingFirstMutableMethodDeclaratively("userSession") { + parameterTypes("Ljava/lang/Object;") + returnType("V") + definingClass("Linstagram/features/stories/fragment/ReelViewerFragment;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt index 80a9d43c78..69ce771110 100644 --- a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt @@ -1,10 +1,12 @@ package app.revanced.patches.irplus.ad +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val irplusAdsFingerprint = fingerprint { +internal val BytecodePatchContext.irplusAdsMethod by gettingFirstMutableMethodDeclaratively("TAGGED") { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L", "Z") - strings("TAGGED") + parameterTypes("L", "Z") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/RemoveAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/RemoveAdsPatch.kt index c4bc43fbe3..9a5c9e9403 100644 --- a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/RemoveAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/RemoveAdsPatch.kt @@ -12,6 +12,6 @@ val removeAdsPatch = bytecodePatch( apply { // By overwriting the second parameter of the method, // the view which holds the advertisement is removed. - irplusAdsFingerprint.method.addInstruction(0, "const/4 p2, 0x0") + irplusAdsMethod.addInstruction(0, "const/4 p2, 0x0") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/Fingerprints.kt index 423c262846..4ca73f740c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/Fingerprints.kt @@ -1,29 +1,29 @@ package app.revanced.patches.letterboxd.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext internal const val admobHelperClassName = "Lcom/letterboxd/letterboxd/helpers/AdmobHelper;" -internal val admobHelperSetShowAdsFingerprint = fingerprint { - custom { method, classDef -> - method.name == "setShowAds" && classDef.type == admobHelperClassName - } +internal val BytecodePatchContext.admobHelperSetShowAdsMethod by gettingFirstMutableMethodDeclaratively { + name("setShowAds") + definingClass(admobHelperClassName) } -internal val admobHelperShouldShowAdsFingerprint = fingerprint { - custom { method, classDef -> - method.name == "shouldShowAds" && classDef.type == admobHelperClassName - } +internal val BytecodePatchContext.admobHelperShouldShowAdsMethod by gettingFirstMutableMethodDeclaratively { + name("shouldShowAds") + definingClass(admobHelperClassName) } -internal val filmFragmentShowAdsFingerprint = fingerprint { - custom { method, classDef -> - method.name == "showAds" && classDef.type.endsWith("/FilmFragment;") - } +internal val BytecodePatchContext.filmFragmentShowAdsMethod by gettingFirstMutableMethodDeclaratively { + name("showAds") + definingClass("/FilmFragment;"::endsWith) + } -internal val memberExtensionShowAdsFingerprint = fingerprint { - custom { method, classDef -> - method.name == "showAds" && classDef.type.endsWith("/AMemberExtensionKt;") - } -} \ No newline at end of file +internal val BytecodePatchContext.memberExtensionShowAdsMethod by gettingFirstMutableMethodDeclaratively { + name("showAds") + definingClass("/AMemberExtensionKt;"::endsWith) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/HideAdsPatch.kt index c670e8565e..35f450acf9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/HideAdsPatch.kt @@ -1,7 +1,6 @@ - package app.revanced.patches.letterboxd.ads -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @@ -12,9 +11,9 @@ val hideAdsPatch = bytecodePatch( compatibleWith("com.letterboxd.letterboxd") apply { - admobHelperSetShowAdsFingerprint.method.addInstruction(0, "const p1, 0x0") - listOf(admobHelperShouldShowAdsFingerprint, filmFragmentShowAdsFingerprint, memberExtensionShowAdsFingerprint).forEach { - it.method.returnEarly(false) + admobHelperSetShowAdsMethod.addInstruction(0, "const p1, 0x0") + listOf(admobHelperShouldShowAdsMethod, filmFragmentShowAdsMethod, memberExtensionShowAdsMethod).forEach { + it.returnEarly(false) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/Fingerprints.kt index 1b549cd573..3e7d389fd6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.letterboxd.unlock.unlockAppIcons -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val getCanChangeAppIconFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getCanChangeAppIcon" && classDef.type.endsWith("SettingsAppIconFragment;") - } +internal val BytecodePatchContext.getCanChangeAppIconMethod by gettingFirstMutableMethodDeclaratively { + name("getCanChangeAppIcon") + definingClass("SettingsAppIconFragment;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/UnlockAppIconsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/UnlockAppIconsPatch.kt index ca8d7ac558..eb2d4f40f7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/UnlockAppIconsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/UnlockAppIconsPatch.kt @@ -10,6 +10,6 @@ val unlockAppIconsPatch = bytecodePatch( compatibleWith("com.letterboxd.letterboxd") apply { - getCanChangeAppIconFingerprint.method.returnEarly(true) + getCanChangeAppIconMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/DisableVersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/DisableVersionCheckPatch.kt index 038d2a35a8..ad1e0f269f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/DisableVersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/DisableVersionCheckPatch.kt @@ -1,8 +1,7 @@ package app.revanced.patches.lightroom.misc.version -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patches.lightroom.misc.bypassVersionCheck.refreshRemoteConfigurationMethod @Suppress("unused") val disableVersionCheckPatch = bytecodePatch( @@ -12,8 +11,8 @@ val disableVersionCheckPatch = bytecodePatch( compatibleWith("com.adobe.lrmobile"("9.3.0")) apply { - refreshRemoteConfigurationFingerprint.method.apply { - val igetIndex = refreshRemoteConfigurationFingerprint.patternMatch!!.endIndex + refreshRemoteConfigurationMethod.apply { + val igetIndex = refreshRemoteConfigurationMethod.patternMatch!!.endIndex // TODO // This value represents the server command to clear all version restrictions. val statusForceReset = "-0x2"; diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/Fingerprints.kt index 67900c31ea..59573fb7e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/Fingerprints.kt @@ -1,15 +1,17 @@ -package app.revanced.patches.lightroom.misc.version +package app.revanced.patches.lightroom.misc.bypassVersionCheck -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val refreshRemoteConfigurationFingerprint = fingerprint { +internal val BytecodePatchContext.refreshRemoteConfigurationMethod by gettingFirstMutableMethodDeclaratively( + "com.adobe.lrmobile.denylisted_version_set_key", + "com.adobe.lrmobile.app_min_version_key" +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - strings( - "com.adobe.lrmobile.denylisted_version_set_key", - "com.adobe.lrmobile.app_min_version_key" - ) opcodes( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatch.kt index b6c52ce9d3..be4b51152f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatch.kt @@ -10,7 +10,7 @@ val disableMandatoryLoginPatch = bytecodePatch( compatibleWith("com.adobe.lrmobile"("9.3.0")) apply { - isLoggedInFingerprint.method.apply { + isLoggedInMethod.apply { val index = implementation!!.instructions.lastIndex - 1 // Set isLoggedIn = true. replaceInstruction(index, "const/4 v0, 0x1") diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt index 6345541e14..e496d80470 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt @@ -1,12 +1,16 @@ package app.revanced.patches.lightroom.misc.login -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val isLoggedInFingerprint = fingerprint { +internal val BytecodePatchContext.isLoggedInMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) - returns("Z") + returnType("Z") opcodes( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt index 5a00dc68c1..433e7a12be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt @@ -1,17 +1,20 @@ package app.revanced.patches.lightroom.misc.premium -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val hasPurchasedFingerprint = fingerprint { +internal val BytecodePatchContext.hasPurchasedMethod by gettingFirstMutableMethodDeclaratively("isPurchaseDoneRecently = true, access platform profile present? = ") { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("Z") + returnType("Z") opcodes( Opcode.SGET_OBJECT, Opcode.CONST_4, Opcode.CONST_4, Opcode.CONST_4, ) - strings("isPurchaseDoneRecently = true, access platform profile present? = ") } diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt index 53525cf3ff..66735ef924 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt @@ -11,6 +11,6 @@ val unlockPremiumPatch = bytecodePatch( apply { // Set hasPremium = true. - hasPurchasedFingerprint.method.replaceInstruction(2, "const/4 v2, 0x1") + hasPurchasedMethod.replaceInstruction(2, "const/4 v2, 0x1") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt index 0dfbf5cdab..d567ca8986 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.memegenerator.detection.license -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val licenseValidationFingerprint = fingerprint { +internal val BytecodePatchContext.licenseValidationMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("Landroid/content/Context;") + returnType("Z") + parameterTypes("Landroid/content/Context;") opcodes( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_WIDE, diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/LicenseValidationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/LicenseValidationPatch.kt index 02955f903a..e1f0897ba0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/LicenseValidationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/LicenseValidationPatch.kt @@ -8,7 +8,7 @@ val licenseValidationPatch = bytecodePatch( ) { apply { - licenseValidationFingerprint.method.replaceInstructions( + licenseValidationMethod.replaceInstructions( 0, """ const/4 p0, 0x1 diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt index 40f105525c..9d2cceb1a3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.memegenerator.detection.signature -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val verifySignatureFingerprint = fingerprint { +internal val BytecodePatchContext.verifySignatureMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("Landroid/app/Activity;") + returnType("Z") + parameterTypes("Landroid/app/Activity;") opcodes( Opcode.SGET_OBJECT, Opcode.IF_NEZ, diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatch.kt index 94e1029a37..523a0ae650 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatch.kt @@ -8,7 +8,7 @@ val signatureVerificationPatch = bytecodePatch( ) { apply { - verifySignatureFingerprint.method.replaceInstructions( + verifySignatureMethod.replaceInstructions( 0, """ const/4 p0, 0x1 diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt index 1f16bb10ec..bae00cb613 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.memegenerator.misc.pro -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val isFreeVersionFingerprint = fingerprint { +internal val BytecodePatchContext.isFreeVersionMethod by gettingFirstMutableMethodDeclaratively("free") { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/Boolean;") - parameters("Landroid/content/Context;") + returnType("Ljava/lang/Boolean;") + parameterTypes("Landroid/content/Context;") opcodes( Opcode.SGET, Opcode.INVOKE_VIRTUAL, @@ -17,5 +18,4 @@ internal val isFreeVersionFingerprint = fingerprint { Opcode.MOVE_RESULT, Opcode.IF_EQZ ) - strings("free") } diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/UnlockProVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/UnlockProVersionPatch.kt index b087ffcc8a..c40b386d72 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/UnlockProVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/UnlockProVersionPatch.kt @@ -14,7 +14,7 @@ val unlockProVersionPatch = bytecodePatch( compatibleWith("com.zombodroid.MemeGenerator"("4.6364", "4.6370", "4.6375", "4.6377")) apply { - isFreeVersionFingerprint.method.replaceInstructions( + isFreeVersionMethod.replaceInstructions( 0, """ sget-object p0, Ljava/lang/Boolean;->FALSE:Ljava/lang/Boolean; diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt index 185c88f94c..643e179216 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt @@ -1,35 +1,35 @@ package app.revanced.patches.messenger.inbox -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue -internal val createInboxSubTabsFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.createInboxSubTabsMethod by gettingFirstMutableMethodDeclaratively { + name("run") + returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) opcodes( Opcode.CONST_4, Opcode.INVOKE_VIRTUAL, Opcode.RETURN_VOID, ) - custom { method, classDef -> - method.name == "run" && - classDef.fields.any any@{ field -> - if (field.name != "__redex_internal_original_name") return@any false - (field.initialValue as? StringEncodedValue)?.value == "InboxSubtabsItemSupplierImplementation\$onSubscribe\$1" - } + custom { + immutableClassDef.fields.any { field -> + if (field.name != "__redex_internal_original_name") return@any false + (field.initialValue as? StringEncodedValue)?.value == "InboxSubtabsItemSupplierImplementation\$onSubscribe\$1" + } } } -internal val loadInboxAdsFingerprint = fingerprint { - returns("V") - strings( - "ads_load_begin", - "inbox_ads_fetch_start", +internal val BytecodePatchContext.loadInboxAdsMethod by gettingFirstMutableMethodDeclaratively( + "ads_load_begin", + "inbox_ads_fetch_start" +) { + returnType("V") + definingClass( + "Lcom/facebook/messaging/business/inboxads/plugins/inboxads/itemsupplier/" + + "InboxAdsItemSupplierImplementation;" ) - custom { method, _ -> - method.definingClass == "Lcom/facebook/messaging/business/inboxads/plugins/inboxads/itemsupplier/" + - "InboxAdsItemSupplierImplementation;" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxAdsPatch.kt index 3150dabded..dd9994ae70 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxAdsPatch.kt @@ -11,6 +11,6 @@ val hideInboxAdsPatch = bytecodePatch( compatibleWith("com.facebook.orca") apply { - loadInboxAdsFingerprint.method.replaceInstruction(0, "return-void") + loadInboxAdsMethod.replaceInstruction(0, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxSubtabsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxSubtabsPatch.kt index a9f915f69e..cca30b51b1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxSubtabsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxSubtabsPatch.kt @@ -11,6 +11,6 @@ val hideInboxSubtabsPatch = bytecodePatch( compatibleWith("com.facebook.orca") apply { - createInboxSubTabsFingerprint.method.replaceInstruction(2, "const/4 v0, 0x0") + createInboxSubTabsMethod.replaceInstruction(2, "const/4 v0, 0x0") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt index 2abc12367c..59fc826f48 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.messenger.layout -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val isFacebookButtonEnabledFingerprint = fingerprint { - parameters() - returns("Z") - strings("FacebookButtonTabButtonImplementation") +internal val BytecodePatchContext.isFacebookButtonEnabledMethod by gettingFirstMutableMethodDeclaratively("FacebookButtonTabButtonImplementation") { + parameterTypes() + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/HideFacebookButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/HideFacebookButtonPatch.kt index 08a56b9646..7d65205f9c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/HideFacebookButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/HideFacebookButtonPatch.kt @@ -11,6 +11,6 @@ val hideFacebookButtonPatch = bytecodePatch( compatibleWith("com.facebook.orca") apply { - isFacebookButtonEnabledFingerprint.method.returnEarly(false) + isFacebookButtonEnabledMethod.returnEarly(false) } } 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 9300efb5cd..d063fbf2a6 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,25 +1,20 @@ package app.revanced.patches.messenger.metaai +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -import app.revanced.patcher.fingerprint -internal val getMobileConfigBoolFingerprint = fingerprint { - parameters("J") - returns("Z") +internal val BytecodePatchContext.getMobileConfigBoolMethod by gettingFirstMutableMethodDeclaratively { + returnType("Z") opcodes(Opcode.RETURN) - custom { _, classDef -> - classDef.interfaces.contains("Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;") - } + custom { immutableClassDef.interfaces.contains("Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;") } } -internal val metaAIKillSwitchCheckFingerprint = fingerprint { +internal val BytecodePatchContext.metaAIKillSwitchCheckMethod by gettingFirstMutableMethodDeclaratively("SearchAiagentImplementationsKillSwitch") { opcodes(Opcode.CONST_WIDE) - strings("SearchAiagentImplementationsKillSwitch") -} -internal val extensionMethodFingerprint = fingerprint { - strings("REPLACED_BY_PATCH") - custom { method, classDef -> - method.name == EXTENSION_METHOD_NAME && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } +} +internal val BytecodePatchContext.extensionMethodMethod by gettingFirstMutableMethodDeclaratively("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 26471260aa..eb784acc94 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,6 +3,7 @@ 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.bytecodePatch import app.revanced.patches.messenger.misc.extension.sharedExtensionPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -21,8 +22,8 @@ val removeMetaAIPatch = bytecodePatch( dependsOn(sharedExtensionPatch) apply { - getMobileConfigBoolFingerprint.method.apply { - val returnIndex = getMobileConfigBoolFingerprint.patternMatch.startIndex + getMobileConfigBoolMethod.apply { + val returnIndex = getMobileConfigBoolMethod.patternMatch.startIndex // TODO val returnRegister = getInstruction(returnIndex).registerA addInstructions( @@ -35,18 +36,16 @@ val removeMetaAIPatch = bytecodePatch( } // 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 + val relevantDigits = with(metaAIKillSwitchCheckMethod) { + method.getInstruction(patternMatch.startIndex).wideLiteral // TODO }.toString().substring(0, 7) // Replace placeholder in the extension method. - with(extensionMethodFingerprint) { - method.replaceInstruction( - stringMatches.first().index, - """ + extensionMethodMethod.replaceInstruction( + stringM.first().index, // TODO + """ const-string v1, "$relevantDigits" """ - ) - } + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt index 95d3359a92..75e0380b7c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt @@ -1,13 +1,16 @@ package app.revanced.patches.meta.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val adInjectorFingerprint = fingerprint { +internal val BytecodePatchContext.adInjectorMethod by gettingFirstMutableMethodDeclaratively( + "SponsoredContentController.insertItem", +) { accessFlags(AccessFlags.PRIVATE) - returns("Z") - parameters("L", "L") - strings( - "SponsoredContentController.insertItem", - ) + returnType("Z") + parameterTypes("L", "L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt index 14105f762a..fac001fad3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.mifitness.misc.locale -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val syncBluetoothLanguageFingerprint = fingerprint { +internal val BytecodePatchContext.syncBluetoothLanguageMethod by gettingFirstMutableMethodDeclaratively { + name("syncBluetoothLanguage") + definingClass("Lcom/xiaomi/fitness/devicesettings/DeviceSettingsSyncer") opcodes(Opcode.MOVE_RESULT_OBJECT) - custom { method, _ -> - method.name == "syncBluetoothLanguage" && - method.definingClass == "Lcom/xiaomi/fitness/devicesettings/DeviceSettingsSyncer;" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt index 01939aa162..36bd653144 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt @@ -16,8 +16,8 @@ val forceEnglishLocalePatch = bytecodePatch( dependsOn(fixLoginPatch) apply { - syncBluetoothLanguageFingerprint.method.apply { - val resolvePhoneLocaleInstruction = syncBluetoothLanguageFingerprint.instructionMatches.first().index + syncBluetoothLanguageMethod.apply { + val resolvePhoneLocaleInstruction = syncBluetoothLanguageMethod.instructionMatches.first().index // TODO val registerIndexToUpdate = getInstruction(resolvePhoneLocaleInstruction).registerA replaceInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt index e3eee24991..d43f685cdd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.mifitness.misc.login -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val xiaomiAccountManagerConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.xiaomiAccountManagerConstructorMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) - parameters("Landroid/content/Context;", "Z") - custom { method, _ -> - method.definingClass == "Lcom/xiaomi/passport/accountmanager/XiaomiAccountManager;" - } + parameterTypes("Landroid/content/Context;", "Z") + definingClass("Lcom/xiaomi/passport/accountmanager/XiaomiAccountManager;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/FixLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/FixLoginPatch.kt index 7567aba65d..27e7e5f176 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/FixLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/FixLoginPatch.kt @@ -10,6 +10,6 @@ val fixLoginPatch = bytecodePatch( compatibleWith("com.xiaomi.wearable") apply { - xiaomiAccountManagerConstructorFingerprint.method.addInstruction(0, "const/16 p2, 0x0") + xiaomiAccountManagerConstructorMethod.addInstruction(0, "const/16 p2, 0x0") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt index 13820d29d8..759d0f0f91 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.music.interaction.permanentrepeat -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val repeatTrackFingerprint = fingerprint { +internal val BytecodePatchContext.repeatTrackMethod by gettingFirstMutableMethodDeclaratively("w_st") { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L") + returnType("V") + parameterTypes("L", "L") opcodes( Opcode.IGET_OBJECT, Opcode.IGET_OBJECT, @@ -16,5 +17,4 @@ internal val repeatTrackFingerprint = fingerprint { Opcode.MOVE_RESULT, Opcode.IF_NEZ ) - strings("w_st") } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt index 20b43ff299..bdcd2d3abf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.music.interaction.permanentrepeat +import app.revanced.patcher.extensions.ExternalLabel import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.extensions.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch @@ -39,10 +39,10 @@ val permanentRepeatPatch = bytecodePatch( SwitchPreference("revanced_music_play_permanent_repeat"), ) - val startIndex = repeatTrackFingerprint.instructionMatches.last().index + val startIndex = repeatTrackMethod.instructionMatches.last().index // TODO val repeatIndex = startIndex + 1 - repeatTrackFingerprint.method.apply { + repeatTrackMethod.apply { // Start index is at a branch, but the same // register is clobbered in both branch paths. val freeRegister = findFreeRegister(startIndex + 1) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt index 4f3b963fa4..8020dc8f10 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt @@ -32,7 +32,7 @@ private val disableSplashAnimationPatch = bytecodePatch { // Could replace the lottie animation file with our own custom animation (app_launch.json), // but the animation is not always the same size as the launch screen and it's still // barely shown. Instead turn off the animation entirely (app will also launch a little faster). - cairoSplashAnimationConfigFingerprint.method.apply { + cairoSplashAnimationConfigMethod.apply { val literalIndex = indexOfFirstLiteralInstructionOrThrow( getResourceId(ResourceType.LAYOUT, "main_activity_launch_animation") ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt index 5445e19b17..e11767321e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt @@ -1,17 +1,17 @@ package app.revanced.patches.music.layout.branding -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceLiteral -internal val cairoSplashAnimationConfigFingerprint = fingerprint { - returns("V") - parameters("Landroid/os/Bundle;") +internal val BytecodePatchContext.cairoSplashAnimationConfigMethod by gettingFirstMutableMethodDeclaratively { + name("onCreate") + returnType("V") + definingClass(YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE) + parameterTypes("Landroid/os/Bundle;") instructions( resourceLiteral(ResourceType.LAYOUT, "main_activity_launch_animation") ) - custom { method, classDef -> - method.name == "onCreate" && method.definingClass == YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt index 29558ab4be..40673bebbf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt @@ -1,24 +1,27 @@ package app.revanced.patches.music.layout.premium -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideGetPremiumFingerprint = fingerprint { +internal val BytecodePatchContext.hideGetPremiumMethod by gettingFirstMutableMethodDeclaratively( + "FEmusic_history", + "FEmusic_offline" +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() + returnType("V") + parameterTypes() opcodes( Opcode.IF_NEZ, Opcode.CONST_16, Opcode.INVOKE_VIRTUAL, ) - strings("FEmusic_history", "FEmusic_offline") } -internal val membershipSettingsFingerprint = fingerprint { +internal val BytecodePatchContext.membershipSettingsMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/CharSequence;") + returnType("Ljava/lang/CharSequence;") opcodes( Opcode.IGET_OBJECT, Opcode.INVOKE_INTERFACE, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt index 6f4c7d9408..4282b6591e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt @@ -40,8 +40,8 @@ val hideGetPremiumPatch = bytecodePatch( SwitchPreference("revanced_music_hide_get_premium_label"), ) - hideGetPremiumFingerprint.method.apply { - val insertIndex = hideGetPremiumFingerprint.instructionMatches.last().index + hideGetPremiumMethod.apply { + val insertIndex = hideGetPremiumMethod.instructionMatches.last().index // TODO val setVisibilityInstruction = getInstruction(insertIndex) val getPremiumViewRegister = setVisibilityInstruction.registerC @@ -55,11 +55,11 @@ val hideGetPremiumPatch = bytecodePatch( addInstruction( insertIndex + 1, "invoke-virtual {v$getPremiumViewRegister, v$visibilityRegister}, " + - "Landroid/view/View;->setVisibility(I)V", + "Landroid/view/View;->setVisibility(I)V", ) } - membershipSettingsFingerprint.method.addInstructionsWithLabels( + membershipSettingsMethod.addInstructionsWithLabels( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->hideGetPremiumLabel()Z diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt index 923be9207f..0c231653b3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt @@ -23,6 +23,6 @@ val bypassCertificateChecksPatch = bytecodePatch( ) apply { - checkCertificateFingerprint.method.returnEarly(true) + checkCertificateMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt index 97dea56502..0301168ab6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.music.misc.androidauto -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val checkCertificateFingerprint = fingerprint { - returns("Z") - parameters("Ljava/lang/String;") - strings( - "X509", - "Failed to get certificate" // Partial String match. - ) +internal val BytecodePatchContext.checkCertificateMethod by gettingFirstMutableMethodDeclaratively( + "X509", + "Failed to get certificate" // Partial String match. +) { + returnType("Z") + parameterTypes("Ljava/lang/String;") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt index 50514790eb..2c8d39601b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt @@ -23,11 +23,11 @@ val backgroundPlaybackPatch = bytecodePatch( ) apply { - kidsBackgroundPlaybackPolicyControllerFingerprint.method.addInstruction( + kidsBackgroundPlaybackPolicyControllerMethod.addInstruction( 0, "return-void", ) - backgroundPlaybackDisableFingerprint.method.returnEarly(true) + backgroundPlaybackDisableMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt index e1cf24e1a2..75ed5193b0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.music.misc.backgroundplayback -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val backgroundPlaybackDisableFingerprint = fingerprint { +internal val BytecodePatchContext.backgroundPlaybackDisableMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("L") + returnType("Z") + parameterTypes("L") opcodes( Opcode.CONST_4, Opcode.IF_EQZ, @@ -21,10 +22,10 @@ internal val backgroundPlaybackDisableFingerprint = fingerprint { ) } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("I", "L", "Z") +internal val BytecodePatchContext.kidsBackgroundPlaybackPolicyControllerMethod by gettingFirstMutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returnType("V") + parameterTypes("I", "L", "Z") opcodes( Opcode.IGET, Opcode.IF_NE, @@ -39,4 +40,4 @@ internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { Opcode.IF_NE, Opcode.IPUT_BOOLEAN, ) -} +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt index ac388a11a5..9c36f4afa3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt @@ -3,7 +3,6 @@ package app.revanced.patches.music.misc.fileprovider import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName -import app.revanced.patches.music.utils.fix.fileprovider.fileProviderResolverFingerprint internal fun fileProviderPatch( youtubePackageName: String, @@ -22,7 +21,7 @@ internal fun fileProviderPatch( // https://github.com/ReVanced/revanced-patches/issues/55 // // To solve this issue, replace the package name of YouTube with YT Music's package name. - fileProviderResolverFingerprint.method.addInstructionsWithLabels( + fileProviderResolverMethod.addInstructionsWithLabels( 0, """ const-string v0, "com.google.android.youtube.fileprovider" diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt index 16a2d6a58f..73f2ff5fd3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt @@ -1,11 +1,12 @@ -package app.revanced.patches.music.utils.fix.fileprovider +package app.revanced.patches.music.misc.fileprovider -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val fileProviderResolverFingerprint = fingerprint { - returns("L") - strings( - "android.support.FILE_PROVIDER_PATHS", - "Name must not be empty" - ) +internal val BytecodePatchContext.fileProviderResolverMethod by gettingFirstMutableMethodDeclaratively( + "android.support.FILE_PROVIDER_PATHS", + "Name must not be empty" +) { + returnType("L") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt index 8c2d579ef5..979c87fb83 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt @@ -1,11 +1,17 @@ package app.revanced.patches.piccomafr.misc +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val getAndroidIdFingerprint = fingerprint { +internal val BytecodePatchContext.getAndroidIdMethod by gettingFirstMutableMethodDeclaratively( + "context", + "android_id" +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters("Landroid/content/Context;") - strings("context", "android_id") -} \ No newline at end of file + returnType("Ljava/lang/String;") + parameterTypes("Landroid/content/Context;") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatch.kt index cddc398d4c..8137b1d96e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatch.kt @@ -38,6 +38,6 @@ val spoofAndroidDeviceIdPatch = bytecodePatch( ) { it!!.matches("[A-Fa-f0-9]{16}".toRegex()) } apply { - getAndroidIdFingerprint.method.returnEarly(androidDeviceId!!) + getAndroidIdMethod.returnEarly(androidDeviceId!!) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/Fingerprints.kt index 639141723d..5e5902dd74 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/Fingerprints.kt @@ -1,11 +1,12 @@ package app.revanced.patches.protonvpn.splittunneling -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val enableSplitTunnelingUiFingerprint = fingerprint { - strings("currentModeAppNames") +internal val BytecodePatchContext.enableSplitTunnelingUiMethod by gettingFirstMutableMethodDeclaratively("currentModeAppNames") { opcodes( Opcode.MOVE_OBJECT, Opcode.MOVE_FROM16, @@ -13,8 +14,6 @@ internal val enableSplitTunnelingUiFingerprint = fingerprint { ) } -internal val initializeSplitTunnelingSettingsUIFingerprint = fingerprint { - custom { method, _ -> - method.name == "applyRestrictions" - } +internal val BytecodePatchContext.initializeSplitTunnelingSettingsUIMethod by gettingFirstMutableMethodDeclaratively { + name("applyRestrictions") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunneling.kt b/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunneling.kt index 35bac4c70a..6611cad90f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunneling.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunneling.kt @@ -17,14 +17,14 @@ val unlockSplitTunnelingPatch = compatibleWith("ch.protonvpn.android") apply { - val registerIndex = enableSplitTunnelingUiFingerprint.patternMatch!!.endIndex - 1 + val registerIndex = enableSplitTunnelingUiMethod.patternMatch!!.endIndex - 1 // TODO - enableSplitTunnelingUiFingerprint.method.apply { + enableSplitTunnelingUiMethod.apply { val register = getInstruction(registerIndex).registerA replaceInstruction(registerIndex, "const/4 v$register, 0x0") } - initializeSplitTunnelingSettingsUIFingerprint.method.apply { + initializeSplitTunnelingSettingsUIMethod.apply { val initSettingsIndex = indexOfFirstInstructionOrThrow { getReference()?.name == "getSplitTunneling" } diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt index 41990ae7ce..f77e7937f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt @@ -1,12 +1,13 @@ package app.revanced.patches.samsung.radio.misc.fix.crash -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val permissionRequestListFingerprint = fingerprint { - strings( - "android.permission.POST_NOTIFICATIONS", - "android.permission.READ_MEDIA_AUDIO", - "android.permission.RECORD_AUDIO" - ) - custom { method, _ -> method.name == "" } +internal val BytecodePatchContext.permissionRequestListMethod by gettingFirstMutableMethodDeclaratively( + "android.permission.POST_NOTIFICATIONS", + "android.permission.READ_MEDIA_AUDIO", + "android.permission.RECORD_AUDIO" +) { + name("") } diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt index 38ffc80cdb..5abfeedb41 100644 --- a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt @@ -21,7 +21,7 @@ val fixCrashPatch = bytecodePatch( compatibleWith("com.sec.android.app.fm"("12.4.00.7", "12.3.00.13", "12.3.00.11")) apply { - permissionRequestListFingerprint.method.apply { + permissionRequestListMethod.apply { findInstructionIndicesReversedOrThrow(Opcode.FILLED_NEW_ARRAY).forEach { filledNewArrayIndex -> val moveResultIndex = indexOfFirstInstruction(filledNewArrayIndex, Opcode.MOVE_RESULT_OBJECT) if (moveResultIndex < 0) return@forEach // No move-result-object found after the filled-new-array diff --git a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt index f7efe3103f..db7840a8ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.serviceportalbund.detection.root +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val rootDetectionFingerprint = fingerprint { +internal val BytecodePatchContext.rootDetectionMethod by gettingFirstMutableMethodDeclaratively { + definingClass("/DeviceIntegrityCheck;"::endsWith) accessFlags(AccessFlags.PUBLIC) - returns("V") - custom { _, classDef -> - classDef.endsWith("/DeviceIntegrityCheck;") - } -} \ No newline at end of file + returnType("V") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt index 62d1bb81b6..07be634ae6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt @@ -10,6 +10,6 @@ val `Remove root detection` by creatingBytecodePatch( compatibleWith("at.gv.bka.serviceportal") apply { - rootDetectionFingerprint.method.addInstruction(0, "return-void") + rootDetectionMethod.addInstruction(0, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt index 0e81d7e592..8418844fdf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt @@ -1,15 +1,18 @@ package app.revanced.patches.solidexplorer2.functionality.filesize -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val onReadyFingerprint = fingerprint { +internal val BytecodePatchContext.onReadyMethod by gettingFirstMutableMethodDeclaratively { + name("onReady") + definingClass("Lpl/solidexplorer/plugins/texteditor/TextEditor;") opcodes( Opcode.CONST_WIDE_32, // Constant storing the 2MB limit Opcode.CMP_LONG, Opcode.IF_LEZ, ) - custom { method, _ -> - method.name == "onReady" && method.definingClass == "Lpl/solidexplorer/plugins/texteditor/TextEditor;" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt index f9d0901b45..778e2f0712 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt @@ -13,8 +13,8 @@ val removeFileSizeLimitPatch = bytecodePatch( compatibleWith("pl.solidexplorer2") apply { - onReadyFingerprint.method.apply { - val cmpIndex = onReadyFingerprint.instructionMatches.first().index + 1 + onReadyMethod.apply { + val cmpIndex = onReadyMethod.instructionMatches.first().index + 1 // TODO val cmpResultRegister = getInstruction(cmpIndex).registerA replaceInstruction(cmpIndex, "const/4 v$cmpResultRegister, 0x0") diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt index 827a48baaf..aca1c656a0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt @@ -1,24 +1,24 @@ package app.revanced.patches.soundcloud.ad -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val interceptFingerprint = fingerprint { +internal val BytecodePatchContext.interceptFingerprint by gettingFirstMutableMethodDeclaratively("SC-Mob-UserPlan", "Configuration") { accessFlags(AccessFlags.PUBLIC) - returns("L") - parameters("L") + returnType("L") + parameterTypes("L") opcodes( Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_INTERFACE, Opcode.MOVE_RESULT_OBJECT ) - strings("SC-Mob-UserPlan", "Configuration") } -internal val userConsumerPlanConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.userConsumerPlanConstructorMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters( + parameterTypes( "Ljava/lang/String;", "Z", "Ljava/lang/String;", diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt index 400ff24bff..a28d432dd0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt @@ -1,12 +1,8 @@ package app.revanced.patches.soundcloud.ad -import app.revanced.patcher.extensions.addInstruction -import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.extensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.extensions.ExternalLabel -import app.revanced.patches.soundcloud.shared.featureConstructorFingerprint +import app.revanced.patches.soundcloud.shared.featureConstructorMethod @Suppress("unused") val hideAdsPatch = bytecodePatch( @@ -19,7 +15,7 @@ val hideAdsPatch = bytecodePatch( // This method is the constructor of a class representing a "Feature" object parsed from JSON data. // p1 is the name of the feature. // p2 is true if the feature is enabled, false otherwise. - featureConstructorFingerprint.method.apply { + featureConstructorMethod.apply { val afterCheckNotNullIndex = 2 addInstructionsWithLabels( afterCheckNotNullIndex, @@ -41,7 +37,7 @@ val hideAdsPatch = bytecodePatch( // p4 is the "consumerPlanUpsells" value, a list of plans to try to sell to the user. // p5 is the "currentConsumerPlan" value, the type of plan currently subscribed to. // p6 is the "currentConsumerPlanTitle" value, the name of the plan currently subscribed to, shown to the user. - userConsumerPlanConstructorFingerprint.method.addInstructions( + userConsumerPlanConstructorMethod.addInstructions( 0, """ const-string p1, "high_tier" @@ -54,8 +50,8 @@ val hideAdsPatch = bytecodePatch( // Prevent verification of an HTTP header containing the user's current plan, which would contradict the previous patch. - val conditionIndex = interceptFingerprint.instructionMatches.last().index + 1 - interceptFingerprint.method.addInstruction( + val conditionIndex = interceptFingerprint.instructionMatches.last().index + 1 // TODO + interceptFingerprint.addInstruction( conditionIndex, "return-object p1", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/DisableTelemetryPatch.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/DisableTelemetryPatch.kt index 2f83a33470..b49837d6c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/DisableTelemetryPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/DisableTelemetryPatch.kt @@ -12,6 +12,6 @@ val disableTelemetryPatch = bytecodePatch( apply { // Empty the "backend" argument to abort the initializer. - createTrackingApiFingerprint.method.addInstruction(0, "const-string p1, \"\"") + createTrackingApiMethod.addInstruction(0, "const-string p1, \"\"") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt index 2954b4d99c..9ccf55606c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt @@ -1,13 +1,17 @@ package app.revanced.patches.soundcloud.analytics -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val createTrackingApiFingerprint = fingerprint { +internal val BytecodePatchContext.createTrackingApiMethod by gettingFirstMutableMethodDeclaratively( + "backend", + "boogaloo" +) { + name("create") accessFlags(AccessFlags.PUBLIC) - returns("L") - custom { methodDef, _ -> - methodDef.name == "create" - } - strings("backend", "boogaloo") + returnType("L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch.kt index 5ec725a643..634a3c7da8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch.kt @@ -1,13 +1,8 @@ package app.revanced.patches.soundcloud.offlinesync -import app.revanced.patcher.extensions.addInstruction -import app.revanced.patcher.extensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.getInstruction -import app.revanced.patcher.extensions.instructions -import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.extensions.ExternalLabel -import app.revanced.patches.soundcloud.shared.featureConstructorFingerprint +import app.revanced.patches.soundcloud.shared.featureConstructorMethod import app.revanced.util.getReference import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -24,7 +19,7 @@ val enableOfflineSync = bytecodePatch( // This method is the constructor of a class representing a "Feature" object parsed from JSON data. // p1 is the name of the feature. // p2 is true if the feature is enabled, false otherwise. - featureConstructorFingerprint.method.apply { + featureConstructorMethod.apply { val afterCheckNotNullIndex = 2 addInstructionsWithLabels( @@ -42,7 +37,7 @@ val enableOfflineSync = bytecodePatch( // Patch the URL builder to use the HTTPS_STREAM endpoint // instead of the offline sync endpoint to downloading the track. - downloadOperationsURLBuilderFingerprint.method.apply { + downloadOperationsURLBuilderFingerprint.apply { val getEndpointsEnumFieldIndex = 1 val getEndpointsEnumFieldInstruction = getInstruction(getEndpointsEnumFieldIndex) @@ -58,7 +53,7 @@ val enableOfflineSync = bytecodePatch( // The HTTPS_STREAM endpoint does not return the necessary headers for offline sync. // Mock the headers to prevent the app from crashing by setting them to empty strings. // The headers are all cosmetic and do not affect the functionality of the app. - downloadOperationsHeaderVerificationFingerprint.method.apply { + downloadOperationsHeaderVerificationFingerprint.apply { // The first three null checks need to be patched. instructions.asSequence().filter { it.opcode == Opcode.IF_EQZ diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt index 688fe36044..367c0b1a37 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.soundcloud.offlinesync -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val downloadOperationsURLBuilderFingerprint = fingerprint { +internal val BytecodePatchContext.downloadOperationsURLBuilderFingerprint by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String") - parameters("L", "L") + returnType("Ljava/lang/String") + parameterTypes("L", "L") opcodes( Opcode.IGET_OBJECT, Opcode.SGET_OBJECT, @@ -15,15 +16,18 @@ internal val downloadOperationsURLBuilderFingerprint = fingerprint { ) } -internal val downloadOperationsHeaderVerificationFingerprint = fingerprint { +internal val BytecodePatchContext.downloadOperationsHeaderVerificationFingerprint by gettingFirstMutableMethodDeclaratively( + "X-SC-Mime-Type", + "X-SC-Preset", + "X-SC-Quality" +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L") + returnType("V") + parameterTypes("L", "L") opcodes( Opcode.CONST_STRING, Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT, Opcode.CONST_STRING, ) - strings("X-SC-Mime-Type", "X-SC-Preset", "X-SC-Quality") } diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt index ffea10a919..8e04072257 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt @@ -1,12 +1,16 @@ package app.revanced.patches.soundcloud.shared -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val featureConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.featureConstructorMethod by gettingFirstMutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("Ljava/lang/String;", "Z", "Ljava/util/List;") + parameterTypes("Ljava/lang/String;", "Z", "Ljava/util/List;") opcodes( Opcode.SGET_OBJECT, Opcode.CHECK_CAST, diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/password/EnablePasswordLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/password/EnablePasswordLoginPatch.kt index e01a6816b5..5dd30a4f0b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/password/EnablePasswordLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/password/EnablePasswordLoginPatch.kt @@ -12,9 +12,7 @@ val enablePasswordLoginPatch = bytecodePatch( compatibleWith("com.strava") apply { - fun Fingerprint.returnTrue() = method.returnEarly(true) - - logInGetUsePasswordFingerprint.returnTrue() - emailChangeGetUsePasswordFingerprint.returnTrue() + logInGetUsePasswordMethod.returnEarly(true) + emailChangeGetUsePasswordMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/password/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/password/Fingerprints.kt index 94c88490a9..fd964cb866 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/password/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/password/Fingerprints.kt @@ -1,15 +1,17 @@ package app.revanced.patches.strava.password -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val logInGetUsePasswordFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getUsePassword" && classDef.endsWith("/RequestOtpLogInNetworkResponse;") - } + +internal val BytecodePatchContext.logInGetUsePasswordMethod by gettingFirstMutableMethodDeclaratively { + name("getUsePassword") + definingClass("/RequestOtpLogInNetworkResponse;"::endsWith) } -internal val emailChangeGetUsePasswordFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getUsePassword" && classDef.endsWith("/RequestEmailChangeWithOtpOrPasswordResponse;") - } +internal val BytecodePatchContext.emailChangeGetUsePasswordMethod by gettingFirstMutableMethodDeclaratively { + name("getUsePassword") + definingClass("/RequestEmailChangeWithOtpOrPasswordResponse;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/privacy/BlockSnowplowTrackingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/privacy/BlockSnowplowTrackingPatch.kt index d917511c07..4387be3575 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/privacy/BlockSnowplowTrackingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/privacy/BlockSnowplowTrackingPatch.kt @@ -12,6 +12,6 @@ val blockSnowplowTrackingPatch = bytecodePatch( apply { // Keep events list empty, otherwise sent to https://c.strava.com/com.snowplowanalytics.snowplow/tp2. - insertEventFingerprint.method.returnEarly() + insertEventMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/privacy/Fingerprints.kt index 196602ba04..b63aafc3dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/privacy/Fingerprints.kt @@ -1,9 +1,8 @@ package app.revanced.patches.strava.privacy -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext // https://github.com/snowplow/snowplow-android-tracker/blob/2.2.0/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/internal/emitter/storage/SQLiteEventStore.java#L130 // Not the exact same code (e.g. returns void instead of long), even though the version number matches. -internal val insertEventFingerprint = fingerprint { - strings("Added event to database: %s") -} +internal val BytecodePatchContext.insertEventMethod by gettingFirstMutableMethodDeclaratively("Added event to database: %s") diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/DisableQuickEditPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/DisableQuickEditPatch.kt index a7d713e735..f77b83b4dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/DisableQuickEditPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/DisableQuickEditPatch.kt @@ -11,6 +11,6 @@ val disableQuickEditPatch = bytecodePatch( compatibleWith("com.strava") apply { - getHasAccessToQuickEditFingerprint.method.returnEarly() + getHasAccessToQuickEditMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/Fingerprints.kt index acd48542bc..b8eada3c61 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/Fingerprints.kt @@ -1,10 +1,11 @@ package app.revanced.patches.strava.quickedit -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val getHasAccessToQuickEditFingerprint = fingerprint { - returns("Z") - custom { method, _ -> - method.name == "getHasAccessToQuickEdit" - } +internal val BytecodePatchContext.getHasAccessToQuickEditMethod by gettingFirstMutableMethodDeclaratively { + name("getHasAccessToQuickEdit") + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt index 45583ce4e4..2632d975b3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.strava.subscription -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val getSubscribedFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getSubscribed" && classDef.endsWith("/SubscriptionDetailResponse;") - } +internal val BytecodePatchContext.getSubscribedMethod by gettingFirstMutableMethodDeclaratively { + name("getSubscribed") + definingClass("/SubscriptionDetailResponse;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt index 467de6c265..158a5904a9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt @@ -11,6 +11,6 @@ val unlockSubscriptionPatch = bytecodePatch( compatibleWith("com.strava") apply { - getSubscribedFingerprint.method.returnEarly(true) + getSubscribedMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt index 5dc9f7bdbc..06e79a8c07 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.strava.upselling +import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.removeInstruction import app.revanced.patcher.patch.bytecodePatch @@ -19,11 +20,11 @@ val disableSubscriptionSuggestionsPatch = bytecodePatch( val pageSuffix = "_upsell" val label = "original" - val className = getModulesFingerprint.originalClassDef.type - val originalMethod = getModulesFingerprint.method + val className = getModulesMethod.classDef.type + val originalMethod = getModulesMethod val returnType = originalMethod.returnType - getModulesFingerprint.classDef.methods.add( + getModulesMethod.classDef.methods.add( ImmutableMethod( className, helperMethodName, @@ -52,7 +53,7 @@ val disableSubscriptionSuggestionsPatch = bytecodePatch( }, ) - val getModulesIndex = getModulesFingerprint.instructionMatches.first().index + val getModulesIndex = getModulesMethod.instructionMatches.first().index // TODO with(originalMethod) { removeInstruction(getModulesIndex) addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt index 1204a36f21..16ad17c4b4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt @@ -1,11 +1,14 @@ package app.revanced.patches.strava.upselling -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val getModulesFingerprint = fingerprint { +internal val BytecodePatchContext.getModulesMethod by gettingFirstMutableMethodDeclaratively { + name("getModules") + definingClass("/GenericLayoutEntry;"::endsWith) opcodes(Opcode.IGET_OBJECT) - custom { method, classDef -> - classDef.endsWith("/GenericLayoutEntry;") && method.name == "getModules" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt index 0efa845fbe..7d5aad2f87 100644 --- a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.swissid.integritycheck -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val checkIntegrityFingerprint = fingerprint { - returns("V") - parameters("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;") - strings("it", "result") +internal val BytecodePatchContext.checkIntegrityMethod by gettingFirstMutableMethodDeclaratively("it", "result") { + returnType("V") + parameterTypes("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheckPatch.kt index 0de10e9f48..ab4cb6b04a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheckPatch.kt @@ -18,7 +18,7 @@ val removeGooglePlayIntegrityCheckPatch = bytecodePatch( compatibleWith("com.swisssign.swissid.mobile"("5.2.9")) apply { - checkIntegrityFingerprint.method.addInstructions( + checkIntegrityMethod.addInstructions( 0, """ iget-object p1, p0, $RESULT_METHOD_REFERENCE diff --git a/patches/src/main/kotlin/app/revanced/patches/threads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/threads/HideAdsPatch.kt index f87110e126..33ece5e2e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/threads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/threads/HideAdsPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.threads import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.meta.ads.adInjectorFingerprint +import app.revanced.patches.meta.ads.adInjectorMethod import app.revanced.util.returnEarly @Suppress("unused") @@ -11,6 +11,6 @@ val hideAdsPatch = bytecodePatch( compatibleWith("com.instagram.barcelona"("382.0.0.51.85")) apply { - adInjectorFingerprint.method.returnEarly(false) + adInjectorMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt index 4bd688de49..6549019d02 100644 --- a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt @@ -1,15 +1,16 @@ package app.revanced.patches.ticktick.misc.themeunlock -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val checkLockedThemesFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("Theme;") && method.name == "isLockedTheme" - } +internal val BytecodePatchContext.checkLockedThemesFingerprint by gettingFirstMutableMethodDeclaratively { + name("isLockedTheme") + definingClass("Theme;"::endsWith) } -internal val setThemeFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("ThemePreviewActivity;") && method.name == "lambda\$updateUserBtn\$1" - } +internal val BytecodePatchContext.setThemeFingerprint by gettingFirstMutableMethodDeclaratively { + name("lambda\$updateUserBtn\$1") + definingClass("ThemePreviewActivity;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt index 1506eb673a..4625404308 100644 --- a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt @@ -12,7 +12,7 @@ val unlockProPatch = bytecodePatch( compatibleWith("com.ticktick.task") apply { - checkLockedThemesFingerprint.method.addInstructions( + checkLockedThemesFingerprint.addInstructions( 0, """ const/4 v0, 0x0 @@ -20,6 +20,6 @@ val unlockProPatch = bytecodePatch( """, ) - setThemeFingerprint.method.removeInstructions(0, 10) + setThemeFingerprint.removeInstructions(0, 10) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt index 8f6ddfafb1..cad2b345d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt @@ -29,8 +29,8 @@ val feedFilterPatch = bytecodePatch( apply { arrayOf( - feedApiServiceLIZFingerprint.method to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V", - followFeedFingerprint.method to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;)V" + feedApiServiceLIZMethod to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V", + followFeedMethod to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;)V" ).forEach { (method, filterSignature) -> val returnInstruction = method.instructions.first { it.opcode == Opcode.RETURN_OBJECT } val register = (returnInstruction as OneRegisterInstruction).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt index f85dd2d072..dbbc374b57 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt @@ -1,19 +1,18 @@ package app.revanced.patches.tiktok.feedfilter -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val feedApiServiceLIZFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/FeedApiService;") && method.name == "fetchFeedList" - } +internal val BytecodePatchContext.feedApiServiceLIZMethod by gettingFirstMutableMethodDeclaratively { + name("fetchFeedList") + definingClass("/FeedApiService;") } -internal val followFeedFingerprint = fingerprint { +internal val BytecodePatchContext.followFeedMethod by gettingFirstMutableMethodDeclaratively("getFollowFeedList") { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;") - strings("getFollowFeedList") + returnType("Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;") opcodes( Opcode.INVOKE_INTERFACE_RANGE, Opcode.MOVE_RESULT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt index eb28683743..aa0f7038e5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt @@ -1,10 +1,12 @@ package app.revanced.patches.tiktok.interaction.cleardisplay -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val onClearDisplayEventFingerprint = fingerprint { - custom { method, classDef -> - // Internally the feature is called "Clear mode". - classDef.endsWith("/ClearModePanelComponent;") && method.name == "onClearModeEvent" - } +internal val BytecodePatchContext.onClearDisplayEventMethod by gettingFirstMutableMethodDeclaratively { + // Internally the feature is called "Clear mode". + name("onClearModeEvent") + definingClass("/ClearModePanelComponent;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt index 1a56b9335f..3b2f2c14ba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt @@ -21,7 +21,7 @@ val rememberClearDisplayPatch = bytecodePatch( ) apply { - onClearDisplayEventFingerprint.method.let { + onClearDisplayEventMethod.let { // region Hook the "Clear display" configuration save event to remember the state of clear display. val isEnabledIndex = it.indexOfFirstInstructionOrThrow(Opcode.IGET_BOOLEAN) + 1 diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt index 0b0e05ce41..41b96be494 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt @@ -34,11 +34,11 @@ val downloadsPatch = bytecodePatch( ) apply { - aclCommonShareFingerprint.method.returnEarly(0) - aclCommonShare2Fingerprint.method.returnEarly(2) + aclCommonShareMethod.returnEarly(0) + aclCommonShare2Method.returnEarly(2) // Download videos without watermark. - aclCommonShare3Fingerprint.method.addInstructionsWithLabels( + aclCommonShare3Method.addInstructionsWithLabels( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->shouldRemoveWatermark()Z @@ -52,7 +52,7 @@ val downloadsPatch = bytecodePatch( ) // Change the download path patch. - downloadUriFingerprint.method.apply { + downloadUriMethod.apply { findInstructionIndicesReversedOrThrow { getReference().let { it?.definingClass == "Landroid/os/Environment;" && it.name.startsWith("DIRECTORY_") @@ -75,7 +75,7 @@ val downloadsPatch = bytecodePatch( } } - settingsStatusLoadFingerprint.method.addInstruction( + settingsStatusLoadFingerprint.method.addInstruction( // TODO 0, "invoke-static {}, Lapp/revanced/extension/tiktok/settings/SettingsStatus;->enableDownload()V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt index 160b49c158..c33af94d56 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt @@ -1,46 +1,42 @@ package app.revanced.patches.tiktok.interaction.downloads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val aclCommonShareFingerprint = fingerprint { +internal val BytecodePatchContext.aclCommonShareMethod by gettingFirstMutableMethodDeclaratively { + name("getCode") + definingClass("/ACLCommonShare;"::endsWith) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("I") - custom { method, classDef -> - classDef.endsWith("/ACLCommonShare;") && - method.name == "getCode" - } + returnType("I") } - -internal val aclCommonShare2Fingerprint = fingerprint { +internal val BytecodePatchContext.aclCommonShare2Method by gettingFirstMutableMethodDeclaratively { + name("getShowType") + definingClass("/ACLCommonShare;"::endsWith) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("I") - custom { method, classDef -> - classDef.endsWith("/ACLCommonShare;") && - method.name == "getShowType" - } + returnType("I") } - -internal val aclCommonShare3Fingerprint = fingerprint { +internal val BytecodePatchContext.aclCommonShare3Method by gettingFirstMutableMethodDeclaratively { + name("getTranscode") + definingClass("/ACLCommonShare;"::endsWith) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("I") - custom { method, classDef -> - classDef.endsWith("/ACLCommonShare;") && - method.name == "getTranscode" - } + returnType("I") } - -internal val downloadUriFingerprint = fingerprint { +internal val BytecodePatchContext.downloadUriMethod by gettingFirstMutableMethodDeclaratively( + "/", + "/Camera", + "/Camera/", + "video/mp4" +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Landroid/net/Uri;") - parameters( + returnType("Landroid/net/Uri;") + parameterTypes( "Landroid/content/Context;", "Ljava/lang/String;" ) - strings( - "/", - "/Camera", - "/Camera/", - "video/mp4" - ) -} +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt index ce372ea421..3d02d4775a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt @@ -1,11 +1,12 @@ package app.revanced.patches.tiktok.interaction.seekbar -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val setSeekBarShowTypeFingerprint = fingerprint { - strings("seekbar show type change, change to:") -} +internal val BytecodePatchContext.setSeekBarShowTypeMethod by gettingFirstMutableMethodDeclaratively( + "seekbar show type change, change to:" +) -internal val shouldShowSeekBarFingerprint = fingerprint { - strings("can not show seekbar, state: 1, not in resume") -} +internal val BytecodePatchContext.shouldShowSeekBarMethod by gettingFirstMutableMethodDeclaratively( + "can not show seekbar, state: 1, not in resume" +) \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/ShowSeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/ShowSeekbarPatch.kt index 2f46b07fb2..77ae54049c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/ShowSeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/ShowSeekbarPatch.kt @@ -14,14 +14,14 @@ val showSeekbarPatch = bytecodePatch( ) apply { - shouldShowSeekBarFingerprint.method.addInstructions( + shouldShowSeekBarMethod.addInstructions( 0, """ const/4 v0, 0x1 return v0 """, ) - setSeekBarShowTypeFingerprint.method.apply { + setSeekBarShowTypeMethod.apply { val typeRegister = implementation!!.registerCount - 1 addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt index 221036bb96..cc7d7da4db 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt @@ -1,17 +1,16 @@ package app.revanced.patches.tiktok.interaction.speed -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val getSpeedFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/BaseListFragmentPanel;") && method.name == "onFeedSpeedSelectedEvent" - } +internal val BytecodePatchContext.getSpeedMethod by gettingFirstMutableMethodDeclaratively { + name("onFeedSpeedSelectedEvent") + definingClass("/BaseListFragmentPanel;"::endsWith) } -internal val setSpeedFingerprint = fingerprint { +internal val BytecodePatchContext.setSpeedMethod by gettingFirstMutableMethodDeclaratively("enterFrom") { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("V") - parameters("Ljava/lang/String;", "Lcom/ss/android/ugc/aweme/feed/model/Aweme;", "F") - strings("enterFrom") -} + returnType("V") + parameterTypes("Ljava/lang/String;", "Lcom/ss/android/ugc/aweme/feed/model/Aweme;", "F") +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt index 384d5e6354..199137e58d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.tiktok.interaction.speed +import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction @@ -23,8 +24,8 @@ val playbackSpeedPatch = bytecodePatch( ) apply { - setSpeedFingerprint.let { onVideoSwiped -> - getSpeedFingerprint.method.apply { + setSpeedMethod.let { onVideoSwiped -> + getSpeedMethod.apply { val injectIndex = indexOfFirstInstructionOrThrow { getReference()?.returnType == "F" } + 2 val register = getInstruction(injectIndex - 1).registerA @@ -53,7 +54,7 @@ val playbackSpeedPatch = bytecodePatch( # Desired playback speed retrieved using getPlaybackSpeed method. invoke-static { }, Lapp/revanced/extension/tiktok/speed/PlaybackSpeedPatch;->getPlaybackSpeed()F move-result v2 - invoke-static { v0, v1, v2 }, ${onVideoSwiped.originalMethod} + invoke-static { v0, v1, v2 }, ${onVideoSwiped.originalMethod} // TODO """, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt index a40f5251f5..f6d74a49e5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt @@ -1,22 +1,19 @@ package app.revanced.patches.tiktok.misc.login.fixgoogle -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val googleAuthAvailableFingerprint = fingerprint { +internal val BytecodePatchContext.googleAuthAvailableMethod by gettingFirstMutableMethodDeclaratively { + definingClass("Lcom/bytedance/lobby/google/GoogleAuth;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - custom { method, _ -> - method.definingClass == "Lcom/bytedance/lobby/google/GoogleAuth;" - } + returnType("Z") + parameterTypes() } -internal val googleOneTapAuthAvailableFingerprint = fingerprint { +internal val BytecodePatchContext.googleOneTapAuthAvailableMethod by gettingFirstMutableMethodDeclaratively { + definingClass("Lcom/bytedance/lobby/google/GoogleOneTapAuth;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - custom { method, _ -> - method.definingClass == "Lcom/bytedance/lobby/google/GoogleOneTapAuth;" - } -} + returnType("Z") + parameterTypes() +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatch.kt index 84518179e8..13a2a2e0c3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatch.kt @@ -15,8 +15,8 @@ val fixGoogleLoginPatch = bytecodePatch( apply { listOf( - googleOneTapAuthAvailableFingerprint.method, - googleAuthAvailableFingerprint.method, + googleOneTapAuthAvailableMethod, + googleAuthAvailableMethod, ).forEach { method -> method.addInstructions( 0, diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt index 836be89006..85220b100b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt @@ -1,25 +1,21 @@ package app.revanced.patches.tiktok.misc.share -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val urlShorteningFingerprint = fingerprint { +internal val BytecodePatchContext.urlShorteningMethod by gettingFirstMutableMethodDeclaratively( + "getShortShareUrlObservab\u2026ongUrl, subBizSceneValue)" // Same Kotlin intrinsics literal on both variants. +) { + name("LIZLLL") // LIZLLL is obfuscated by ProGuard/R8, but stable across both TikTok and Musically. accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) - returns("LX/") - parameters( + returnType("LX/") + parameterTypes( "I", "Ljava/lang/String;", "Ljava/lang/String;", "Ljava/lang/String;" ) opcodes(Opcode.RETURN_OBJECT) - - // Same Kotlin intrinsics literal on both variants. - strings("getShortShareUrlObservab\u2026ongUrl, subBizSceneValue)") - - custom { method, _ -> - // LIZLLL is obfuscated by ProGuard/R8, but stable across both TikTok and Musically. - method.name == "LIZLLL" - } -} +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt index 6e5612a9d6..f726d2d516 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt @@ -27,7 +27,7 @@ val `Sanitize sharing links` by creatingBytecodePatch( ) apply { - urlShorteningFingerprint.method.apply { + urlShorteningMethod.apply { val invokeIndex = indexOfFirstInstructionOrThrow { val ref = getReference() ref?.name == "LIZ" && ref.definingClass.startsWith("LX/") diff --git a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt index 4a02c62215..e7f614bd91 100644 --- a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt @@ -1,8 +1,10 @@ package app.revanced.patches.trakt -import app.revanced.patcher.fingerprint +import app.revanced.patcher.custom +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val isVIPEPFingerprint = fingerprint { +internal val BytecodePatchContext.isVIPEPMethod by gettingFirstMutableMethodDeclaratively { custom { method, classDef -> if (!classDef.endsWith("RemoteUser;")) return@custom false @@ -10,16 +12,17 @@ internal val isVIPEPFingerprint = fingerprint { } } -internal val isVIPFingerprint = fingerprint { +internal val BytecodePatchContext.isVIPMethod by gettingFirstMutableMethodDeclaratively { custom { method, classDef -> if (!classDef.endsWith("RemoteUser;")) return@custom false method.name == "isVIP" } } - -internal val remoteUserFingerprint = fingerprint { +internal val BytecodePatchContext.remoteUserMethod by gettingFirstMutableMethodDeclaratively { custom { _, classDef -> classDef.endsWith("RemoteUser;") } } + +// TODO \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/trakt/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/trakt/UnlockProPatch.kt index 4d9743f613..ddb10b2ad2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/trakt/UnlockProPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/trakt/UnlockProPatch.kt @@ -1,6 +1,7 @@ package app.revanced.patches.trakt import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -10,12 +11,12 @@ val unlockProPatch = bytecodePatch( compatibleWith("tv.trakt.trakt"("1.1.1")) apply { - arrayOf(isVIPFingerprint, isVIPEPFingerprint).onEach { fingerprint -> + arrayOf(isVIPMethod, isVIPEPMethod).onEach { fingerprint -> // Resolve both fingerprints on the same class. - fingerprint.match(remoteUserFingerprint.originalClassDef) + fingerprint.match(remoteUserMethod.immutableClassDef) // TODO }.forEach { fingerprint -> // Return true for both VIP check methods. - fingerprint.method.addInstructions( + fingerprint.addInstructions( 0, """ const/4 v0, 0x1 diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt index 68ca5ea2a5..503cfe046e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt @@ -11,6 +11,6 @@ val disableGiftMessagePopupPatch = bytecodePatch( compatibleWith("com.tumblr") apply { - showGiftMessagePopupFingerprint.method.addInstructions(0, "return-void") + showGiftMessagePopupMethod.addInstructions(0, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt index 7d00f2f1bd..b5cba40b2e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt @@ -1,11 +1,13 @@ package app.revanced.patches.tumblr.annoyances.popups +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint // This method is responsible for loading and displaying the visual Layout of the Gift Message Popup. -internal val showGiftMessagePopupFingerprint = fingerprint { +internal val BytecodePatchContext.showGiftMessagePopupMethod by gettingFirstMutableMethodDeclaratively("activity", "anchorView", "textMessage") { accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) - returns("V") - strings("activity", "anchorView", "textMessage") -} + returnType("V") +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt index 307e2b1840..7f336cadbb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt @@ -31,7 +31,7 @@ val audioAdsPatch = bytecodePatch( ) // Block playAds call - audioAdsPresenterPlayFingerprint.method.addInstructionsWithLabels( + audioAdsPresenterPlayMethod.addInstructionsWithLabels( 0, """ invoke-static { }, Lapp/revanced/extension/twitch/patches/AudioAdsPatch;->shouldBlockAudioAds()Z @@ -39,7 +39,7 @@ val audioAdsPatch = bytecodePatch( if-eqz v0, :show_audio_ads return-void """, - ExternalLabel("show_audio_ads", audioAdsPresenterPlayFingerprint.method.getInstruction(0)), + ExternalLabel("show_audio_ads", audioAdsPresenterPlayMethod.getInstruction(0)), ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt index 21e9cb6d2a..03c732675e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.twitch.ad.audio -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val audioAdsPresenterPlayFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("AudioAdsPlayerPresenter;") && method.name == "playAd" - } +internal val BytecodePatchContext.audioAdsPresenterPlayMethod by gettingFirstMutableMethodDeclaratively { + name("playAd") + definingClass("AudioAdsPlayerPresenter;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt index cb58ba7223..a54515c401 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt @@ -29,7 +29,7 @@ val embeddedAdsPatch = bytecodePatch( ) // Inject OkHttp3 application interceptor - createsUsherClientFingerprint.method.addInstructions( + createsUsherClientMethod.addInstructions( 3, """ invoke-static {}, Lapp/revanced/extension/twitch/patches/EmbeddedAdsPatch;->createRequestInterceptor()Lapp/revanced/extension/twitch/api/RequestInterceptor; diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt index 3e9853bd61..5620b92e19 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.twitch.ad.embedded -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val createsUsherClientFingerprint = fingerprint { - custom { method, _ -> - method.name == "buildOkHttpClient" && method.definingClass.endsWith("Ltv/twitch/android/network/OkHttpClientFactory;") - } +internal val BytecodePatchContext.createsUsherClientMethod by gettingFirstMutableMethodDeclaratively { + name("buildOkHttpClient") + definingClass("Ltv/twitch/android/network/OkHttpClientFactory;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt index d03449733f..3c7edc82b6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt @@ -1,28 +1,25 @@ package app.revanced.patches.twitch.ad.video -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val checkAdEligibilityLambdaFingerprint = fingerprint { - returns("Lio/reactivex/Single;") - parameters("L") - custom { method, _ -> - method.definingClass.endsWith("/AdEligibilityFetcher;") && - method.name == "shouldRequestAd" - } +internal val BytecodePatchContext.checkAdEligibilityLambdaMethod by gettingFirstMutableMethodDeclaratively { + name("shouldRequestAd") + definingClass("/AdEligibilityFetcher;"::endsWith) + returnType("Lio/reactivex/Single;") + parameterTypes("L") } -internal val contentConfigShowAdsFingerprint = fingerprint { - returns("Z") - parameters() - custom { method, _ -> - method.definingClass.endsWith("/ContentConfigData;") && method.name == "getShowAds" - } +internal val BytecodePatchContext.contentConfigShowAdsMethod by gettingFirstMutableMethodDeclaratively { + name("getShowAds") + definingClass("/ContentConfigData;"::endsWith) + returnType("Z") + parameterTypes() } -internal val getReadyToShowAdFingerprint = fingerprint { - returns("Ltv/twitch/android/core/mvp/presenter/StateAndAction;") - parameters("L", "L") - custom { method, _ -> - method.definingClass.endsWith("/StreamDisplayAdsPresenter;") && method.name == "getReadyToShowAdOrAbort" - } +internal val BytecodePatchContext.getReadyToShowAdMethod by gettingFirstMutableMethodDeclaratively { + name("getReadyToShowAdOrAbort") + definingClass("/StreamDisplayAdsPresenter;"::endsWith) + returnType("Ltv/twitch/android/core/mvp/presenter/StateAndAction;") + parameterTypes("L", "L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt index 1168f72631..f1fcfe635b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt @@ -111,7 +111,7 @@ val videoAdsPatch = bytecodePatch( ) // Pretend our player is ineligible for all ads. - checkAdEligibilityLambdaFingerprint.method.addInstructionsWithLabels( + checkAdEligibilityLambdaMethod.addInstructionsWithLabels( 0, """ ${createConditionInstructions("v0")} @@ -122,13 +122,13 @@ val videoAdsPatch = bytecodePatch( """, ExternalLabel( skipLabelName, - checkAdEligibilityLambdaFingerprint.method.getInstruction(0), + checkAdEligibilityLambdaMethod.getInstruction(0), ), ) val adFormatDeclined = "Ltv/twitch/android/shared/display/ads/theatre/StreamDisplayAdsPresenter\$Action\$AdFormatDeclined;" - getReadyToShowAdFingerprint.method.addInstructionsWithLabels( + getReadyToShowAdMethod.addInstructionsWithLabels( 0, """ ${createConditionInstructions("v0")} @@ -137,12 +137,12 @@ val videoAdsPatch = bytecodePatch( move-result-object p1 return-object p1 """, - ExternalLabel(skipLabelName, getReadyToShowAdFingerprint.method.getInstruction(0)), + ExternalLabel(skipLabelName, getReadyToShowAdMethod.getInstruction(0)), ) // Spoof showAds JSON field. // Late versions of the app don't have the method anymore. - contentConfigShowAdsFingerprint.methodOrNull?.addInstructions( + contentConfigShowAdsMethod.addInstructions( 0, """ ${createConditionInstructions("v0")} diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt index a656e34a54..bb13ef0ef2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt @@ -1,23 +1,23 @@ package app.revanced.patches.twitch.chat.antidelete -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val chatUtilCreateDeletedSpanFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("ChatUtil\$Companion;") && method.name == "createDeletedSpanFromChatMessageSpan" - } +internal val BytecodePatchContext.chatUtilCreateDeletedSpanMethod by gettingFirstMutableMethodDeclaratively { + name("createDeletedSpanFromChatMessageSpan") + definingClass("ChatUtil\$Companion;"::endsWith) } -internal val deletedMessageClickableSpanCtorFingerprint = fingerprint { +internal val BytecodePatchContext.deletedMessageClickableSpanCtorMethod by gettingFirstMutableMethodDeclaratively { + definingClass("DeletedMessageClickableSpan;"::endsWith) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - custom { _, classDef -> - classDef.endsWith("DeletedMessageClickableSpan;") - } } -internal val setHasModAccessFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("DeletedMessageClickableSpan;") && method.name == "setHasModAccess" - } +internal val BytecodePatchContext.setHasModAccessMethod by gettingFirstMutableMethodDeclaratively { + name("setHasModAccess") + definingClass("DeletedMessageClickableSpan;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt index 7629494336..0954a53232 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt @@ -38,7 +38,7 @@ val showDeletedMessagesPatch = bytecodePatch( ) // Spoiler mode: Force set hasModAccess member to true in constructor - deletedMessageClickableSpanCtorFingerprint.method.apply { + deletedMessageClickableSpanCtorMethod.apply { addInstructionsWithLabels( implementation!!.instructions.lastIndex, /* place in front of return-void */ """ @@ -51,10 +51,10 @@ val showDeletedMessagesPatch = bytecodePatch( } // Spoiler mode: Disable setHasModAccess setter - setHasModAccessFingerprint.method.addInstruction(0, "return-void") + setHasModAccessMethod.addInstruction(0, "return-void") // Cross-out mode: Reformat span of deleted message - chatUtilCreateDeletedSpanFingerprint.method.apply { + chatUtilCreateDeletedSpanMethod.apply { addInstructionsWithLabels( 0, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt index 29c20889f0..8e94d88b17 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt @@ -29,7 +29,7 @@ val autoClaimChannelPointsPatch = bytecodePatch( SwitchPreference("revanced_auto_claim_channel_points"), ) - communityPointsButtonViewDelegateFingerprint.method.apply { + communityPointsButtonViewDelegateMethod.apply { val lastIndex = instructions.lastIndex addInstructionsWithLabels( lastIndex, // place in front of return-void diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt index 80abc9ac41..f5bc9523cc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt @@ -1,10 +1,11 @@ package app.revanced.patches.twitch.chat.autoclaim -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val communityPointsButtonViewDelegateFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("CommunityPointsButtonViewDelegate;") && - method.name == "showClaimAvailable" - } +internal val BytecodePatchContext.communityPointsButtonViewDelegateMethod by gettingFirstMutableMethodDeclaratively { + name("showClaimAvailable") + definingClass("CommunityPointsButtonViewDelegate;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt index 62e8d6a3ac..2892cc50d6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt @@ -30,11 +30,11 @@ val debugModePatch = bytecodePatch( ) listOf( - isDebugConfigEnabledFingerprint, - isOmVerificationEnabledFingerprint, - shouldShowDebugOptionsFingerprint, + isDebugConfigEnabledMethod, + isOmVerificationEnabledMethod, + shouldShowDebugOptionsMethod, ).forEach { fingerprint -> - fingerprint.method.addInstructions( + fingerprint.addInstructions( 0, """ invoke-static {}, Lapp/revanced/extension/twitch/patches/DebugModePatch;->isDebugModeEnabled()Z diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt index 665180c19b..16513e2334 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt @@ -1,21 +1,21 @@ package app.revanced.patches.twitch.debug -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val isDebugConfigEnabledFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/BuildConfigUtil;") && method.name == "isDebugConfigEnabled" - } +internal val BytecodePatchContext.isDebugConfigEnabledMethod by gettingFirstMutableMethodDeclaratively { + name("isDebugConfigEnabled") + definingClass("/BuildConfigUtil;"::endsWith) } -internal val isOmVerificationEnabledFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/BuildConfigUtil;") && method.name == "isOmVerificationEnabled" - } +internal val BytecodePatchContext.isOmVerificationEnabledMethod by gettingFirstMutableMethodDeclaratively { + name("isOmVerificationEnabled") + definingClass("/BuildConfigUtil;"::endsWith) } -internal val shouldShowDebugOptionsFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/BuildConfigUtil;") && method.name == "shouldShowDebugOptions" - } +internal val BytecodePatchContext.shouldShowDebugOptionsMethod by gettingFirstMutableMethodDeclaratively { + name("shouldShowDebugOptions") + definingClass("/BuildConfigUtil;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt index 43d5bb39bf..267e11bce4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt @@ -1,34 +1,28 @@ package app.revanced.patches.twitch.misc.settings -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val menuGroupsOnClickFingerprint = fingerprint { +internal val BytecodePatchContext.menuGroupsOnClickMethod by gettingFirstMutableMethodDeclaratively { + name(String::contains("render")) // TODO + definingClass("/SettingsMenuViewDelegate;"::endsWith) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L", "L") - custom { method, classDef -> - classDef.endsWith("/SettingsMenuViewDelegate;") && - method.name.contains("render") - } + returnType("V") + parameterTypes("L", "L", "L") } -internal val menuGroupsUpdatedFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/SettingsMenuPresenter\$Event\$MenuGroupsUpdated;") && - method.name == "" - } +internal val BytecodePatchContext.menuGroupsUpdatedMethod by gettingFirstMutableMethodDeclaratively { + name("") + definingClass("/SettingsMenuPresenter\$Event\$MenuGroupsUpdated;") } -internal val settingsActivityOnCreateFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/SettingsActivity;") && - method.name == "onCreate" - } +internal val BytecodePatchContext.settingsActivityOnCreateMethod by gettingFirstMutableMethodDeclaratively { + name("onCreate") + definingClass("/SettingsActivity;"::endsWith) } -internal val settingsMenuItemEnumFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/SettingsMenuItem;") && method.name == "" - } +internal val BytecodePatchContext.settingsMenuItemEnumMethod by gettingFirstMutableMethodDeclaratively { + name("") + definingClass("/SettingsMenuItem;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt index 625b6f0bb7..46f09ebd3e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt @@ -1,8 +1,10 @@ package app.revanced.patches.twitter.layout.viewcount -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType + +internal val BytecodePatchContext.viewCountsEnabledMethod by gettingFirstMutableMethodDeclaratively("view_counts_public_visibility_enabled") { + returnType("Z") -internal val viewCountsEnabledFingerprint = fingerprint { - returns("Z") - strings("view_counts_public_visibility_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/HideViewCountPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/HideViewCountPatch.kt index a703af7254..f6028e916e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/HideViewCountPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/HideViewCountPatch.kt @@ -12,7 +12,7 @@ val hideViewCountPatch = bytecodePatch( compatibleWith("com.twitter.android") apply { - viewCountsEnabledFingerprint.method.addInstructions( + viewCountsEnabledMethod.addInstructions( 0, """ const/4 v0, 0x0 diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt index 6eb7bd176b..86bd254038 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt @@ -1,21 +1,21 @@ package app.revanced.patches.warnwetter.misc.firebasegetcert -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val getMessagingCertFingerprint = fingerprint { - returns("Ljava/lang/String;") - strings( - "ContentValues", - "Could not get fingerprint hash for package: ", - "No such package: ", - ) +internal val BytecodePatchContext.getMessagingCertMethod by gettingFirstMutableMethodDeclaratively( + "ContentValues", + "Could not get fingerprint hash for package: ", + "No such package: ", +) { + returnType("Ljava/lang/String;") } -internal val getRegistrationCertFingerprint = fingerprint { - returns("Ljava/lang/String;") - strings( - "FirebaseRemoteConfig", - "Could not get fingerprint hash for package: ", - "No such package: ", - ) +internal val BytecodePatchContext.getRegistrationCertMethod by gettingFirstMutableMethodDeclaratively( + "FirebaseRemoteConfig", + "Could not get fingerprint hash for package: ", + "No such package: ", +) { + returnType("Ljava/lang/String;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatch.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatch.kt index 9f49b000b2..ca3d7fc2f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatch.kt @@ -9,8 +9,8 @@ val firebaseGetCertPatch = bytecodePatch( compatibleWith("de.dwd.warnapp") apply { - listOf(getRegistrationCertFingerprint, getMessagingCertFingerprint).forEach { match -> - match.method.returnEarly("0799DDF0414D3B3475E88743C91C0676793ED450") + listOf(getRegistrationCertMethod, getMessagingCertMethod).forEach { match -> + match.returnEarly("0799DDF0414D3B3475E88743C91C0676793ED450") } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt index d33880de70..7a0393a333 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.warnwetter.misc.promocode -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val promoCodeUnlockFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("PromoTokenVerification;") && method.name == "isValid" - } -} +internal val BytecodePatchContext.promoCodeUnlockMethod by gettingFirstMutableMethodDeclaratively { + name("isValid") + definingClass("PromoTokenVerification;"::endsWith) +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnlockPatch.kt index 231a0a89d4..6799691d42 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnlockPatch.kt @@ -14,7 +14,7 @@ val promoCodeUnlockPatch = bytecodePatch( compatibleWith("de.dwd.warnapp"("4.2.2")) apply { - promoCodeUnlockFingerprint.method.addInstructions( + promoCodeUnlockMethod.addInstructions( 0, """ const/4 v0, 0x1 diff --git a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt index e326c26825..c2f5119d15 100644 --- a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt @@ -1,26 +1,24 @@ package app.revanced.patches.willhaben.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val adResolverFingerprint = fingerprint { +internal val BytecodePatchContext.adResolverMethod by gettingFirstMutableMethodDeclaratively( + "Google Ad is invalid ", + "Google Native Ad is invalid ", + "Criteo Ad is invalid ", + "Amazon Ad is invalid ", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters("L", "L") - strings( - "Google Ad is invalid ", - "Google Native Ad is invalid ", - "Criteo Ad is invalid ", - "Amazon Ad is invalid ", - ) + returnType("L") + parameterTypes("L", "L") + } -internal val whAdViewInjectorFingerprint = fingerprint { +internal val BytecodePatchContext.whAdViewInjectorMethod by gettingFirstMutableMethodDeclaratively("successfulAdView") { + definingClass("Lat/willhaben/advertising/WHAdView;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L", "L", "Z") - strings("successfulAdView") - custom { _, classDef -> - classDef.type == "Lat/willhaben/advertising/WHAdView;" - } + returnType("V") + parameterTypes("L", "L", "L", "Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt index aa3ca94fb1..03760684c8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt @@ -11,7 +11,7 @@ internal val hideAdsPatch = bytecodePatch( compatibleWith("at.willhaben") apply { - adResolverFingerprint.method.returnEarly(null) - whAdViewInjectorFingerprint.method.returnEarly() + adResolverMethod.returnEarly(null) // TODO + whAdViewInjectorMethod.returnEarly() } }