From e4ebb324fbaa8da2d29c383cbbcb75e7290e051a Mon Sep 17 00:00:00 2001 From: rhunk <101876869+rhunk@users.noreply.github.com> Date: Sat, 27 May 2023 19:43:52 +0200 Subject: [PATCH] feat: meo passcode bypass --- app/src/main/assets/lang/en_US.json | 3 ++- .../snapenhance/config/ConfigProperty.kt | 6 +++++ .../features/impl/MeoPasscodeBypass.kt | 21 +++++++++++++++ .../manager/impl/FeatureManager.kt | 4 ++- .../manager/impl/MappingManager.kt | 2 ++ .../mapping/impl/BCryptClassMapper.kt | 26 +++++++++++++++++++ 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 app/src/main/kotlin/me/rhunk/snapenhance/features/impl/MeoPasscodeBypass.kt create mode 100644 app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/BCryptClassMapper.kt diff --git a/app/src/main/assets/lang/en_US.json b/app/src/main/assets/lang/en_US.json index 6c16d19e..17e031a8 100644 --- a/app/src/main/assets/lang/en_US.json +++ b/app/src/main/assets/lang/en_US.json @@ -53,7 +53,8 @@ "block_ads": "Block Ads", "streak_expiration_info": "Show Streak Expiration Info", "new_map_ui": "New Map UI", - "use_download_manager": "Use Android Download Manager" + "use_download_manager": "Use Android Download Manager", + "meo_passcode_bypass": "My Eyes Only Passcode Bypass" }, "option": { diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt b/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt index 607382e6..0274b17b 100644 --- a/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt +++ b/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt @@ -209,6 +209,12 @@ enum class ConfigProperty( "description.use_download_manager", ConfigCategory.EXPERIMENTAL, ConfigStateValue(false) + ), + MEO_PASSCODE_BYPASS( + "property.meo_passcode_bypass", + "description.meo_passcode_bypass", + ConfigCategory.EXPERIMENTAL, + ConfigStateValue(false) ); companion object { diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/MeoPasscodeBypass.kt b/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/MeoPasscodeBypass.kt new file mode 100644 index 00000000..3ee53cbc --- /dev/null +++ b/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/MeoPasscodeBypass.kt @@ -0,0 +1,21 @@ +package me.rhunk.snapenhance.features.impl + +import me.rhunk.snapenhance.config.ConfigProperty +import me.rhunk.snapenhance.features.Feature +import me.rhunk.snapenhance.features.FeatureLoadParams +import me.rhunk.snapenhance.hook.HookStage +import me.rhunk.snapenhance.hook.Hooker + +class MeoPasscodeBypass : Feature("Meo Passcode Bypass", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) { + override fun asyncOnActivityCreate() { + Hooker.hook( + context.mappings.getMappedClass("BCryptClass"), + context.mappings.getMappedValue("BCryptClassHashMethod"), + HookStage.BEFORE, + { context.config.bool(ConfigProperty.MEO_PASSCODE_BYPASS) }, + ) { param -> + //set the hash to the result of the method + param.setResult(param.arg(1)) + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt index cb771db0..08895f25 100644 --- a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt +++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt @@ -5,14 +5,15 @@ import me.rhunk.snapenhance.ModContext import me.rhunk.snapenhance.features.Feature import me.rhunk.snapenhance.features.FeatureLoadParams import me.rhunk.snapenhance.features.impl.ConfigEnumKeys +import me.rhunk.snapenhance.features.impl.MeoPasscodeBypass import me.rhunk.snapenhance.features.impl.Messaging import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader import me.rhunk.snapenhance.features.impl.extras.AntiAutoSave import me.rhunk.snapenhance.features.impl.extras.AutoSave -import me.rhunk.snapenhance.features.impl.extras.MediaQualityLevelOverride import me.rhunk.snapenhance.features.impl.extras.DisableVideoLengthRestriction import me.rhunk.snapenhance.features.impl.extras.ExternalMediaAsSnap +import me.rhunk.snapenhance.features.impl.extras.MediaQualityLevelOverride import me.rhunk.snapenhance.features.impl.extras.Notifications import me.rhunk.snapenhance.features.impl.extras.SnapchatPlus import me.rhunk.snapenhance.features.impl.extras.UnlimitedSnapViewTime @@ -70,6 +71,7 @@ class FeatureManager(private val context: ModContext) : Manager { register(UnlimitedSnapViewTime::class) register(DisableVideoLengthRestriction::class) register(MediaQualityLevelOverride::class) + register(MeoPasscodeBypass::class) initializeFeatures() } diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt index b603baad..97b5e41a 100644 --- a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt +++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt @@ -12,6 +12,7 @@ import me.rhunk.snapenhance.ModContext import me.rhunk.snapenhance.bridge.common.impl.file.BridgeFileType import me.rhunk.snapenhance.manager.Manager import me.rhunk.snapenhance.mapping.Mapper +import me.rhunk.snapenhance.mapping.impl.BCryptClassMapper import me.rhunk.snapenhance.mapping.impl.CallbackMapper import me.rhunk.snapenhance.mapping.impl.EnumMapper import me.rhunk.snapenhance.mapping.impl.GridMediaItemMapper @@ -29,6 +30,7 @@ class MappingManager(private val context: ModContext) : Manager { add(OperaPageViewControllerMapper()) add(PlusSubscriptionMapper()) add(GridMediaItemMapper()) + add(BCryptClassMapper()) } private val mappings = ConcurrentHashMap() diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/BCryptClassMapper.kt b/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/BCryptClassMapper.kt new file mode 100644 index 00000000..28761668 --- /dev/null +++ b/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/BCryptClassMapper.kt @@ -0,0 +1,26 @@ +package me.rhunk.snapenhance.mapping.impl + +import me.rhunk.snapenhance.mapping.Mapper +import java.lang.reflect.Modifier + +class BCryptClassMapper : Mapper() { + override fun useClasses( + classLoader: ClassLoader, + classes: List>, + mappings: MutableMap + ) { + for (clazz in classes) { + if (!Modifier.isFinal(clazz.modifiers)) continue + clazz.fields.firstOrNull { it.type == IntArray::class.java && Modifier.isStatic(it.modifiers)}?.let { field -> + val fieldData = field.get(null) + if (fieldData !is IntArray) return@let + if (fieldData.size != 18 || fieldData[0] != 608135816) return@let + mappings["BCryptClass"] = clazz.name + mappings["BCryptClassHashMethod"] = clazz.methods.first { + it.parameterTypes.size == 2 && it.returnType == String::class.java && it.parameterTypes[0] == String::class.java && it.parameterTypes[1] == String::class.java + }.name + return + } + } + } +} \ No newline at end of file