feat: meo passcode bypass
This commit is contained in:
@@ -53,7 +53,8 @@
|
|||||||
"block_ads": "Block Ads",
|
"block_ads": "Block Ads",
|
||||||
"streak_expiration_info": "Show Streak Expiration Info",
|
"streak_expiration_info": "Show Streak Expiration Info",
|
||||||
"new_map_ui": "New Map UI",
|
"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": {
|
"option": {
|
||||||
|
|||||||
@@ -209,6 +209,12 @@ enum class ConfigProperty(
|
|||||||
"description.use_download_manager",
|
"description.use_download_manager",
|
||||||
ConfigCategory.EXPERIMENTAL,
|
ConfigCategory.EXPERIMENTAL,
|
||||||
ConfigStateValue(false)
|
ConfigStateValue(false)
|
||||||
|
),
|
||||||
|
MEO_PASSCODE_BYPASS(
|
||||||
|
"property.meo_passcode_bypass",
|
||||||
|
"description.meo_passcode_bypass",
|
||||||
|
ConfigCategory.EXPERIMENTAL,
|
||||||
|
ConfigStateValue(false)
|
||||||
);
|
);
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,14 +5,15 @@ import me.rhunk.snapenhance.ModContext
|
|||||||
import me.rhunk.snapenhance.features.Feature
|
import me.rhunk.snapenhance.features.Feature
|
||||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||||
import me.rhunk.snapenhance.features.impl.ConfigEnumKeys
|
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.Messaging
|
||||||
import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload
|
import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload
|
||||||
import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader
|
import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader
|
||||||
import me.rhunk.snapenhance.features.impl.extras.AntiAutoSave
|
import me.rhunk.snapenhance.features.impl.extras.AntiAutoSave
|
||||||
import me.rhunk.snapenhance.features.impl.extras.AutoSave
|
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.DisableVideoLengthRestriction
|
||||||
import me.rhunk.snapenhance.features.impl.extras.ExternalMediaAsSnap
|
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.Notifications
|
||||||
import me.rhunk.snapenhance.features.impl.extras.SnapchatPlus
|
import me.rhunk.snapenhance.features.impl.extras.SnapchatPlus
|
||||||
import me.rhunk.snapenhance.features.impl.extras.UnlimitedSnapViewTime
|
import me.rhunk.snapenhance.features.impl.extras.UnlimitedSnapViewTime
|
||||||
@@ -70,6 +71,7 @@ class FeatureManager(private val context: ModContext) : Manager {
|
|||||||
register(UnlimitedSnapViewTime::class)
|
register(UnlimitedSnapViewTime::class)
|
||||||
register(DisableVideoLengthRestriction::class)
|
register(DisableVideoLengthRestriction::class)
|
||||||
register(MediaQualityLevelOverride::class)
|
register(MediaQualityLevelOverride::class)
|
||||||
|
register(MeoPasscodeBypass::class)
|
||||||
|
|
||||||
initializeFeatures()
|
initializeFeatures()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import me.rhunk.snapenhance.ModContext
|
|||||||
import me.rhunk.snapenhance.bridge.common.impl.file.BridgeFileType
|
import me.rhunk.snapenhance.bridge.common.impl.file.BridgeFileType
|
||||||
import me.rhunk.snapenhance.manager.Manager
|
import me.rhunk.snapenhance.manager.Manager
|
||||||
import me.rhunk.snapenhance.mapping.Mapper
|
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.CallbackMapper
|
||||||
import me.rhunk.snapenhance.mapping.impl.EnumMapper
|
import me.rhunk.snapenhance.mapping.impl.EnumMapper
|
||||||
import me.rhunk.snapenhance.mapping.impl.GridMediaItemMapper
|
import me.rhunk.snapenhance.mapping.impl.GridMediaItemMapper
|
||||||
@@ -29,6 +30,7 @@ class MappingManager(private val context: ModContext) : Manager {
|
|||||||
add(OperaPageViewControllerMapper())
|
add(OperaPageViewControllerMapper())
|
||||||
add(PlusSubscriptionMapper())
|
add(PlusSubscriptionMapper())
|
||||||
add(GridMediaItemMapper())
|
add(GridMediaItemMapper())
|
||||||
|
add(BCryptClassMapper())
|
||||||
}
|
}
|
||||||
|
|
||||||
private val mappings = ConcurrentHashMap<String, Any>()
|
private val mappings = ConcurrentHashMap<String, Any>()
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user