diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
deleted file mode 100644
index f113bf7..0000000
--- a/.github/workflows/android.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-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
diff --git a/README.md b/README.md
deleted file mode 100644
index de8ad77..0000000
--- a/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# CorePatch
-
-```
-A Module For Xposed Framework
-Disable signature verification For Android
- ```
-  
-
-### 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)
-
-
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 86ef909..2afd0b8 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -10,14 +10,14 @@ val releaseKeyAlias: String? by rootProject
val releaseKeyPassword: String? by rootProject
android {
- compileSdk = 35
- buildToolsVersion = "35.0.0"
+ compileSdk = 36
+ buildToolsVersion = "36.0.0"
defaultConfig {
applicationId = "com.mbcp.helper"
- minSdk = 31
- targetSdk = 35
- versionCode = 2030
- versionName = "1.1-mbcp"
+ minSdk = 28
+ targetSdk = 36
+ versionCode = 2031
+ versionName = "1.5-mbcp"
}
signingConfigs {
diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png
new file mode 100644
index 0000000..586b6ee
Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ
diff --git a/app/src/main/java/toolkit/coderstory/CorePatchForQ.java b/app/src/main/java/toolkit/coderstory/CorePatchForQ.java
index 861bd9e..72b05fc 100644
--- a/app/src/main/java/toolkit/coderstory/CorePatchForQ.java
+++ b/app/src/main/java/toolkit/coderstory/CorePatchForQ.java
@@ -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", true));
+ new ReturnConstant(prefs, "authcreak", false));
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", true)) {
+ if (prefs.getBoolean("authcreak", false)) {
Throwable throwable = methodHookParam.getThrowable();
if (throwable != null) {
Throwable cause = throwable.getCause();
@@ -149,5 +149,14 @@ 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);
+ }
+ });
}
}
diff --git a/app/src/main/java/toolkit/coderstory/CorePatchForR.java b/app/src/main/java/toolkit/coderstory/CorePatchForR.java
index f6268e7..4dd238f 100644
--- a/app/src/main/java/toolkit/coderstory/CorePatchForR.java
+++ b/app/src/main/java/toolkit/coderstory/CorePatchForR.java
@@ -63,8 +63,9 @@ 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", true));
+ XposedBridge.log("D/" + MainHook.TAG + " authcreak=" + prefs.getBoolean("authcreak", false));
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));
@@ -262,7 +263,19 @@ public class CorePatchForR extends XposedHelper implements IXposedHookLoadPackag
hookAllMethods(keySetManagerClass, "shouldCheckUpgradeKeySetLocked", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
- if (prefs.getBoolean("digestCreak", true) && Arrays.stream(Thread.currentThread().getStackTrace()).anyMatch((o) -> "preparePackageLI".equals(o.getMethodName()))) {
+ // 检查权限定义的签名的时候,如果定义包名相同,会使用 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")
+ )
+ ) {
shouldBypass.set(true);
param.setResult(true);
} else {
@@ -394,6 +407,15 @@ 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);
}
diff --git a/app/src/main/java/toolkit/coderstory/CorePatchForT.java b/app/src/main/java/toolkit/coderstory/CorePatchForT.java
index d8bf510..5059359 100644
--- a/app/src/main/java/toolkit/coderstory/CorePatchForT.java
+++ b/app/src/main/java/toolkit/coderstory/CorePatchForT.java
@@ -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", true)) {
+ if (prefs.getBoolean("authcreak", false)) {
param.setResult(null);
}
}
diff --git a/app/src/main/java/toolkit/coderstory/CorePatchForU.java b/app/src/main/java/toolkit/coderstory/CorePatchForU.java
index d6fd608..1a3dd66 100644
--- a/app/src/main/java/toolkit/coderstory/CorePatchForU.java
+++ b/app/src/main/java/toolkit/coderstory/CorePatchForU.java
@@ -21,6 +21,12 @@ 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",
@@ -33,7 +39,7 @@ public class CorePatchForU extends CorePatchForT {
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
- if (prefs.getBoolean("authcreak", true)) {
+ if (prefs.getBoolean("authcreak", false)) {
param.setResult(null);
}
}
@@ -50,6 +56,12 @@ 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);
diff --git a/app/src/main/java/toolkit/coderstory/MainHook.java b/app/src/main/java/toolkit/coderstory/MainHook.java
index c903e33..d24259b 100644
--- a/app/src/main/java/toolkit/coderstory/MainHook.java
+++ b/app/src/main/java/toolkit/coderstory/MainHook.java
@@ -17,6 +17,7 @@ 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;
@@ -39,6 +40,8 @@ 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;
}
}
diff --git a/app/src/main/java/toolkit/coderstory/XposedHelper.java b/app/src/main/java/toolkit/coderstory/XposedHelper.java
index dd64893..b63adcd 100644
--- a/app/src/main/java/toolkit/coderstory/XposedHelper.java
+++ b/app/src/main/java/toolkit/coderstory/XposedHelper.java
@@ -52,6 +52,15 @@ 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);
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 2937f69..7a8aae9 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
index 8ec4f50..7244b1f 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
index da5bc6e..520c6af 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 55d28e0..a0c5635 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
index c71b949..49193a8 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
index d8234c3..79db825 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index fdd614b..557ca48 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
index 4b0d19c..37c0ba9 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
index 4389a9e..1a5b46f 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 660fa96..0377390 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
index e656c88..2fb9108 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
index 4b21512..7e061d9 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index d25a9e4..5863d07 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
index cf8e422..1dfd158 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
index 232c09b..6dea43a 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values-vi/string.xml b/app/src/main/res/values-vi/string.xml
index c1b4ac6..a56ee10 100644
--- a/app/src/main/res/values-vi/string.xml
+++ b/app/src/main/res/values-vi/string.xml
@@ -7,7 +7,7 @@
Xem mã nguồn của trình hỗ trợ MBCP - dựa trên CorePatch.
Tùy chọn
Vô hiệu hóa xác minh chữ ký và cho phép cài đặt MBCP.
- MBCP và trình hỗ trợ hiện chỉ khả dụng cho Android 12 trở lên.\nMBCP Helper được dựa trên CorePatch.
+ MBCP và trình hỗ trợ hiện khả dụng cho Android 9 ~ 16 trở lên.\nMBCP Helper được dựa trên CorePatch.
Cho phép hạ cấp
Cho phép hạ cấp MBCP và các ứng dụng khác về phiên bản cũ hơn.
Vô hiệu hóa xác minh tính toàn vẹn
@@ -20,4 +20,8 @@
!! Any apk can override the installed one !!\nBe carefully when installing unknown apk
Bỏ qua tác nhân xác minh APK
ví dụ như trình bảo vệ app của Google Play.
+ Thông báo cho HyperOS
+ Trình hỗ trợ này không thể sử dụng nếu bạn có HyperOS 1+. Vui lòng nhấn vào đây để xem cách cài app MBCP cho HyperOS.
+ Disable exact signature match
+ Disables exact signature match between apks, allowing installs with each apk split having a different signature.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 746beb5..9c646b8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -8,7 +8,7 @@
Options
Disable signature verification and allows install MBCP
- MBCP and Helper only available for Android 12 and newer.\nIts based on CorePatch.
+ MBCP and Helper are available for Android 9 and newer.\nIts based on CorePatch.
Allow downgrade
Allow downgrade MBCP and other applications to older version.
Disable digest verify
@@ -21,4 +21,8 @@
!! Any apk can override the installed one !!\nBe carefully when installing unknown apk
Disable Package Verification Agent
e.g. Google Play Protection
+ HyperOS attention
+ This helper cant be used for HyperOS 1+. If you have HyperOS 1+, downgrade to MIUI, or ask somewhere for manually patching service.jar !!!
+ Disable exact signature match
+ Disables exact signature match between apks, allowing installs with each apk split having a different signature. Only enable when really needed!
diff --git a/app/src/main/res/xml/prefs.xml b/app/src/main/res/xml/prefs.xml
index 137bb8d..b6b0c0a 100644
--- a/app/src/main/res/xml/prefs.xml
+++ b/app/src/main/res/xml/prefs.xml
@@ -8,47 +8,52 @@
android:summary="@string/dlmbcp_summary">
+ android:data="https://t.me/mbbpatch_eng"/>
+ android:data="https://git.disroot.org/mbcp/mbcp-helper"/>
-
+
+
+
+
-
+
-
-
diff --git a/build.gradle.kts b/build.gradle.kts
index 8bc2b2b..0ee713f 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath("com.android.tools.build:gradle:8.7.2")
+ classpath("com.android.tools.build:gradle:8.7.3")
}
}