Skip to content

Commit

Permalink
v3.8
Browse files Browse the repository at this point in the history
  • Loading branch information
chiteroman committed Jan 2, 2024
1 parent f49984e commit 4ea417b
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 43 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ android {
applicationId "es.chiteroman.bootloaderspoofer"
minSdk 26
targetSdk 34
versionCode 37
versionName '3.7'
versionCode 38
versionName '3.8'
}

buildTypes {
Expand Down
4 changes: 2 additions & 2 deletions app/release/output-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 37,
"versionName": "3.7",
"versionCode": 38,
"versionName": "3.8",
"outputFile": "app-release.apk"
}
],
Expand Down
91 changes: 52 additions & 39 deletions app/src/main/java/es/chiteroman/bootloaderspoofer/Xposed.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -39,6 +39,8 @@
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;
Expand All @@ -50,6 +52,7 @@

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;
Expand Down Expand Up @@ -537,8 +540,7 @@ private static Certificate hackLeafExistingCert(Certificate certificate) {
@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
Expand All @@ -554,52 +556,63 @@ else if ("android.software.device_id_attestation".equals(featureName))
}
};

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");
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/arrays.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
<resources>
<string-array name="scope">
<item>io.github.vvb2060.keyattestation</item>
<item>io.github.vvb2060.mahoshojo</item>
</string-array>
</resources>

0 comments on commit 4ea417b

Please sign in to comment.