From 4c3ffc3874b09d1ac4da93acb4eef23c4ff7d2c9 Mon Sep 17 00:00:00 2001 From: 1552980358 <1552980358@qq.com> Date: Wed, 19 Jun 2024 04:50:52 +0800 Subject: [PATCH] Remove clumsy core patch impl checking flow --- .../{XposedHelper.java => CorePatch.java} | 36 ++- .../java/toolkit/coderstory/MainHook.java | 52 +--- .../CorePatchImplApiP.java} | 8 +- .../CorePatchImplApiR.java} | 10 +- .../CorePatchImplApiS.java} | 8 +- .../CorePatchImplApiT.java} | 244 +++++++++--------- .../CorePatchImplApiU.java} | 9 +- .../patch/CorePatchUnsupported.java | 29 +++ 8 files changed, 218 insertions(+), 178 deletions(-) rename app/src/main/java/toolkit/coderstory/{XposedHelper.java => CorePatch.java} (76%) rename app/src/main/java/toolkit/coderstory/{CorePatchForQ.java => patch/CorePatchImplApiP.java} (97%) rename app/src/main/java/toolkit/coderstory/{CorePatchForR.java => patch/CorePatchImplApiR.java} (99%) rename app/src/main/java/toolkit/coderstory/{CorePatchForS.java => patch/CorePatchImplApiS.java} (90%) rename app/src/main/java/toolkit/coderstory/{CorePatchForT.java => patch/CorePatchImplApiT.java} (96%) rename app/src/main/java/toolkit/coderstory/{CorePatchForU.java => patch/CorePatchImplApiU.java} (90%) create mode 100644 app/src/main/java/toolkit/coderstory/patch/CorePatchUnsupported.java diff --git a/app/src/main/java/toolkit/coderstory/XposedHelper.java b/app/src/main/java/toolkit/coderstory/CorePatch.java similarity index 76% rename from app/src/main/java/toolkit/coderstory/XposedHelper.java rename to app/src/main/java/toolkit/coderstory/CorePatch.java index dd64893..2b69c0a 100644 --- a/app/src/main/java/toolkit/coderstory/XposedHelper.java +++ b/app/src/main/java/toolkit/coderstory/CorePatch.java @@ -1,16 +1,45 @@ package toolkit.coderstory; +import android.os.Build; import android.util.Log; import com.coderstory.toolkit.BuildConfig; +import toolkit.coderstory.patch.CorePatchImplApiP; +import toolkit.coderstory.patch.CorePatchImplApiR; +import toolkit.coderstory.patch.CorePatchImplApiS; +import toolkit.coderstory.patch.CorePatchImplApiT; +import toolkit.coderstory.patch.CorePatchImplApiU; +import toolkit.coderstory.patch.CorePatchUnsupported; + +import de.robv.android.xposed.IXposedHookLoadPackage; +import de.robv.android.xposed.IXposedHookZygoteInit; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; -public class XposedHelper { +public abstract class CorePatch implements IXposedHookLoadPackage, IXposedHookZygoteInit { public final String SIGNATURE = "308203c6308202aea003020102021426d148b7c65944abcf3a683b4c3dd3b139c4ec85300d06092a864886f70d01010b05003074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964301e170d3139303130323138353233385a170d3439303130323138353233385a3074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f696430820122300d06092a864886f70d01010105000382010f003082010a028201010087fcde48d9beaeba37b733a397ae586fb42b6c3f4ce758dc3ef1327754a049b58f738664ece587994f1c6362f98c9be5fe82c72177260c390781f74a10a8a6f05a6b5ca0c7c5826e15526d8d7f0e74f2170064896b0cf32634a388e1a975ed6bab10744d9b371cba85069834bf098f1de0205cdee8e715759d302a64d248067a15b9beea11b61305e367ac71b1a898bf2eec7342109c9c5813a579d8a1b3e6a3fe290ea82e27fdba748a663f73cca5807cff1e4ad6f3ccca7c02945926a47279d1159599d4ecf01c9d0b62e385c6320a7a1e4ddc9833f237e814b34024b9ad108a5b00786ea15593a50ca7987cbbdc203c096eed5ff4bf8a63d27d33ecc963990203010001a350304e300c0603551d13040530030101ff301d0603551d0e04160414a361efb002034d596c3a60ad7b0332012a16aee3301f0603551d23041830168014a361efb002034d596c3a60ad7b0332012a16aee3300d06092a864886f70d01010b0500038201010022ccb684a7a8706f3ee7c81d6750fd662bf39f84805862040b625ddf378eeefae5a4f1f283deea61a3c7f8e7963fd745415153a531912b82b596e7409287ba26fb80cedba18f22ae3d987466e1fdd88e440402b2ea2819db5392cadee501350e81b8791675ea1a2ed7ef7696dff273f13fb742bb9625fa12ce9c2cb0b7b3d94b21792f1252b1d9e4f7012cb341b62ff556e6864b40927e942065d8f0f51273fcda979b8832dd5562c79acf719de6be5aee2a85f89265b071bf38339e2d31041bc501d5e0c034ab1cd9c64353b10ee70b49274093d13f733eb9d3543140814c72f8e003f301c7a00b1872cc008ad55e26df2e8f07441002c4bcb7dc746745f0db"; + public static CorePatch getImpl() { + switch (Build.VERSION.SDK_INT) { + case Build.VERSION_CODES.UPSIDE_DOWN_CAKE: // 34 + return new CorePatchImplApiU(); + case Build.VERSION_CODES.TIRAMISU: // 33 + return new CorePatchImplApiT(); + case Build.VERSION_CODES.S_V2: // 32 + case Build.VERSION_CODES.S: // 31 + return new CorePatchImplApiS(); + case Build.VERSION_CODES.R: // 30 + return new CorePatchImplApiR(); + case Build.VERSION_CODES.Q: // 29 + case Build.VERSION_CODES.P: // 28 + return new CorePatchImplApiP(); + default: + return new CorePatchUnsupported(); + } + } + public static void findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) { try { if (findClass(className, classLoader) != null) { @@ -71,4 +100,9 @@ public static void hookAllConstructors(String className, XC_MethodHook callback) XposedBridge.log("E/" + MainHook.TAG + " " + Log.getStackTraceString(e)); } } + + @Override + public void initZygote(StartupParam startupParam) { + // Remove error `Unhandled exception: ...` + } } diff --git a/app/src/main/java/toolkit/coderstory/MainHook.java b/app/src/main/java/toolkit/coderstory/MainHook.java index a78fbb8..a96fd62 100644 --- a/app/src/main/java/toolkit/coderstory/MainHook.java +++ b/app/src/main/java/toolkit/coderstory/MainHook.java @@ -15,60 +15,24 @@ public class MainHook implements IXposedHookLoadPackage, IXposedHookZygoteInit { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { if (("android".equals(lpparam.packageName)) && (lpparam.processName.equals("android"))) { - if (BuildConfig.DEBUG) + if (BuildConfig.DEBUG) { XposedBridge.log("D/" + TAG + " handleLoadPackage"); - switch (Build.VERSION.SDK_INT) { - case Build.VERSION_CODES.UPSIDE_DOWN_CAKE: // 34 - new CorePatchForU().handleLoadPackage(lpparam); - break; - case Build.VERSION_CODES.TIRAMISU: // 33 - new CorePatchForT().handleLoadPackage(lpparam); - break; - case Build.VERSION_CODES.S_V2: // 32 - case Build.VERSION_CODES.S: // 31 - new CorePatchForS().handleLoadPackage(lpparam); - break; - case Build.VERSION_CODES.R: // 30 - new CorePatchForR().handleLoadPackage(lpparam); - break; - case Build.VERSION_CODES.Q: // 29 - case Build.VERSION_CODES.P: // 28 - new CorePatchForQ().handleLoadPackage(lpparam); - break; - default: - XposedBridge.log("W/" + TAG + " Unsupported Version of Android " + Build.VERSION.SDK_INT); - break; } + + final var corePatchImpl = CorePatch.getImpl(); + corePatchImpl.handleLoadPackage(lpparam); } } @Override public void initZygote(StartupParam startupParam) { if (startupParam.startsSystemServer) { - if (BuildConfig.DEBUG) + if (BuildConfig.DEBUG) { XposedBridge.log("D/" + TAG + " initZygote: Current sdk version " + Build.VERSION.SDK_INT); - switch (Build.VERSION.SDK_INT) { - case Build.VERSION_CODES.UPSIDE_DOWN_CAKE: // 34 - new CorePatchForU().initZygote(startupParam); - break; - case Build.VERSION_CODES.TIRAMISU: // 33 - new CorePatchForT().initZygote(startupParam); - break; - case Build.VERSION_CODES.S_V2: // 32 - case Build.VERSION_CODES.S: // 31 - new CorePatchForS().initZygote(startupParam); - break; - case Build.VERSION_CODES.R: // 30 - new CorePatchForR().initZygote(startupParam); - break; - case Build.VERSION_CODES.Q: // 29 - case Build.VERSION_CODES.P: // 28 - new CorePatchForQ().initZygote(startupParam); - break; - default: - XposedBridge.log("W/" + TAG + " Unsupported Version of Android " + Build.VERSION.SDK_INT); - break; } + + final var corePatchImpl = CorePatch.getImpl(); + corePatchImpl.initZygote(startupParam); } } } diff --git a/app/src/main/java/toolkit/coderstory/CorePatchForQ.java b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiP.java similarity index 97% rename from app/src/main/java/toolkit/coderstory/CorePatchForQ.java rename to app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiP.java index 0923c58..ebfb87a 100644 --- a/app/src/main/java/toolkit/coderstory/CorePatchForQ.java +++ b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiP.java @@ -1,4 +1,4 @@ -package toolkit.coderstory; +package toolkit.coderstory.patch; import android.content.pm.ApplicationInfo; @@ -11,15 +11,15 @@ import java.lang.reflect.InvocationTargetException; import java.util.Arrays; -import de.robv.android.xposed.IXposedHookLoadPackage; -import de.robv.android.xposed.IXposedHookZygoteInit; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; +import toolkit.coderstory.CorePatch; +import toolkit.coderstory.ReturnConstant; -public class CorePatchForQ extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit { +public class CorePatchImplApiP extends CorePatch { final XSharedPreferences prefs = new XSharedPreferences(BuildConfig.APPLICATION_ID, "conf"); @Override diff --git a/app/src/main/java/toolkit/coderstory/CorePatchForR.java b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiR.java similarity index 99% rename from app/src/main/java/toolkit/coderstory/CorePatchForR.java rename to app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiR.java index a940bb5..0b44cd0 100644 --- a/app/src/main/java/toolkit/coderstory/CorePatchForR.java +++ b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiR.java @@ -1,4 +1,4 @@ -package toolkit.coderstory; +package toolkit.coderstory.patch; import android.annotation.TargetApi; @@ -26,17 +26,18 @@ import java.util.Objects; import java.util.zip.ZipEntry; -import de.robv.android.xposed.IXposedHookLoadPackage; -import de.robv.android.xposed.IXposedHookZygoteInit; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; +import toolkit.coderstory.CorePatch; +import toolkit.coderstory.MainHook; +import toolkit.coderstory.ReturnConstant; @TargetApi(Build.VERSION_CODES.R) -public class CorePatchForR extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit { +public class CorePatchImplApiR extends CorePatch { private final static Method deoptimizeMethod; static { @@ -423,7 +424,6 @@ Class getSigningDetails(ClassLoader classLoader) { @Override public void initZygote(StartupParam startupParam) { - hookAllMethods("android.content.pm.PackageParser", null, "getApkSigningVersion", XC_MethodReplacement.returnConstant(1)); hookAllConstructors("android.util.jar.StrictJarVerifier", new XC_MethodHook() { @Override diff --git a/app/src/main/java/toolkit/coderstory/CorePatchForS.java b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiS.java similarity index 90% rename from app/src/main/java/toolkit/coderstory/CorePatchForS.java rename to app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiS.java index 0a22cd1..89a8dea 100644 --- a/app/src/main/java/toolkit/coderstory/CorePatchForS.java +++ b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiS.java @@ -1,4 +1,7 @@ -package toolkit.coderstory; +package toolkit.coderstory.patch; + +import android.annotation.TargetApi; +import android.os.Build; import java.lang.reflect.InvocationTargetException; @@ -7,7 +10,8 @@ import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; -public class CorePatchForS extends CorePatchForR { +@TargetApi(Build.VERSION_CODES.S) +public class CorePatchImplApiS extends CorePatchImplApiR { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException { super.handleLoadPackage(loadPackageParam); diff --git a/app/src/main/java/toolkit/coderstory/CorePatchForT.java b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiT.java similarity index 96% rename from app/src/main/java/toolkit/coderstory/CorePatchForT.java rename to app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiT.java index 8380e1e..cd0fca4 100644 --- a/app/src/main/java/toolkit/coderstory/CorePatchForT.java +++ b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiT.java @@ -1,120 +1,124 @@ -package toolkit.coderstory; - -import android.content.pm.Signature; - -import java.io.PrintWriter; -import java.lang.reflect.InvocationTargetException; - -import de.robv.android.xposed.XC_MethodHook; -import de.robv.android.xposed.XposedBridge; -import de.robv.android.xposed.XposedHelpers; -import de.robv.android.xposed.callbacks.XC_LoadPackage; - -public class CorePatchForT extends CorePatchForS { - @Override - public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException { - super.handleLoadPackage(loadPackageParam); - var checkDowngrade = XposedHelpers.findMethodExactIfExists("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader, - "checkDowngrade", - "com.android.server.pm.parsing.pkg.AndroidPackage", - "android.content.pm.PackageInfoLite"); - if (checkDowngrade != null) { - XposedBridge.hookMethod(checkDowngrade, new ReturnConstant(prefs, "downgrade", null)); - } - - Class signingDetails = getSigningDetails(loadPackageParam.classLoader); - //New package has a different signature - //处理覆盖安装但签名不一致 - hookAllMethods(signingDetails, "checkCapability", new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) { - // Don't handle PERMISSION (grant SIGNATURE permissions to pkgs with this cert) - // Or applications will have all privileged permissions - // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/pm/PackageParser.java;l=5947?q=CertCapabilities - if (prefs.getBoolean("digestCreak", true)) { - if ((Integer) param.args[1] != 4) { - param.setResult(true); - } - } - } - }); - - findAndHookMethod("com.android.server.pm.InstallPackageHelper", loadPackageParam.classLoader, - "doesSignatureMatchForPermissions", String.class, - "com.android.server.pm.parsing.pkg.ParsedPackage", int.class, new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) { - if (prefs.getBoolean("digestCreak", true) && prefs.getBoolean("UsePreSig", false)) { - //If we decide to crack this then at least make sure they are same apks, avoid another one that tries to impersonate. - if (param.getResult().equals(false)) { - String pPname = (String) XposedHelpers.callMethod(param.args[1], "getPackageName"); - if (pPname.contentEquals((String) param.args[0])) { - param.setResult(true); - } - } - } - } - }); - - var assertMinSignatureSchemeIsValid = XposedHelpers.findMethodExactIfExists("com.android.server.pm.ScanPackageUtils", loadPackageParam.classLoader, - "assertMinSignatureSchemeIsValid", - "com.android.server.pm.parsing.pkg.AndroidPackage", int.class); - if (assertMinSignatureSchemeIsValid != null) { - XposedBridge.hookMethod(assertMinSignatureSchemeIsValid, new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) { - if (prefs.getBoolean("authcreak", false)) { - param.setResult(null); - } - } - }); - } - - Class strictJarVerifier = findClass("android.util.jar.StrictJarVerifier", loadPackageParam.classLoader); - if (strictJarVerifier != null) { - XposedBridge.hookAllConstructors(strictJarVerifier, new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) { - if (prefs.getBoolean("authcreak", false)) { - XposedHelpers.setBooleanField(param.thisObject, "signatureSchemeRollbackProtectionsEnforced", false); - } - } - }); - } - - // ensure verifySignatures success - // https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java;l=621;drc=2e50991320cbef77d3e8504a4b284adae8c2f4d2 - var utils = XposedHelpers.findClassIfExists("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader); - if (utils != null) { - deoptimizeMethod(utils, "canJoinSharedUserId"); - } - } - - Class getSigningDetails(ClassLoader classLoader) { - return XposedHelpers.findClassIfExists("android.content.pm.SigningDetails", classLoader); - } - - @Override - protected void dumpSigningDetails(Object signingDetails, PrintWriter pw) { - var i = 0; - for (var sign : (Signature[]) XposedHelpers.callMethod(signingDetails, "getSignatures")) { - i++; - pw.println(i + ": " + sign.toCharsString()); - } - } - - @Override - protected Object SharedUserSetting_packages(Object sharedUser) { - return XposedHelpers.getObjectField(sharedUser, "mPackages"); - } - - @Override - protected Object SigningDetails_mergeLineageWith(Object self, Object other) { - return XposedHelpers.callMethod(self, "mergeLineageWith", other, 2 /*MERGE_RESTRICTED_CAPABILITY*/); - } - - @Override - Class getIsVerificationEnabledClass(ClassLoader classLoader) { - return XposedHelpers.findClass("com.android.server.pm.VerificationParams", classLoader); - } -} +package toolkit.coderstory.patch; + +import android.annotation.TargetApi; +import android.content.pm.Signature; +import android.os.Build; + +import java.io.PrintWriter; +import java.lang.reflect.InvocationTargetException; + +import de.robv.android.xposed.XC_MethodHook; +import de.robv.android.xposed.XposedBridge; +import de.robv.android.xposed.XposedHelpers; +import de.robv.android.xposed.callbacks.XC_LoadPackage; +import toolkit.coderstory.ReturnConstant; + +@TargetApi(Build.VERSION_CODES.TIRAMISU) +public class CorePatchImplApiT extends CorePatchImplApiS { + @Override + public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException { + super.handleLoadPackage(loadPackageParam); + var checkDowngrade = XposedHelpers.findMethodExactIfExists("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader, + "checkDowngrade", + "com.android.server.pm.parsing.pkg.AndroidPackage", + "android.content.pm.PackageInfoLite"); + if (checkDowngrade != null) { + XposedBridge.hookMethod(checkDowngrade, new ReturnConstant(prefs, "downgrade", null)); + } + + Class signingDetails = getSigningDetails(loadPackageParam.classLoader); + //New package has a different signature + //处理覆盖安装但签名不一致 + hookAllMethods(signingDetails, "checkCapability", new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) { + // Don't handle PERMISSION (grant SIGNATURE permissions to pkgs with this cert) + // Or applications will have all privileged permissions + // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/pm/PackageParser.java;l=5947?q=CertCapabilities + if (prefs.getBoolean("digestCreak", true)) { + if ((Integer) param.args[1] != 4) { + param.setResult(true); + } + } + } + }); + + findAndHookMethod("com.android.server.pm.InstallPackageHelper", loadPackageParam.classLoader, + "doesSignatureMatchForPermissions", String.class, + "com.android.server.pm.parsing.pkg.ParsedPackage", int.class, new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) { + if (prefs.getBoolean("digestCreak", true) && prefs.getBoolean("UsePreSig", false)) { + //If we decide to crack this then at least make sure they are same apks, avoid another one that tries to impersonate. + if (param.getResult().equals(false)) { + String pPname = (String) XposedHelpers.callMethod(param.args[1], "getPackageName"); + if (pPname.contentEquals((String) param.args[0])) { + param.setResult(true); + } + } + } + } + }); + + var assertMinSignatureSchemeIsValid = XposedHelpers.findMethodExactIfExists("com.android.server.pm.ScanPackageUtils", loadPackageParam.classLoader, + "assertMinSignatureSchemeIsValid", + "com.android.server.pm.parsing.pkg.AndroidPackage", int.class); + if (assertMinSignatureSchemeIsValid != null) { + XposedBridge.hookMethod(assertMinSignatureSchemeIsValid, new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) { + if (prefs.getBoolean("authcreak", false)) { + param.setResult(null); + } + } + }); + } + + Class strictJarVerifier = findClass("android.util.jar.StrictJarVerifier", loadPackageParam.classLoader); + if (strictJarVerifier != null) { + XposedBridge.hookAllConstructors(strictJarVerifier, new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) { + if (prefs.getBoolean("authcreak", false)) { + XposedHelpers.setBooleanField(param.thisObject, "signatureSchemeRollbackProtectionsEnforced", false); + } + } + }); + } + + // ensure verifySignatures success + // https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java;l=621;drc=2e50991320cbef77d3e8504a4b284adae8c2f4d2 + var utils = XposedHelpers.findClassIfExists("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader); + if (utils != null) { + deoptimizeMethod(utils, "canJoinSharedUserId"); + } + } + + Class getSigningDetails(ClassLoader classLoader) { + return XposedHelpers.findClassIfExists("android.content.pm.SigningDetails", classLoader); + } + + @Override + protected void dumpSigningDetails(Object signingDetails, PrintWriter pw) { + var i = 0; + for (var sign : (Signature[]) XposedHelpers.callMethod(signingDetails, "getSignatures")) { + i++; + pw.println(i + ": " + sign.toCharsString()); + } + } + + @Override + protected Object SharedUserSetting_packages(Object sharedUser) { + return XposedHelpers.getObjectField(sharedUser, "mPackages"); + } + + @Override + protected Object SigningDetails_mergeLineageWith(Object self, Object other) { + return XposedHelpers.callMethod(self, "mergeLineageWith", other, 2 /*MERGE_RESTRICTED_CAPABILITY*/); + } + + @Override + Class getIsVerificationEnabledClass(ClassLoader classLoader) { + return XposedHelpers.findClass("com.android.server.pm.VerificationParams", classLoader); + } +} diff --git a/app/src/main/java/toolkit/coderstory/CorePatchForU.java b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiU.java similarity index 90% rename from app/src/main/java/toolkit/coderstory/CorePatchForU.java rename to app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiU.java index bf146e6..1413231 100644 --- a/app/src/main/java/toolkit/coderstory/CorePatchForU.java +++ b/app/src/main/java/toolkit/coderstory/patch/CorePatchImplApiU.java @@ -1,5 +1,7 @@ -package toolkit.coderstory; +package toolkit.coderstory.patch; +import android.annotation.TargetApi; +import android.os.Build; import android.util.Log; import java.lang.reflect.InvocationTargetException; @@ -8,8 +10,11 @@ import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; +import toolkit.coderstory.MainHook; +import toolkit.coderstory.ReturnConstant; -public class CorePatchForU extends CorePatchForT { +@TargetApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) +public class CorePatchImplApiU extends CorePatchImplApiT { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException { super.handleLoadPackage(loadPackageParam); diff --git a/app/src/main/java/toolkit/coderstory/patch/CorePatchUnsupported.java b/app/src/main/java/toolkit/coderstory/patch/CorePatchUnsupported.java new file mode 100644 index 0000000..6f67b80 --- /dev/null +++ b/app/src/main/java/toolkit/coderstory/patch/CorePatchUnsupported.java @@ -0,0 +1,29 @@ +package toolkit.coderstory.patch; + +import android.os.Build; + +import de.robv.android.xposed.XposedBridge; +import de.robv.android.xposed.callbacks.XC_LoadPackage; + +import toolkit.coderstory.CorePatch; +import static toolkit.coderstory.MainHook.TAG; + +public class CorePatchUnsupported extends CorePatch { + + private void logWarning() { + XposedBridge.log("W/" + TAG + " Unsupported Version of Android " + Build.VERSION.SDK_INT); + } + + @Override + public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) { + // Unsupported version of Android + logWarning(); + } + + @Override + public void initZygote(StartupParam startupParam) { + // Unsupported version of Android + logWarning(); + } + +}