diff --git a/app/src/main/java/org/lsposed/corepatch/Config.kt b/app/src/main/java/org/lsposed/corepatch/Config.kt index 370ba6b..5ed47a3 100644 --- a/app/src/main/java/org/lsposed/corepatch/Config.kt +++ b/app/src/main/java/org/lsposed/corepatch/Config.kt @@ -10,6 +10,7 @@ object Config { const val ENHANCED_MODE = "enhanced_mode" const val USE_PREVIOUS_SIGNATURES = "use_previous_signatures" const val BYPASS_SHARED_USER = "bypass_shared_user" + const val DISABLE_VERIFICATION_AGENT = "disable_verification_agent" private val allConfig = arrayOf( BYPASS_DOWNGRADE, @@ -50,6 +51,10 @@ object Config { return prefs.getBoolean(BYPASS_SHARED_USER, false) } + fun isDisableVerificationAgentEnabled(): Boolean { + return prefs.getBoolean(DISABLE_VERIFICATION_AGENT, false) + } + fun getConfig(key: String): Boolean { return rwPrefs?.getBoolean(key, false) ?: false } diff --git a/app/src/main/java/org/lsposed/corepatch/MainActivity.kt b/app/src/main/java/org/lsposed/corepatch/MainActivity.kt index 343855b..47ae17f 100644 --- a/app/src/main/java/org/lsposed/corepatch/MainActivity.kt +++ b/app/src/main/java/org/lsposed/corepatch/MainActivity.kt @@ -40,6 +40,9 @@ class MainActivity : Activity() { val bypassSharedUser = SwitchData( getString(R.string.bypass_shared_user), "", Config.BYPASS_SHARED_USER ) + val disableVerificationAgent = SwitchData( + getString(R.string.disable_verification_agent), "", Config.DISABLE_VERIFICATION_AGENT + ) val dataSet = arrayListOf( bypassDowngrade, @@ -47,7 +50,8 @@ class MainActivity : Activity() { bypassDigest, enhancedMode, usePreviousSignatures, - bypassSharedUser + bypassSharedUser, + disableVerificationAgent ) val adapter = MultiTypeListAdapter(dataSet) diff --git a/app/src/main/java/org/lsposed/corepatch/XposedMain.kt b/app/src/main/java/org/lsposed/corepatch/XposedMain.kt index f2241e7..07ba06e 100644 --- a/app/src/main/java/org/lsposed/corepatch/XposedMain.kt +++ b/app/src/main/java/org/lsposed/corepatch/XposedMain.kt @@ -20,6 +20,8 @@ import org.lsposed.corepatch.hook.ScanPackageUtilsHook import org.lsposed.corepatch.hook.SharedUserSettingHook import org.lsposed.corepatch.hook.SigningDetailsHook import org.lsposed.corepatch.hook.StrictJarVerifierHook +import org.lsposed.corepatch.hook.VerificationParamsHook +import org.lsposed.corepatch.hook.VerifyingSessionHook class XposedMain( base: XposedInterface, param: XposedModuleInterface.ModuleLoadedParam @@ -50,6 +52,8 @@ class XposedMain( SharedUserSettingHook, SigningDetailsHook, StrictJarVerifierHook, + VerificationParamsHook, + VerifyingSessionHook, ) hooks.forEach { it.init() } } diff --git a/app/src/main/java/org/lsposed/corepatch/hook/PackageManagerServiceHook.kt b/app/src/main/java/org/lsposed/corepatch/hook/PackageManagerServiceHook.kt index 62334d1..59c7553 100644 --- a/app/src/main/java/org/lsposed/corepatch/hook/PackageManagerServiceHook.kt +++ b/app/src/main/java/org/lsposed/corepatch/hook/PackageManagerServiceHook.kt @@ -47,6 +47,16 @@ object PackageManagerServiceHook : BaseHook() { } }) + val isVerificationEnabledMethod = + packageManagerServiceClazz.declaredMethods.first { m -> m.name == "isVerificationEnabled" } + hookBefore(isVerificationEnabledMethod, object : BeforeCallback { + override fun before(callback: BeforeHookCallback) { + if (Config.isDisableVerificationAgentEnabled()) { + callback.returnAndSkip(false) + } + } + }) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val doesSignatureMatchForPermissionsMethod = packageManagerServiceClazz.declaredMethods.first { m -> m.name == "doesSignatureMatchForPermissions" } diff --git a/app/src/main/java/org/lsposed/corepatch/hook/VerificationParamsHook.kt b/app/src/main/java/org/lsposed/corepatch/hook/VerificationParamsHook.kt new file mode 100644 index 0000000..6665128 --- /dev/null +++ b/app/src/main/java/org/lsposed/corepatch/hook/VerificationParamsHook.kt @@ -0,0 +1,31 @@ +package org.lsposed.corepatch.hook + +import android.annotation.SuppressLint +import android.os.Build +import io.github.libxposed.api.XposedInterface.BeforeHookCallback +import org.lsposed.corepatch.Config +import org.lsposed.corepatch.XposedHelper.BeforeCallback +import org.lsposed.corepatch.XposedHelper.hookBefore +import org.lsposed.corepatch.XposedHelper.hostClassLoader + +object VerificationParamsHook: BaseHook() { + override val name = "VerificationParamsHook" + + @SuppressLint("PrivateApi") + override fun hook() { + if (Build.VERSION.SDK_INT != Build.VERSION_CODES.TIRAMISU) { + return + } + + val verificationParamsClazz = hostClassLoader.loadClass("com.android.server.pm.VerificationParams") + + val isVerificationEnabledMethod = verificationParamsClazz.declaredMethods.first { m -> m.name == "isVerificationEnabled" } + hookBefore(isVerificationEnabledMethod, object : BeforeCallback { + override fun before(callback: BeforeHookCallback) { + if (Config.isDisableVerificationAgentEnabled()) { + callback.returnAndSkip(false) + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/lsposed/corepatch/hook/VerifyingSessionHook.kt b/app/src/main/java/org/lsposed/corepatch/hook/VerifyingSessionHook.kt new file mode 100644 index 0000000..077cb83 --- /dev/null +++ b/app/src/main/java/org/lsposed/corepatch/hook/VerifyingSessionHook.kt @@ -0,0 +1,34 @@ +package org.lsposed.corepatch.hook + +import android.annotation.SuppressLint +import android.os.Build +import io.github.libxposed.api.XposedInterface.BeforeHookCallback +import org.lsposed.corepatch.Config +import org.lsposed.corepatch.XposedHelper.BeforeCallback +import org.lsposed.corepatch.XposedHelper.hookBefore +import org.lsposed.corepatch.XposedHelper.hostClassLoader + +object VerifyingSessionHook : BaseHook() { + override val name = "VerifyingSessionHook" + + @SuppressLint("PrivateApi") + override fun hook() { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) { + return + } + + val verifyingSessionClazz = + hostClassLoader.loadClass("com.android.server.pm.VerifyingSession") + + val isVerificationEnabledMethod = + verifyingSessionClazz.declaredMethods.first { m -> m.name == "isVerificationEnabled" } + hookBefore(isVerificationEnabledMethod, object : BeforeCallback { + override fun before(callback: BeforeHookCallback) { + if (Config.isDisableVerificationAgentEnabled()) { + callback.returnAndSkip(false) + } + } + }) + + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7f265a1..44c0479 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,4 +7,5 @@ Enhanced mode Use previous signatures Bypass shared user verification + Disable Package Verification Agent \ No newline at end of file