mirror of
https://github.com/LittleTurtle2333/SimplicityTools.git
synced 2026-07-12 19:31:17 +08:00
更新CorePatch至上游版本
This commit is contained in:
@@ -586,7 +586,7 @@ class SettingsActivity : MIUIActivity() {
|
|||||||
TextWithSwitch(TextV(textId = R.string.hide_zen_icon), SwitchV("hide_zen_icon"))
|
TextWithSwitch(TextV(textId = R.string.hide_zen_icon), SwitchV("hide_zen_icon"))
|
||||||
}
|
}
|
||||||
register("about_module", getString(R.string.about_module), true) {
|
register("about_module", getString(R.string.about_module), true) {
|
||||||
Author(authorHead = getDrawable(R.drawable.app_icon)!!, authorName = getString(R.string.app_name), authorTips = "${SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(BuildConfig.BUILD_TIME.toLong())} ${BuildConfig.VERSION_NAME}(${BuildConfig.BUILD_TYPE})", onClickListener = {
|
Author(authorHead = getDrawable(R.drawable.app_icon)!!, authorName = getString(R.string.app_name), authorTips = "${SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(BuildConfig.BUILD_TIME.toLong())}\n${BuildConfig.VERSION_NAME}(${BuildConfig.BUILD_TYPE})", onClickListener = {
|
||||||
try {
|
try {
|
||||||
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("coolmarket://apk/com.lt2333.simplicitytools")))
|
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("coolmarket://apk/com.lt2333.simplicitytools")))
|
||||||
Toast.makeText(activity, "恳求一个五星好评,Thanks♪(・ω・)ノ", Toast.LENGTH_LONG).show()
|
Toast.makeText(activity, "恳求一个五星好评,Thanks♪(・ω・)ノ", Toast.LENGTH_LONG).show()
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package com.lt2333.simplicitytools.hook
|
|||||||
|
|
||||||
import com.lt2333.simplicitytools.BuildConfig
|
import com.lt2333.simplicitytools.BuildConfig
|
||||||
import com.lt2333.simplicitytools.hook.app.*
|
import com.lt2333.simplicitytools.hook.app.*
|
||||||
import com.lt2333.simplicitytools.hook.app.android.corepatch.CorePatch
|
import com.lt2333.simplicitytools.hook.app.android.corepatch.CorePatchMainHook
|
||||||
import com.lt2333.simplicitytools.util.xposed.EasyXposedInit
|
import com.lt2333.simplicitytools.util.xposed.EasyXposedInit
|
||||||
import com.lt2333.simplicitytools.util.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.util.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.IXposedHookZygoteInit
|
import de.robv.android.xposed.IXposedHookZygoteInit
|
||||||
@@ -35,7 +35,7 @@ class XposedEntry : EasyXposedInit() {
|
|||||||
|
|
||||||
override fun initZygote(startupParam: IXposedHookZygoteInit.StartupParam?) {
|
override fun initZygote(startupParam: IXposedHookZygoteInit.StartupParam?) {
|
||||||
super.initZygote(startupParam)
|
super.initZygote(startupParam)
|
||||||
CorePatch().initZygote(startupParam)
|
CorePatchMainHook().initZygote(startupParam)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.lt2333.simplicitytools.hook.app
|
package com.lt2333.simplicitytools.hook.app
|
||||||
|
|
||||||
import com.lt2333.simplicitytools.hook.app.android.*
|
import com.lt2333.simplicitytools.hook.app.android.*
|
||||||
import com.lt2333.simplicitytools.hook.app.android.corepatch.CorePatch
|
import com.lt2333.simplicitytools.hook.app.android.corepatch.CorePatchMainHook
|
||||||
import com.lt2333.simplicitytools.util.xposed.base.AppRegister
|
import com.lt2333.simplicitytools.util.xposed.base.AppRegister
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
|
||||||
@@ -10,8 +10,7 @@ object Android : AppRegister() {
|
|||||||
|
|
||||||
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
|
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
|
||||||
//核心破解
|
//核心破解
|
||||||
CorePatch().handleLoadPackage(lpparam)
|
CorePatchMainHook().handleLoadPackage(lpparam)
|
||||||
|
|
||||||
autoInitHooks(
|
autoInitHooks(
|
||||||
lpparam,
|
lpparam,
|
||||||
DisableFlagSecure, //允许截图
|
DisableFlagSecure, //允许截图
|
||||||
|
|||||||
@@ -0,0 +1,142 @@
|
|||||||
|
package com.lt2333.simplicitytools.hook.app.android.corepatch;
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.pm.ApplicationInfo;
|
||||||
|
import android.content.pm.Signature;
|
||||||
|
|
||||||
|
import com.lt2333.simplicitytools.BuildConfig;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
|
import de.robv.android.xposed.IXposedHookLoadPackage;
|
||||||
|
import de.robv.android.xposed.IXposedHookZygoteInit;
|
||||||
|
import de.robv.android.xposed.XC_MethodHook;
|
||||||
|
import de.robv.android.xposed.XC_MethodReplacement;
|
||||||
|
import de.robv.android.xposed.XSharedPreferences;
|
||||||
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
|
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||||
|
|
||||||
|
public class CorePatchForQ extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit {
|
||||||
|
XSharedPreferences prefs = new XSharedPreferences(BuildConfig.APPLICATION_ID, "config");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
|
||||||
|
// 允许降级
|
||||||
|
Class<?> packageClazz = XposedHelpers.findClass("android.content.pm.PackageParser.Package", loadPackageParam.classLoader);
|
||||||
|
hookAllMethods("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader, "checkDowngrade", new XC_MethodHook() {
|
||||||
|
public void beforeHookedMethod(MethodHookParam methodHookParam) throws Throwable {
|
||||||
|
super.beforeHookedMethod(methodHookParam);
|
||||||
|
if (prefs.getBoolean("downgrade", true)) {
|
||||||
|
Object packageInfoLite = methodHookParam.args[0];
|
||||||
|
|
||||||
|
if (prefs.getBoolean("downgrade", true)) {
|
||||||
|
Field field = packageClazz.getField("mVersionCode");
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(packageInfoLite, 0);
|
||||||
|
field = packageClazz.getField("mVersionCodeMajor");
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(packageInfoLite, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
hookAllMethods("android.util.jar.StrictJarVerifier", loadPackageParam.classLoader, "verifyMessageDigest",
|
||||||
|
new ReturnConstant(prefs, "authcreak", true));
|
||||||
|
hookAllMethods("android.util.jar.StrictJarVerifier", loadPackageParam.classLoader, "verify",
|
||||||
|
new ReturnConstant(prefs, "authcreak", true));
|
||||||
|
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));
|
||||||
|
|
||||||
|
Class<?> signingDetails = XposedHelpers.findClass("android.content.pm.PackageParser.SigningDetails", loadPackageParam.classLoader);
|
||||||
|
Constructor<?> findConstructorExact = XposedHelpers.findConstructorExact(signingDetails, Signature[].class, Integer.TYPE);
|
||||||
|
findConstructorExact.setAccessible(true);
|
||||||
|
Class<?> packageParserException = XposedHelpers.findClass("android.content.pm.PackageParser.PackageParserException", loadPackageParam.classLoader);
|
||||||
|
Field error = XposedHelpers.findField(packageParserException, "error");
|
||||||
|
error.setAccessible(true);
|
||||||
|
Object[] signingDetailsArgs = new Object[2];
|
||||||
|
signingDetailsArgs[0] = new Signature[]{new Signature(SIGNATURE)};
|
||||||
|
signingDetailsArgs[1] = 1;
|
||||||
|
final Object newInstance = findConstructorExact.newInstance(signingDetailsArgs);
|
||||||
|
hookAllMethods("android.util.apk.ApkSignatureVerifier", loadPackageParam.classLoader, "verifyV1Signature", new XC_MethodHook() {
|
||||||
|
public void afterHookedMethod(MethodHookParam methodHookParam) throws Throwable {
|
||||||
|
super.afterHookedMethod(methodHookParam);
|
||||||
|
if (prefs.getBoolean("authcreak", true)) {
|
||||||
|
Throwable throwable = methodHookParam.getThrowable();
|
||||||
|
if (throwable != null) {
|
||||||
|
Throwable cause = throwable.getCause();
|
||||||
|
if (throwable.getClass() == packageParserException) {
|
||||||
|
if (error.getInt(throwable) == -103) {
|
||||||
|
methodHookParam.setResult(newInstance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cause != null && cause.getClass() == packageParserException) {
|
||||||
|
if (error.getInt(cause) == -103) {
|
||||||
|
methodHookParam.setResult(newInstance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//New package has a different signature
|
||||||
|
//处理覆盖安装但签名不一致
|
||||||
|
hookAllMethods(signingDetails, "checkCapability", new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
||||||
|
super.beforeHookedMethod(param);
|
||||||
|
if (prefs.getBoolean("digestCreak", true)) {
|
||||||
|
if ((Integer) param.args[1] != 4 && prefs.getBoolean("authcreak", true)) {
|
||||||
|
param.setResult(Boolean.TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
hookAllMethods(signingDetails, "checkCapabilityRecover",
|
||||||
|
new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
||||||
|
super.beforeHookedMethod(param);
|
||||||
|
if (prefs.getBoolean("digestCreak", true)) {
|
||||||
|
if ((Integer) param.args[1] != 4 && prefs.getBoolean("authcreak", true)) {
|
||||||
|
param.setResult(Boolean.TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// if app is system app, allow to use hidden api, even if app not using a system signature
|
||||||
|
findAndHookMethod("android.content.pm.ApplicationInfo", loadPackageParam.classLoader, "isPackageWhitelistedForHiddenApis", new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
||||||
|
super.beforeHookedMethod(param);
|
||||||
|
if (prefs.getBoolean("digestCreak", true)) {
|
||||||
|
ApplicationInfo info = (ApplicationInfo) param.thisObject;
|
||||||
|
if ((info.flags & ApplicationInfo.FLAG_SYSTEM) != 0
|
||||||
|
|| (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
|
||||||
|
param.setResult(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initZygote(StartupParam startupParam) {
|
||||||
|
hookAllMethods("android.content.pm.PackageParser", null, "getApkSigningVersion", XC_MethodReplacement.returnConstant(1));
|
||||||
|
hookAllConstructors("android.util.jar.StrictJarVerifier", new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
||||||
|
super.beforeHookedMethod(param);
|
||||||
|
if (prefs.getBoolean("enhancedMode", false)) {
|
||||||
|
param.args[3] = Boolean.FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,12 @@
|
|||||||
/**
|
|
||||||
* 代码来自 https://github.com/LSPosed/CorePatch
|
|
||||||
* GPL-2.0 License
|
|
||||||
**/
|
|
||||||
|
|
||||||
package com.lt2333.simplicitytools.hook.app.android.corepatch;
|
package com.lt2333.simplicitytools.hook.app.android.corepatch;
|
||||||
|
|
||||||
|
|
||||||
import android.app.AndroidAppHelper;
|
import android.app.AndroidAppHelper;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageInfo;
|
import android.content.pm.PackageInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.Signature;
|
import android.content.pm.Signature;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import com.lt2333.simplicitytools.BuildConfig;
|
import com.lt2333.simplicitytools.BuildConfig;
|
||||||
|
|
||||||
@@ -20,7 +17,6 @@ import java.security.cert.Certificate;
|
|||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
|
|
||||||
import de.robv.android.xposed.IXposedHookLoadPackage;
|
import de.robv.android.xposed.IXposedHookLoadPackage;
|
||||||
@@ -32,12 +28,17 @@ import de.robv.android.xposed.XposedBridge;
|
|||||||
import de.robv.android.xposed.XposedHelpers;
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||||
|
|
||||||
public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit {
|
public class CorePatchForR extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit {
|
||||||
XSharedPreferences prefs = new XSharedPreferences(BuildConfig.APPLICATION_ID, "config");
|
XSharedPreferences prefs = new XSharedPreferences(BuildConfig.APPLICATION_ID, "config");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
|
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
|
||||||
|
|
||||||
|
Log.d(CorePatchMainHook.TAG, "downgrade" + prefs.getBoolean("downgrade->", true));
|
||||||
|
Log.d(CorePatchMainHook.TAG, "authcreak" + prefs.getBoolean("authcreak->", true));
|
||||||
|
Log.d(CorePatchMainHook.TAG, "digestCreak" + prefs.getBoolean("digestCreak->", true));
|
||||||
|
Log.d(CorePatchMainHook.TAG, "UsePreSig" + prefs.getBoolean("UsePreSig->", false));
|
||||||
|
|
||||||
// 允许降级
|
// 允许降级
|
||||||
findAndHookMethod("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader,
|
findAndHookMethod("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader,
|
||||||
"checkDowngrade",
|
"checkDowngrade",
|
||||||
@@ -134,7 +135,7 @@ public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, I
|
|||||||
if (prefs.getBoolean("UsePreSig", false)) {
|
if (prefs.getBoolean("UsePreSig", false)) {
|
||||||
PackageManager PM = AndroidAppHelper.currentApplication().getPackageManager();
|
PackageManager PM = AndroidAppHelper.currentApplication().getPackageManager();
|
||||||
if (PM == null) {
|
if (PM == null) {
|
||||||
XposedBridge.log("E: ${}" + BuildConfig.APPLICATION_ID + " Cannot get the Package Manager... Are you using MiUI?");
|
XposedBridge.log("E: " + BuildConfig.APPLICATION_ID + " Cannot get the Package Manager... Are you using MiUI?");
|
||||||
} else {
|
} else {
|
||||||
PackageInfo pI = PM.getPackageArchiveInfo((String) methodHookParam.args[0], 0);
|
PackageInfo pI = PM.getPackageArchiveInfo((String) methodHookParam.args[0], 0);
|
||||||
PackageInfo InstpI = PM.getPackageInfo(pI.packageName, PackageManager.GET_SIGNATURES);
|
PackageInfo InstpI = PM.getPackageInfo(pI.packageName, PackageManager.GET_SIGNATURES);
|
||||||
@@ -148,7 +149,11 @@ public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, I
|
|||||||
lastSigs = (Signature[]) XposedHelpers.callStaticMethod(ASV, "convertToSignatures", (Object) lastCerts);
|
lastSigs = (Signature[]) XposedHelpers.callStaticMethod(ASV, "convertToSignatures", (Object) lastCerts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
signingDetailsArgs[0] = Objects.requireNonNullElseGet(lastSigs, () -> new Signature[]{new Signature(SIGNATURE)});
|
if (lastSigs != null) {
|
||||||
|
signingDetailsArgs[0] = lastSigs;
|
||||||
|
} else {
|
||||||
|
signingDetailsArgs[0] = new Signature[]{new Signature(SIGNATURE)};
|
||||||
|
}
|
||||||
Object newInstance = findConstructorExact.newInstance(signingDetailsArgs);
|
Object newInstance = findConstructorExact.newInstance(signingDetailsArgs);
|
||||||
|
|
||||||
//修复 java.lang.ClassCastException: Cannot cast android.content.pm.PackageParser$SigningDetails to android.util.apk.ApkSignatureVerifier$SigningDetailsWithDigests
|
//修复 java.lang.ClassCastException: Cannot cast android.content.pm.PackageParser$SigningDetails to android.util.apk.ApkSignatureVerifier$SigningDetailsWithDigests
|
||||||
@@ -156,7 +161,7 @@ public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, I
|
|||||||
if (signingDetailsWithDigests != null) {
|
if (signingDetailsWithDigests != null) {
|
||||||
Constructor<?> signingDetailsWithDigestsConstructorExact = XposedHelpers.findConstructorExact(signingDetailsWithDigests, signingDetails, Map.class);
|
Constructor<?> signingDetailsWithDigestsConstructorExact = XposedHelpers.findConstructorExact(signingDetailsWithDigests, signingDetails, Map.class);
|
||||||
signingDetailsWithDigestsConstructorExact.setAccessible(true);
|
signingDetailsWithDigestsConstructorExact.setAccessible(true);
|
||||||
newInstance = signingDetailsWithDigestsConstructorExact.newInstance(newInstance, null);
|
newInstance = signingDetailsWithDigestsConstructorExact.newInstance(new Object[]{newInstance, null});
|
||||||
}
|
}
|
||||||
|
|
||||||
Throwable cause = throwable.getCause();
|
Throwable cause = throwable.getCause();
|
||||||
@@ -203,22 +208,6 @@ public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, I
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (prefs.getBoolean("digestCreak", true) && prefs.getBoolean("UsePreSig", false)) {
|
|
||||||
Class<?> pmClass = findClass("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader);
|
|
||||||
Class<?> pPClass = findClass("com.android.server.pm.parsing.pkg.ParsedPackage", loadPackageParam.classLoader);
|
|
||||||
XposedHelpers.findAndHookMethod(pmClass, "doesSignatureMatchForPermissions", String.class, pPClass, int.class, new XC_MethodHook() {
|
|
||||||
@Override
|
|
||||||
protected void afterHookedMethod(MethodHookParam param) {
|
|
||||||
//If we decide to crack this then at least make sure they are same apks, avoid another one that tries to impersonate.
|
|
||||||
if (param.getResult().equals(false)) {
|
|
||||||
String pPname = (String) XposedHelpers.callMethod(param.args[1], "getPackageName");
|
|
||||||
if (pPname.contentEquals((String) param.args[0])) {
|
|
||||||
param.setResult(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.lt2333.simplicitytools.hook.app.android.corepatch;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
|
import de.robv.android.xposed.XC_MethodHook;
|
||||||
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
|
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||||
|
|
||||||
|
public class CorePatchForS extends CorePatchForR {
|
||||||
|
@Override
|
||||||
|
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
|
||||||
|
super.handleLoadPackage(loadPackageParam);
|
||||||
|
if (prefs.getBoolean("digestCreak", true) && prefs.getBoolean("UsePreSig", false)) {
|
||||||
|
findAndHookMethod("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader, "doesSignatureMatchForPermissions", String.class, "com.android.server.pm.parsing.pkg.ParsedPackage", int.class, new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
||||||
|
//If we decide to crack this then at least make sure they are same apks, avoid another one that tries to impersonate.
|
||||||
|
if (param.getResult().equals(false)) {
|
||||||
|
String pPname = (String) XposedHelpers.callMethod(param.args[1], "getPackageName");
|
||||||
|
if (pPname.contentEquals((String) param.args[0])) {
|
||||||
|
param.setResult(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package com.lt2333.simplicitytools.hook.app.android.corepatch;
|
||||||
|
|
||||||
|
public class CorePatchForSv2 extends CorePatchForS{
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package com.lt2333.simplicitytools.hook.app.android.corepatch;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Member;
|
||||||
|
|
||||||
|
import de.robv.android.xposed.XC_MethodHook;
|
||||||
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
|
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||||
|
|
||||||
|
public class CorePatchForT extends CorePatchForSv2 {
|
||||||
|
@Override
|
||||||
|
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
|
||||||
|
super.handleLoadPackage(loadPackageParam);
|
||||||
|
|
||||||
|
findAndHookMethod("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader,
|
||||||
|
"checkDowngrade",
|
||||||
|
"com.android.server.pm.parsing.pkg.AndroidPackage",
|
||||||
|
"android.content.pm.PackageInfoLite",
|
||||||
|
new ReturnConstant(prefs, "downgrade", null));
|
||||||
|
|
||||||
|
var utilClass = findClass("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader);
|
||||||
|
Class<?> signingDetails = XposedHelpers.findClass("android.content.pm.SigningDetails", loadPackageParam.classLoader);
|
||||||
|
//New package has a different signature
|
||||||
|
//处理覆盖安装但签名不一致
|
||||||
|
hookAllMethods(signingDetails, "checkCapability", new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void beforeHookedMethod(MethodHookParam param) {
|
||||||
|
// Don't handle PERMISSION (grant SIGNATURE permissions to pkgs with this cert)
|
||||||
|
// Or applications will have all privileged permissions
|
||||||
|
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/pm/PackageParser.java;l=5947?q=CertCapabilities
|
||||||
|
if (((Integer) param.args[1] != 4) && prefs.getBoolean("digestCreak", true)) {
|
||||||
|
param.setResult(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (utilClass != null) {
|
||||||
|
for (var m : utilClass.getDeclaredMethods()) {
|
||||||
|
if ("verifySignatures".equals(m.getName())) {
|
||||||
|
try {
|
||||||
|
XposedBridge.class.getDeclaredMethod("deoptimizeMethod", Member.class).invoke(null, m);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
Log.e("CorePatch", "deoptimizing failed", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Package " + packageName + " signatures do not match previously installed version; ignoring!"
|
||||||
|
// public boolean checkCapability(String sha256String, @CertCapabilities int flags) {
|
||||||
|
// public boolean checkCapability(SigningDetails oldDetails, @CertCapabilities int flags)
|
||||||
|
hookAllMethods("android.content.pm.PackageParser", loadPackageParam.classLoader, "checkCapability", new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void beforeHookedMethod(MethodHookParam param) {
|
||||||
|
Log.e("CorePatch", "checkCapability");
|
||||||
|
// Don't handle PERMISSION (grant SIGNATURE permissions to pkgs with this cert)
|
||||||
|
// Or applications will have all privileged permissions
|
||||||
|
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/pm/PackageParser.java;l=5947?q=CertCapabilities
|
||||||
|
if (prefs.getBoolean("authcreak", true)) {
|
||||||
|
if ((Integer) param.args[1] != 4) {
|
||||||
|
param.setResult(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
if (prefs.getBoolean("digestCreak", true) && prefs.getBoolean("UsePreSig", false)) {
|
||||||
|
findAndHookMethod("com.android.server.pm.InstallPackageHelper", loadPackageParam.classLoader, "doesSignatureMatchForPermissions", String.class, "com.android.server.pm.parsing.pkg.ParsedPackage", int.class, new XC_MethodHook() {
|
||||||
|
@Override
|
||||||
|
protected void afterHookedMethod(MethodHookParam param) {
|
||||||
|
//If we decide to crack this then at least make sure they are same apks, avoid another one that tries to impersonate.
|
||||||
|
if (param.getResult().equals(false)) {
|
||||||
|
String pPname = (String) XposedHelpers.callMethod(param.args[1], "getPackageName");
|
||||||
|
if (pPname.contentEquals((String) param.args[0])) {
|
||||||
|
param.setResult(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package com.lt2333.simplicitytools.hook.app.android.corepatch;
|
||||||
|
|
||||||
|
import android.os.Build;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import de.robv.android.xposed.IXposedHookLoadPackage;
|
||||||
|
import de.robv.android.xposed.IXposedHookZygoteInit;
|
||||||
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||||
|
|
||||||
|
public class CorePatchMainHook implements IXposedHookLoadPackage, IXposedHookZygoteInit {
|
||||||
|
public static final String TAG = "WooBox: CorePatch";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
|
||||||
|
if (("android".equals(lpparam.packageName)) && (lpparam.processName.equals("android"))) {
|
||||||
|
Log.d(TAG, "Current sdk version " + Build.VERSION.SDK_INT);
|
||||||
|
switch (Build.VERSION.SDK_INT) {
|
||||||
|
case Build.VERSION_CODES.TIRAMISU: // 33
|
||||||
|
new CorePatchForT().handleLoadPackage(lpparam);
|
||||||
|
break;
|
||||||
|
case Build.VERSION_CODES.S_V2: // 32
|
||||||
|
new CorePatchForSv2().handleLoadPackage(lpparam);
|
||||||
|
break;
|
||||||
|
case Build.VERSION_CODES.S: // 31
|
||||||
|
new CorePatchForS().handleLoadPackage(lpparam);
|
||||||
|
break;
|
||||||
|
case Build.VERSION_CODES.R: // 30
|
||||||
|
new CorePatchForR().handleLoadPackage(lpparam);
|
||||||
|
break;
|
||||||
|
case Build.VERSION_CODES.Q: // 29
|
||||||
|
new CorePatchForQ().handleLoadPackage(lpparam);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
XposedBridge.log(TAG + ": Warning: Unsupported Version of Android " + Build.VERSION.SDK_INT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initZygote(StartupParam startupParam) throws Throwable {
|
||||||
|
if (startupParam.startsSystemServer) {
|
||||||
|
Log.d(TAG, "Current sdk version " + Build.VERSION.SDK_INT);
|
||||||
|
switch (Build.VERSION.SDK_INT) {
|
||||||
|
case Build.VERSION_CODES.TIRAMISU: // 33
|
||||||
|
new CorePatchForT().initZygote(startupParam);
|
||||||
|
break;
|
||||||
|
case Build.VERSION_CODES.S_V2: // 32
|
||||||
|
new CorePatchForSv2().initZygote(startupParam);
|
||||||
|
break;
|
||||||
|
case Build.VERSION_CODES.S: // 31
|
||||||
|
new CorePatchForS().initZygote(startupParam);
|
||||||
|
break;
|
||||||
|
case Build.VERSION_CODES.R: // 30
|
||||||
|
new CorePatchForR().initZygote(startupParam);
|
||||||
|
break;
|
||||||
|
case Build.VERSION_CODES.Q: // 29
|
||||||
|
new CorePatchForQ().initZygote(startupParam);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
XposedBridge.log(TAG + ": Warning: Unsupported Version of Android " + Build.VERSION.SDK_INT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user