commit e4ebb324fbaa8da2d29c383cbbcb75e7290e051a
parent 6f97584622204b4484c74a84d8b3e2f65039a6b5
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Sat, 27 May 2023 19:43:52 +0200

feat: meo passcode bypass

Diffstat:
Mapp/src/main/assets/lang/en_US.json | 3++-
Mapp/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt | 6++++++
Aapp/src/main/kotlin/me/rhunk/snapenhance/features/impl/MeoPasscodeBypass.kt | 22++++++++++++++++++++++
Mapp/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt | 4+++-
Mapp/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt | 2++
Aapp/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/BCryptClassMapper.kt | 27+++++++++++++++++++++++++++
6 files changed, 62 insertions(+), 2 deletions(-)

diff --git 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 @@ -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 @@ -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 @@ -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 @@ -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<String, Any>() 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 @@ -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<Class<*>>, + mappings: MutableMap<String, Any> + ) { + 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