From 4ea417beff7b1e007fc3ec08fe1c393370d5829f Mon Sep 17 00:00:00 2001 From: chiteroman <98092901+chiteroman@users.noreply.github.com> Date: Tue, 2 Jan 2024 21:57:34 +0100 Subject: [PATCH] v3.8 --- app/build.gradle | 4 +- app/release/output-metadata.json | 4 +- .../chiteroman/bootloaderspoofer/Xposed.java | 91 +++++++++++-------- app/src/main/res/values/arrays.xml | 1 + 4 files changed, 57 insertions(+), 43 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 32463f0..e3222cb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "es.chiteroman.bootloaderspoofer" minSdk 26 targetSdk 34 - versionCode 37 - versionName '3.7' + versionCode 38 + versionName '3.8' } buildTypes { diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 999cadc..a0f375f 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 37, - "versionName": "3.7", + "versionCode": 38, + "versionName": "3.8", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/java/es/chiteroman/bootloaderspoofer/Xposed.java b/app/src/main/java/es/chiteroman/bootloaderspoofer/Xposed.java index bd6d82a..e2a0d78 100644 --- a/app/src/main/java/es/chiteroman/bootloaderspoofer/Xposed.java +++ b/app/src/main/java/es/chiteroman/bootloaderspoofer/Xposed.java @@ -1,8 +1,8 @@ package es.chiteroman.bootloaderspoofer; import android.app.AndroidAppHelper; +import android.app.Application; import android.content.Context; -import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyProperties; @@ -39,6 +39,8 @@ import org.bouncycastle.util.io.pem.PemReader; import java.io.StringReader; import java.math.BigInteger; import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.KeyPairGeneratorSpi; import java.security.KeyStore; import java.security.KeyStoreSpi; import java.security.SecureRandom; @@ -50,6 +52,7 @@ import java.util.LinkedList; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; +import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; @@ -537,8 +540,7 @@ public final class Xposed implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { - PackageManager pm = AndroidAppHelper.currentApplication().getPackageManager(); - SharedPreferences sp = AndroidAppHelper.currentApplication().getSharedPreferences("settings", Context.MODE_PRIVATE); + if (!lpparam.isFirstApplication) return; final var systemFeatureHook = new XC_MethodHook() { @Override @@ -554,52 +556,63 @@ public final class Xposed implements IXposedHookLoadPackage { } }; - XposedHelpers.findAndHookMethod(pm.getClass(), "hasSystemFeature", String.class, systemFeatureHook); - XposedHelpers.findAndHookMethod(pm.getClass(), "hasSystemFeature", String.class, int.class, systemFeatureHook); + try { + Application app = AndroidAppHelper.currentApplication(); - XposedHelpers.findAndHookMethod(sp.getClass(), "getBoolean", String.class, boolean.class, new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) { - String key = (String) param.args[0]; + Class PackageManagerClass, SharedPreferencesClass; - if ("prefer_attest_key".equals(key)) param.setResult(Boolean.FALSE); + if (app == null) { + PackageManagerClass = XposedHelpers.findClass("android.app.ApplicationPackageManager", lpparam.classLoader); + SharedPreferencesClass = XposedHelpers.findClass("android.app.SharedPreferencesImpl", lpparam.classLoader); + } else { + PackageManagerClass = app.getPackageManager().getClass(); + SharedPreferencesClass = app.getSharedPreferences("settings", Context.MODE_PRIVATE).getClass(); } - }); - XposedHelpers.findAndHookMethod(KeyGenParameterSpec.Builder.class, "setAttestationChallenge", byte[].class, new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) { - attestationChallengeBytes = (byte[]) param.args[0]; - } - }); + XposedHelpers.findAndHookMethod(PackageManagerClass, "hasSystemFeature", String.class, systemFeatureHook); + XposedHelpers.findAndHookMethod(PackageManagerClass, "hasSystemFeature", String.class, int.class, systemFeatureHook); - XposedHelpers.findAndHookMethod("android.security.keystore2.AndroidKeyStoreKeyPairGeneratorSpi", lpparam.classLoader, "generateKeyPair", new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) { - KeyPair kp = null; + XposedHelpers.findAndHookMethod(SharedPreferencesClass, "getBoolean", String.class, boolean.class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) { + String key = (String) param.args[0]; - try { - kp = (KeyPair) param.getResultOrThrowable(); - } catch (Throwable t) { - XposedBridge.log(t); + if ("prefer_attest_key".equals(key)) param.setResult(Boolean.FALSE); } + }); + } catch (Throwable t) { + XposedBridge.log(t); + } - if (kp == null) { - - kp = keyPair_EC; - - } else { - String algorithm = kp.getPrivate().getAlgorithm(); - if (KeyProperties.KEY_ALGORITHM_EC.equals(algorithm)) { - kp = keyPair_EC; - } else { - kp = keyPair_RSA; - } + try { + XposedHelpers.findAndHookMethod(KeyGenParameterSpec.Builder.class, "setAttestationChallenge", byte[].class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) { + attestationChallengeBytes = (byte[]) param.args[0]; } + }); + } catch (Throwable t) { + XposedBridge.log(t); + } - param.setResult(kp); - } - }); + try { + KeyPairGeneratorSpi keyPairGeneratorSpi_EC = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); + XposedHelpers.findAndHookMethod(keyPairGeneratorSpi_EC.getClass(), "generateKeyPair", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) { + return keyPair_EC; + } + }); + KeyPairGeneratorSpi keyPairGeneratorSpi_RSA = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); + XposedHelpers.findAndHookMethod(keyPairGeneratorSpi_RSA.getClass(), "generateKeyPair", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) { + return keyPair_RSA; + } + }); + } catch (Throwable t) { + XposedBridge.log(t); + } try { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index be69301..4fa3c15 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -2,5 +2,6 @@ io.github.vvb2060.keyattestation + io.github.vvb2060.mahoshojo \ No newline at end of file