|
7 | 7 | import de.robv.android.xposed.*; |
8 | 8 | import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam; |
9 | 9 |
|
| 10 | +@SuppressWarnings("deprecation") |
10 | 11 | public class Main implements IXposedHookLoadPackage { |
11 | 12 | private static final String TAG = "XSpoofSignatures"; |
12 | 13 |
|
@@ -51,20 +52,32 @@ public void handleLoadPackage(LoadPackageParam lpparam) { |
51 | 52 | XC_MethodHook hook = new XC_MethodHook() { |
52 | 53 | @Override |
53 | 54 | protected void beforeHookedMethod(MethodHookParam param) { |
54 | | - long flags = (long) param.args[1]; |
| 55 | + // https://cs.android.com/android/platform/superproject/+/android-12.1.0_r5:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java;l=3325;drc=32796cd24bf5b392d5e823d4c6abc4e2f1dfe4a2 |
| 56 | + // https://cs.android.com/android/platform/superproject/+/android-13.0.0_r1:frameworks/base/services/core/java/com/android/server/pm/ComputerEngine.java;l=1594;drc=66acf93106a784172c39e6bbf5c22a1aa3563e0b |
| 57 | + long flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU |
| 58 | + ? (long) param.args[1] |
| 59 | + : (long) (int) param.args[1]; |
55 | 60 |
|
56 | 61 | // Avoid getting metadata when not needed |
57 | 62 | if (!isFetchingSignatures(flags)) return; |
58 | 63 |
|
59 | | - param.args[1] = flags | PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS; |
| 64 | + flags |= PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS; |
| 65 | + |
| 66 | + // Explicit cast to Object is needed, otherwise the compiler boxes the value into a Long for both branches?? |
| 67 | + // I hate java |
| 68 | + param.args[1] = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU |
| 69 | + ? (Object) flags |
| 70 | + : (Object) (int) flags; |
60 | 71 | } |
61 | 72 |
|
62 | 73 | @Override |
63 | 74 | protected void afterHookedMethod(MethodHookParam param) { |
64 | 75 | PackageInfo pi = (PackageInfo) param.getResult(); |
65 | 76 | if (pi == null) return; |
66 | 77 |
|
67 | | - long flags = (long) param.args[1]; |
| 78 | + long flags = param.args[1] instanceof Integer |
| 79 | + ? (long) (int) param.args[1] |
| 80 | + : (long) param.args[1]; |
68 | 81 | if (!isFetchingSignatures(flags)) return; |
69 | 82 |
|
70 | 83 | // Get the declared fake signature from manifest meta-data |
@@ -137,6 +150,6 @@ protected void afterHookedMethod(MethodHookParam param) { |
137 | 150 | final String hookClassName = getHookClassName(); |
138 | 151 | final Class<?> hookClass = XposedHelpers.findClass(hookClassName, lpparam.classLoader); |
139 | 152 | XposedBridge.hookAllMethods(hookClass, "generatePackageInfo", hook); |
140 | | - Log.d(TAG, String.format("Hooking %s#generatePackageInfo(...)", hookClassName)); |
| 153 | + Log.d(TAG, String.format("Hooking all %s#generatePackageInfo(...)", hookClassName)); |
141 | 154 | } |
142 | 155 | } |
0 commit comments