Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove clumsy core patch impl checking flow #113

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,16 +1,45 @@
package toolkit.coderstory;

import android.os.Build;
import android.util.Log;

import com.coderstory.toolkit.BuildConfig;

import toolkit.coderstory.patch.CorePatchImplApiP;
import toolkit.coderstory.patch.CorePatchImplApiR;
import toolkit.coderstory.patch.CorePatchImplApiS;
import toolkit.coderstory.patch.CorePatchImplApiT;
import toolkit.coderstory.patch.CorePatchImplApiU;
import toolkit.coderstory.patch.CorePatchUnsupported;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;

public class XposedHelper {
public abstract class CorePatch implements IXposedHookLoadPackage, IXposedHookZygoteInit {
public final String SIGNATURE = "308203c6308202aea003020102021426d148b7c65944abcf3a683b4c3dd3b139c4ec85300d06092a864886f70d01010b05003074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964301e170d3139303130323138353233385a170d3439303130323138353233385a3074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f696430820122300d06092a864886f70d01010105000382010f003082010a028201010087fcde48d9beaeba37b733a397ae586fb42b6c3f4ce758dc3ef1327754a049b58f738664ece587994f1c6362f98c9be5fe82c72177260c390781f74a10a8a6f05a6b5ca0c7c5826e15526d8d7f0e74f2170064896b0cf32634a388e1a975ed6bab10744d9b371cba85069834bf098f1de0205cdee8e715759d302a64d248067a15b9beea11b61305e367ac71b1a898bf2eec7342109c9c5813a579d8a1b3e6a3fe290ea82e27fdba748a663f73cca5807cff1e4ad6f3ccca7c02945926a47279d1159599d4ecf01c9d0b62e385c6320a7a1e4ddc9833f237e814b34024b9ad108a5b00786ea15593a50ca7987cbbdc203c096eed5ff4bf8a63d27d33ecc963990203010001a350304e300c0603551d13040530030101ff301d0603551d0e04160414a361efb002034d596c3a60ad7b0332012a16aee3301f0603551d23041830168014a361efb002034d596c3a60ad7b0332012a16aee3300d06092a864886f70d01010b0500038201010022ccb684a7a8706f3ee7c81d6750fd662bf39f84805862040b625ddf378eeefae5a4f1f283deea61a3c7f8e7963fd745415153a531912b82b596e7409287ba26fb80cedba18f22ae3d987466e1fdd88e440402b2ea2819db5392cadee501350e81b8791675ea1a2ed7ef7696dff273f13fb742bb9625fa12ce9c2cb0b7b3d94b21792f1252b1d9e4f7012cb341b62ff556e6864b40927e942065d8f0f51273fcda979b8832dd5562c79acf719de6be5aee2a85f89265b071bf38339e2d31041bc501d5e0c034ab1cd9c64353b10ee70b49274093d13f733eb9d3543140814c72f8e003f301c7a00b1872cc008ad55e26df2e8f07441002c4bcb7dc746745f0db";

public static CorePatch getImpl() {
switch (Build.VERSION.SDK_INT) {
case Build.VERSION_CODES.UPSIDE_DOWN_CAKE: // 34
return new CorePatchImplApiU();
case Build.VERSION_CODES.TIRAMISU: // 33
return new CorePatchImplApiT();
case Build.VERSION_CODES.S_V2: // 32
case Build.VERSION_CODES.S: // 31
return new CorePatchImplApiS();
case Build.VERSION_CODES.R: // 30
return new CorePatchImplApiR();
case Build.VERSION_CODES.Q: // 29
case Build.VERSION_CODES.P: // 28
return new CorePatchImplApiP();
default:
return new CorePatchUnsupported();
}
}

public static void findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) {
try {
if (findClass(className, classLoader) != null) {
Expand Down Expand Up @@ -71,4 +100,9 @@ public static void hookAllConstructors(String className, XC_MethodHook callback)
XposedBridge.log("E/" + MainHook.TAG + " " + Log.getStackTraceString(e));
}
}

@Override
public void initZygote(StartupParam startupParam) {
// Remove error `Unhandled exception: ...`
}
}
52 changes: 8 additions & 44 deletions app/src/main/java/toolkit/coderstory/MainHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,60 +15,24 @@ public class MainHook implements IXposedHookLoadPackage, IXposedHookZygoteInit {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (("android".equals(lpparam.packageName)) && (lpparam.processName.equals("android"))) {
if (BuildConfig.DEBUG)
if (BuildConfig.DEBUG) {
XposedBridge.log("D/" + TAG + " handleLoadPackage");
switch (Build.VERSION.SDK_INT) {
case Build.VERSION_CODES.UPSIDE_DOWN_CAKE: // 34
new CorePatchForU().handleLoadPackage(lpparam);
break;
case Build.VERSION_CODES.TIRAMISU: // 33
new CorePatchForT().handleLoadPackage(lpparam);
break;
case Build.VERSION_CODES.S_V2: // 32
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
case Build.VERSION_CODES.P: // 28
new CorePatchForQ().handleLoadPackage(lpparam);
break;
default:
XposedBridge.log("W/" + TAG + " Unsupported Version of Android " + Build.VERSION.SDK_INT);
break;
}

final var corePatchImpl = CorePatch.getImpl();
corePatchImpl.handleLoadPackage(lpparam);
}
}

@Override
public void initZygote(StartupParam startupParam) {
if (startupParam.startsSystemServer) {
if (BuildConfig.DEBUG)
if (BuildConfig.DEBUG) {
XposedBridge.log("D/" + TAG + " initZygote: Current sdk version " + Build.VERSION.SDK_INT);
switch (Build.VERSION.SDK_INT) {
case Build.VERSION_CODES.UPSIDE_DOWN_CAKE: // 34
new CorePatchForU().initZygote(startupParam);
break;
case Build.VERSION_CODES.TIRAMISU: // 33
new CorePatchForT().initZygote(startupParam);
break;
case Build.VERSION_CODES.S_V2: // 32
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
case Build.VERSION_CODES.P: // 28
new CorePatchForQ().initZygote(startupParam);
break;
default:
XposedBridge.log("W/" + TAG + " Unsupported Version of Android " + Build.VERSION.SDK_INT);
break;
}

final var corePatchImpl = CorePatch.getImpl();
corePatchImpl.initZygote(startupParam);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package toolkit.coderstory;
package toolkit.coderstory.patch;


import android.content.pm.ApplicationInfo;
Expand All @@ -11,15 +11,15 @@
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

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;
import toolkit.coderstory.CorePatch;
import toolkit.coderstory.ReturnConstant;

public class CorePatchForQ extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit {
public class CorePatchImplApiP extends CorePatch {
final XSharedPreferences prefs = new XSharedPreferences(BuildConfig.APPLICATION_ID, "conf");

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package toolkit.coderstory;
package toolkit.coderstory.patch;


import android.annotation.TargetApi;
Expand Down Expand Up @@ -26,17 +26,18 @@
import java.util.Objects;
import java.util.zip.ZipEntry;

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.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import toolkit.coderstory.CorePatch;
import toolkit.coderstory.MainHook;
import toolkit.coderstory.ReturnConstant;

@TargetApi(Build.VERSION_CODES.R)
public class CorePatchForR extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit {
public class CorePatchImplApiR extends CorePatch {
private final static Method deoptimizeMethod;

static {
Expand Down Expand Up @@ -423,7 +424,6 @@ Class<?> getSigningDetails(ClassLoader classLoader) {

@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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
package toolkit.coderstory;
package toolkit.coderstory.patch;

import android.annotation.TargetApi;
import android.os.Build;

import java.lang.reflect.InvocationTargetException;

Expand All @@ -7,7 +10,8 @@
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class CorePatchForS extends CorePatchForR {
@TargetApi(Build.VERSION_CODES.S)
public class CorePatchImplApiS extends CorePatchImplApiR {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
super.handleLoadPackage(loadPackageParam);
Expand Down
Loading
Loading