From 024af644e69b1e25b79c5435a736f0d734488900 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Sun, 19 Sep 2021 10:18:24 +0800 Subject: [PATCH] [parasitic] Load original providers (#1139) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Don't clear providers in handleBindApplication() * Load original providers * restore packageName Co-authored-by: 残页 <31466456+canyie@users.noreply.github.com> --- .../lspd/util/ParasiticManagerHooker.java | 31 ++++++++++++++++++- .../src/main/java/hidden/HiddenApiBridge.java | 5 +++ .../java/android/content/res/Resources.java | 3 ++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java b/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java index 437ba27f..4468ec9f 100644 --- a/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java +++ b/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java @@ -12,6 +12,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.ProviderInfo; import android.os.IBinder; import android.os.Process; import android.os.RemoteException; @@ -87,7 +88,6 @@ public class ParasiticManagerHooker { Object bindData = param.args[0]; ApplicationInfo appInfo = (ApplicationInfo) XposedHelpers.getObjectField(bindData, "appInfo"); XposedHelpers.setObjectField(bindData, "appInfo", getManagerPkgInfo(appInfo).applicationInfo); - XposedHelpers.setObjectField(bindData, "providers", new ArrayList<>()); } }; XposedHelpers.findAndHookMethod(ActivityThread.class, @@ -120,6 +120,35 @@ public class ParasiticManagerHooker { return null; } }); + XposedBridge.hookAllMethods(ActivityThread.class, "installProvider", new XC_MethodHook() { + private Context originalContext = null; + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + Hookers.logD("before install provider"); + Context ctx = null; + ProviderInfo info = null; + int ctxIdx = -1; + for (var i = 0; i < param.args.length; ++i) { + var arg = param.args[i]; + if (arg instanceof Context) { + ctx = (Context) arg; + ctxIdx = i; + } else if (arg instanceof ProviderInfo) info = (ProviderInfo) arg; + } + if (ctx != null && info != null) { + if (originalContext == null) { + info.applicationInfo.packageName = BuildConfig.MANAGER_INJECTED_PKG_NAME + ".origin"; + var originalPkgInfo = ActivityThread.currentActivityThread().getPackageInfoNoCheck(info.applicationInfo, HiddenApiBridge.Resources_getCompatibilityInfo(ctx.getResources())); + XposedHelpers.setObjectField(originalPkgInfo, "mPackageName", BuildConfig.MANAGER_INJECTED_PKG_NAME); + originalContext = (Context) XposedHelpers.callStaticMethod(XposedHelpers.findClass("android.app.ContextImpl", null), "createAppContext", ActivityThread.currentActivityThread(), originalPkgInfo); + info.applicationInfo.packageName = BuildConfig.MANAGER_INJECTED_PKG_NAME; + } + param.args[ctxIdx] = originalContext; + } else { + Hookers.logE("Failed to reload provider", new RuntimeException()); + } + } + }); XposedHelpers.findAndHookMethod(ActivityThread.class, "deliverNewIntents", ActivityThread.ActivityClientRecord.class, List.class, new XC_MethodHook() { @Override diff --git a/hiddenapi-bridge/src/main/java/hidden/HiddenApiBridge.java b/hiddenapi-bridge/src/main/java/hidden/HiddenApiBridge.java index 58577658..0941b634 100644 --- a/hiddenapi-bridge/src/main/java/hidden/HiddenApiBridge.java +++ b/hiddenapi-bridge/src/main/java/hidden/HiddenApiBridge.java @@ -26,6 +26,7 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInstaller; import android.content.res.AssetManager; +import android.content.res.CompatibilityInfo; import android.content.res.Resources; import android.content.res.ResourcesImpl; import android.os.Binder; @@ -86,4 +87,8 @@ public class HiddenApiBridge { public static void ApplicationInfo_credentialProtectedDataDir(ApplicationInfo applicationInfo, String dir) { applicationInfo.credentialProtectedDataDir = dir; } + + public static CompatibilityInfo Resources_getCompatibilityInfo(Resources res) { + return res.getCompatibilityInfo(); + } } diff --git a/hiddenapi-stubs/src/main/java/android/content/res/Resources.java b/hiddenapi-stubs/src/main/java/android/content/res/Resources.java index 3e00aa9f..cb5ba815 100644 --- a/hiddenapi-stubs/src/main/java/android/content/res/Resources.java +++ b/hiddenapi-stubs/src/main/java/android/content/res/Resources.java @@ -15,4 +15,7 @@ public class Resources { throw new UnsupportedOperationException("STUB"); } + public CompatibilityInfo getCompatibilityInfo() { + throw new UnsupportedOperationException("STUB"); + } }