Skip to content

Commit

Permalink
Allow re-install app with different signatures and permission declared (
Browse files Browse the repository at this point in the history
#82)

Allow packages to redefine its own permissions, without throwing
`INSTALL_FAILED_DUPLICATE_PERMISSION` exception when `digestCreak` is
enabled.
  • Loading branch information
5ec1cff authored Aug 4, 2023
1 parent 51ae65c commit 02cbc1e
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
26 changes: 26 additions & 0 deletions app/src/main/java/toolkit/coderstory/CorePatchForQ.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@

import android.content.pm.ApplicationInfo;
import android.content.pm.Signature;
import android.util.Log;

import com.coderstory.toolkit.BuildConfig;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
Expand Down Expand Up @@ -124,6 +126,30 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
}
});

var keySetManagerClass = findClass("com.android.server.pm.KeySetManagerService", loadPackageParam.classLoader);
if (keySetManagerClass != null) {
var shouldBypass = new ThreadLocal<Boolean>();
hookAllMethods(keySetManagerClass, "shouldCheckUpgradeKeySetLocked", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (prefs.getBoolean("digestCreak", true) && Arrays.stream(Thread.currentThread().getStackTrace()).anyMatch((o) -> "preparePackageLI".equals(o.getMethodName()))) {
shouldBypass.set(true);
param.setResult(true);
} else {
shouldBypass.set(false);
}
}
});
hookAllMethods(keySetManagerClass, "checkUpgradeKeySetLocked", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (prefs.getBoolean("digestCreak", true) && shouldBypass.get()) {
param.setResult(true);
}
}
});
}
}

@Override
Expand Down
25 changes: 25 additions & 0 deletions app/src/main/java/toolkit/coderstory/CorePatchForR.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.lang.reflect.Method;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
Expand Down Expand Up @@ -252,6 +253,30 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
}
}

var keySetManagerClass = findClass("com.android.server.pm.KeySetManagerService", loadPackageParam.classLoader);
if (keySetManagerClass != null) {
var shouldBypass = new ThreadLocal<Boolean>();
hookAllMethods(keySetManagerClass, "shouldCheckUpgradeKeySetLocked", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (prefs.getBoolean("digestCreak", true) && Arrays.stream(Thread.currentThread().getStackTrace()).anyMatch((o) -> "preparePackageLI".equals(o.getMethodName()))) {
shouldBypass.set(true);
param.setResult(true);
} else {
shouldBypass.set(false);
}
}
});
hookAllMethods(keySetManagerClass, "checkUpgradeKeySetLocked", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (prefs.getBoolean("digestCreak", true) && shouldBypass.get()) {
param.setResult(true);
}
}
});
}
}

Class<?> getSigningDetails(ClassLoader classLoader) {
Expand Down

0 comments on commit 02cbc1e

Please sign in to comment.