Compare commits
43
.github/workflows/android.yml
vendored
|
|
@ -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
|
||||
49
README.md
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
BIN
app/src/main/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 207 KiB |
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7 KiB |
|
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 14 KiB |