Compare commits

..
29 changed files with 124 additions and 100 deletions

43
.github/workflows/android.yml vendored Normal file
View file

@ -0,0 +1,43 @@
name: Android CI
on:
push:
branches: [ main ]
pull_request:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: 21
distribution: 'temurin'
cache: 'gradle'
- name: Write key
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
run: |
if [ ! -z "${{ secrets.SIGNING_KEY }}" ]; then
echo releaseStorePassword='${{ secrets.KEY_STORE_PASSWORD }}' >> gradle.properties
echo releaseKeyAlias='${{ secrets.ALIAS }}' >> gradle.properties
echo releaseKeyPassword='${{ secrets.KEY_PASSWORD }}' >> gradle.properties
echo releaseStoreFile='key.jks' >> gradle.properties
echo ${{ secrets.SIGNING_KEY }} | base64 --decode > key.jks
fi
- name: Build with Gradle
run: ./gradlew assembleRelease assembleDebug
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: Signed app bundle
path: app/build/outputs/apk

49
README.md Normal file
View file

@ -0,0 +1,49 @@
# CorePatch
```
A Module For Xposed Framework
Disable signature verification For Android
```
![Android CI](https://github.com/coderstory/CorePatch/workflows/Android%20CI/badge.svg) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/coderstory/CorePatch) ![CRAN/METACRAN](https://img.shields.io/cran/l/devtools)
### Description
```
branch master -> support android 4.4-7.x
Android8.x -> maybe you need find the commit what change version name to 2.1,then compile by you self
branch Q -> support android 9.0-10.0
branch main -> support android 10-15
```
## Features
```
allows to downgrade application, suppresses [INSTALL_FAILED_VERSION_DOWNGRADE]
allows to directly install apps after modifing APK file [ignore invalid digest error etc..]
allows overlay install apps with inconsistent signatures
```
### History
You can download history version from https://soft.shouji.com.cn/down/32512.html
### Thanks
```
weishu: Reference some code
LSPosed Hook Framework for ART
lovesykun: Technical support
```
### License
CorePatch is released under the GPL V2 license. See LICENSE for details.
### CI
You can download dev build from github actions
https://github.com/coderstory/CorePatch/actions
### Community
[TG Chat](https://t.me/core_patch_chat)
### Donate
[paypal](http://paypal.me/code620)

View file

@ -10,14 +10,14 @@ val releaseKeyAlias: String? by rootProject
val releaseKeyPassword: String? by rootProject
android {
compileSdk = 36
buildToolsVersion = "36.0.0"
compileSdk = 35
buildToolsVersion = "35.0.0"
defaultConfig {
applicationId = "com.mbcp.helper"
minSdk = 28
targetSdk = 36
versionCode = 2031
versionName = "1.5-mbcp"
minSdk = 31
targetSdk = 35
versionCode = 2030
versionName = "1.1-mbcp"
}
signingConfigs {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

View file

@ -48,7 +48,7 @@ public class CorePatchForQ extends XposedHelper implements IXposedHookLoadPackag
hookAllMethods("java.security.MessageDigest", loadPackageParam.classLoader, "isEqual",
new ReturnConstant(prefs, "authcreak", true));
hookAllMethods("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader, "verifySignatures",
new ReturnConstant(prefs, "authcreak", false));
new ReturnConstant(prefs, "authcreak", true));
Class<?> signingDetails = XposedHelpers.findClass("android.content.pm.PackageParser.SigningDetails", loadPackageParam.classLoader);
Constructor<?> findConstructorExact = XposedHelpers.findConstructorExact(signingDetails, Signature[].class, Integer.TYPE);
@ -62,7 +62,7 @@ public class CorePatchForQ extends XposedHelper implements IXposedHookLoadPackag
final Object newInstance = findConstructorExact.newInstance(signingDetailsArgs);
hookAllMethods("android.util.apk.ApkSignatureVerifier", loadPackageParam.classLoader, "verifyV1Signature", new XC_MethodHook() {
public void afterHookedMethod(MethodHookParam methodHookParam) throws Throwable {
if (prefs.getBoolean("authcreak", false)) {
if (prefs.getBoolean("authcreak", true)) {
Throwable throwable = methodHookParam.getThrowable();
if (throwable != null) {
Throwable cause = throwable.getCause();
@ -149,14 +149,5 @@ public class CorePatchForQ extends XposedHelper implements IXposedHookLoadPackag
"isVerificationEnabled",
new ReturnConstant(prefs, "disableVerificationAgent", false)
);
// Allow apk splits with different signatures to be installed together
hookAllMethods(signingDetails, "signaturesMatchExactly", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
if (prefs.getBoolean("exactSigCheck", false))
param.setResult(true);
}
});
}
}

View file

@ -63,9 +63,8 @@ public class CorePatchForR extends XposedHelper implements IXposedHookLoadPackag
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
if (BuildConfig.DEBUG) {
XposedBridge.log("D/" + MainHook.TAG + " downgrade=" + prefs.getBoolean("downgrade", true));
XposedBridge.log("D/" + MainHook.TAG + " authcreak=" + prefs.getBoolean("authcreak", false));
XposedBridge.log("D/" + MainHook.TAG + " authcreak=" + prefs.getBoolean("authcreak", true));
XposedBridge.log("D/" + MainHook.TAG + " digestCreak=" + prefs.getBoolean("digestCreak", true));
XposedBridge.log("D/" + MainHook.TAG + " exactSigCheck=" + prefs.getBoolean("exactSigCheck", false));
XposedBridge.log("D/" + MainHook.TAG + " UsePreSig=" + prefs.getBoolean("UsePreSig", false));
XposedBridge.log("D/" + MainHook.TAG + " bypassBlock=" + prefs.getBoolean("bypassBlock", true));
XposedBridge.log("D/" + MainHook.TAG + " sharedUser=" + prefs.getBoolean("sharedUser", false));
@ -263,19 +262,7 @@ public class CorePatchForR extends XposedHelper implements IXposedHookLoadPackag
hookAllMethods(keySetManagerClass, "shouldCheckUpgradeKeySetLocked", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
// 检查权限定义的签名的时候,如果定义包名相同,会使用 KeySetManagerService ,
// 我们利用这一点让它通过检查,也就是同包不同签名权限可覆盖
// R-Sv2: PackageManagerService#preparePackageLI
// https://cs.android.com/android/platform/superproject/+/android-11.0.0_r21:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java;l=17188;drc=960ffca13a519b0fb9e0942665577c62f97d0eea
// T-V: InstallPackageHelper#preparePackageLI
// https://cs.android.com/android/platform/superproject/+/android-14.0.0_r2:frameworks/base/services/core/java/com/android/server/pm/InstallPackageHelper.java;l=1097;drc=5ea7e53c3a787e25af86b0f31933ddd68ae3514e
// 16: InstallPackageHelper#preparePackage
// https://cs.android.com/android/platform/superproject/+/android-16.0.0_r2:frameworks/base/services/core/java/com/android/server/pm/InstallPackageHelper.java;l=1459;drc=d14620262929e39a409b55d11cb542c1d1c4d2f6
if (prefs.getBoolean("digestCreak", true) &&
Arrays.stream(Thread.currentThread().getStackTrace())
.anyMatch((o) -> o.getMethodName().startsWith("preparePackage")
)
) {
if (prefs.getBoolean("digestCreak", true) && Arrays.stream(Thread.currentThread().getStackTrace()).anyMatch((o) -> "preparePackageLI".equals(o.getMethodName()))) {
shouldBypass.set(true);
param.setResult(true);
} else {
@ -407,15 +394,6 @@ public class CorePatchForR extends XposedHelper implements IXposedHookLoadPackag
hookAllMethods(getIsVerificationEnabledClass(loadPackageParam.classLoader), "isVerificationEnabled", new ReturnConstant(prefs, "disableVerificationAgent", false));
// Allow apk splits with different signatures to be installed together
hookAllMethods(signingDetails, "signaturesMatchExactly", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
if (prefs.getBoolean("exactSigCheck", false))
param.setResult(true);
}
});
if (BuildConfig.DEBUG) initializeDebugHook(loadPackageParam);
}

View file

@ -65,7 +65,7 @@ public class CorePatchForT extends CorePatchForS {
XposedBridge.hookMethod(assertMinSignatureSchemeIsValid, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
if (prefs.getBoolean("authcreak", false)) {
if (prefs.getBoolean("authcreak", true)) {
param.setResult(null);
}
}

View file

@ -21,12 +21,6 @@ public class CorePatchForU extends CorePatchForT {
XposedBridge.log("E/" + MainHook.TAG + " deoptimizing failed" + Log.getStackTraceString(e));
}
}
// https://cs.android.com/android/platform/superproject/+/android-14.0.0_r60:frameworks/base/services/core/java/com/android/server/pm/ReconcilePackageUtils.java;l=61;bpv=1;bpt=0
if (prefs.getBoolean("digestCreak", true) && prefs.getBoolean("sharedUser", false)) {
setStaticBooleanField(utilClass, "ALLOW_NON_PRELOADS_SYSTEM_SHAREDUIDS", true);
}
// ee11a9c (Rename AndroidPackageApi to AndroidPackage)
findAndHookMethod("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader,
"checkDowngrade",
@ -39,7 +33,7 @@ public class CorePatchForU extends CorePatchForT {
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
if (prefs.getBoolean("authcreak", false)) {
if (prefs.getBoolean("authcreak", true)) {
param.setResult(null);
}
}
@ -56,12 +50,6 @@ public class CorePatchForU extends CorePatchForT {
}
}
@Override
Class<?> getParsedPackage(ClassLoader classLoader) {
var clazz = XposedHelpers.findClassIfExists("com.android.internal.pm.parsing.pkg.ParsedPackage", classLoader);
return clazz != null ? clazz : XposedHelpers.findClassIfExists("com.android.server.pm.parsing.pkg.ParsedPackage", classLoader);
}
@Override
Class<?> getIsVerificationEnabledClass(ClassLoader classLoader) {
return XposedHelpers.findClass("com.android.server.pm.VerifyingSession", classLoader);

View file

@ -17,7 +17,6 @@ public class MainHook implements IXposedHookLoadPackage {
if (BuildConfig.DEBUG)
XposedBridge.log("D/" + TAG + " handleLoadPackage");
switch (Build.VERSION.SDK_INT) {
case Build.VERSION_CODES.BAKLAVA: // 36
case Build.VERSION_CODES.VANILLA_ICE_CREAM: // 35
new CorePatchForV().handleLoadPackage(lpparam);
break;
@ -40,8 +39,6 @@ public class MainHook implements IXposedHookLoadPackage {
break;
default:
XposedBridge.log("W/" + TAG + " Unsupported Version of Android " + Build.VERSION.SDK_INT);
XposedBridge.log("I/" + TAG + " Falling back to latest SDK");
new CorePatchForV().handleLoadPackage(lpparam);
break;
}
}

View file

@ -52,15 +52,6 @@ public class XposedHelper {
}
}
public static void setStaticBooleanField(Class<?> hookClass, String fieldName, boolean value) {
try {
XposedHelpers.setStaticBooleanField(hookClass, fieldName, value);
} catch (Throwable e) {
if (BuildConfig.DEBUG)
XposedBridge.log("E/" + MainHook.TAG + " " + Log.getStackTraceString(e));
}
}
public static Class<?> findClass(String className, ClassLoader classLoader) {
try {
return Class.forName(className, false, classLoader);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before After
Before After

Some files were not shown because too many files have changed in this diff Show more