|
1 | 1 | package tw.idv.palatis.xappdebug.xposed; |
2 | 2 |
|
| 3 | +import static android.content.pm.ApplicationInfo.FLAG_DEBUGGABLE; |
| 4 | +import static android.util.Log.getStackTraceString; |
| 5 | +import static de.robv.android.xposed.XposedBridge.hookAllMethods; |
| 6 | +import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; |
| 7 | +import static tw.idv.palatis.xappdebug.Constants.CONFIG_PATH_FORMAT; |
| 8 | +import static tw.idv.palatis.xappdebug.Constants.LOG_TAG; |
| 9 | + |
3 | 10 | import android.annotation.SuppressLint; |
| 11 | +import android.content.pm.ApplicationInfo; |
4 | 12 | import android.content.pm.PackageInfo; |
5 | 13 | import android.os.StrictMode; |
6 | 14 | import android.os.UserHandle; |
7 | 15 |
|
| 16 | +import androidx.annotation.Keep; |
| 17 | + |
| 18 | +import java.util.List; |
8 | 19 | import java.util.Locale; |
9 | 20 |
|
10 | | -import androidx.annotation.Keep; |
11 | 21 | import de.robv.android.xposed.IXposedHookLoadPackage; |
12 | 22 | import de.robv.android.xposed.SELinuxHelper; |
13 | 23 | import de.robv.android.xposed.XC_MethodHook; |
14 | 24 | import de.robv.android.xposed.XposedBridge; |
15 | 25 | import de.robv.android.xposed.callbacks.XC_LoadPackage; |
16 | 26 |
|
17 | | -import static android.content.pm.ApplicationInfo.FLAG_DEBUGGABLE; |
18 | | -import static android.util.Log.getStackTraceString; |
19 | | -import static de.robv.android.xposed.XposedBridge.hookAllMethods; |
20 | | -import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; |
21 | | -import static tw.idv.palatis.xappdebug.Constants.CONFIG_PATH_FORMAT; |
22 | | -import static tw.idv.palatis.xappdebug.Constants.LOG_TAG; |
23 | | - |
24 | 27 | @Keep |
25 | 28 | public class HookMain implements IXposedHookLoadPackage { |
26 | 29 |
|
27 | 30 | // taken from Zygote.java |
28 | 31 | // https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/com/android/internal/os/Zygote.java |
29 | 32 | private static final int DEBUG_ENABLE_JDWP = 1; |
30 | 33 |
|
| 34 | + private static final String PACKAGE_MANAGER_SERVICE_CLASS = "com.android.server.pm.PackageManagerService"; |
| 35 | + |
31 | 36 | @Override |
32 | 37 | public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { |
33 | 38 | if (!"android".equals(lpparam.packageName)) |
34 | 39 | return; |
35 | 40 |
|
36 | 41 | findAndHookMethod( |
37 | | - "com.android.server.pm.PackageManagerService", |
| 42 | + PACKAGE_MANAGER_SERVICE_CLASS, |
38 | 43 | lpparam.classLoader, |
39 | 44 | "getPackageInfo", |
40 | 45 | String.class, int.class, int.class, /* packageName, flags, userId */ |
41 | 46 | new XC_MethodHook() { |
42 | 47 | @Override |
43 | 48 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { |
44 | 49 | try { |
45 | | - final PackageInfo packageInfo = (PackageInfo) param.getResult(); |
| 50 | + final int userId = (int) param.args[2]; |
| 51 | + final PackageInfo info = (PackageInfo) param.getResult(); |
| 52 | + if (info == null) |
| 53 | + return; |
| 54 | + if (!isDebuggable(info.packageName, userId)) |
| 55 | + return; |
| 56 | + info.applicationInfo.flags |= FLAG_DEBUGGABLE; |
| 57 | + } catch (Exception e) { |
| 58 | + XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e)); |
| 59 | + } |
| 60 | + } |
| 61 | + } |
| 62 | + ); |
46 | 63 |
|
47 | | - if (packageInfo != null) { |
48 | | - if (!isDebuggable(packageInfo.packageName, (int) param.args[2])) |
49 | | - return; |
| 64 | + findAndHookMethod( |
| 65 | + PACKAGE_MANAGER_SERVICE_CLASS, |
| 66 | + lpparam.classLoader, |
| 67 | + "getApplicationInfo", |
| 68 | + String.class, int.class, int.class, /* packageName, flags, userId */ |
| 69 | + new XC_MethodHook() { |
| 70 | + @Override |
| 71 | + protected void afterHookedMethod(MethodHookParam param) throws Throwable { |
| 72 | + try { |
| 73 | + final int userId = (int) param.args[2]; |
| 74 | + final ApplicationInfo appInfo = (ApplicationInfo) param.getResult(); |
| 75 | + if (appInfo == null) |
| 76 | + return; |
| 77 | + if (!isDebuggable(appInfo.packageName, userId)) |
| 78 | + return; |
| 79 | + appInfo.flags |= FLAG_DEBUGGABLE; |
| 80 | + } catch (Exception e) { |
| 81 | + XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e)); |
| 82 | + } |
| 83 | + } |
| 84 | + } |
| 85 | + ); |
50 | 86 |
|
51 | | - packageInfo.applicationInfo.flags |= FLAG_DEBUGGABLE; |
52 | | - param.setResult(packageInfo); |
| 87 | + findAndHookMethod( |
| 88 | + PACKAGE_MANAGER_SERVICE_CLASS, |
| 89 | + lpparam.classLoader, |
| 90 | + "getInstalledApplicationsListInternal", |
| 91 | + int.class, int.class, int.class, /* flags, userId, callingUid */ |
| 92 | + new XC_MethodHook() { |
| 93 | + @Override |
| 94 | + protected void afterHookedMethod(MethodHookParam param) throws Throwable { |
| 95 | + try { |
| 96 | + final int userId = (int) param.args[1]; |
| 97 | + final List<ApplicationInfo> infos = (List<ApplicationInfo>) param.getResult(); |
| 98 | + if (infos == null) |
| 99 | + return; |
| 100 | + for (ApplicationInfo info : infos) { |
| 101 | + if (isDebuggable(info.packageName, userId)) |
| 102 | + info.flags |= FLAG_DEBUGGABLE; |
53 | 103 | } |
54 | 104 | } catch (Exception e) { |
55 | 105 | XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e)); |
|
0 commit comments