77import de .robv .android .xposed .*;
88import de .robv .android .xposed .callbacks .XC_LoadPackage .LoadPackageParam ;
99
10- @ SuppressWarnings ("deprecation" )
1110public class Main implements IXposedHookLoadPackage {
1211 private static final String TAG = "XSpoofSignatures" ;
1312
@@ -26,6 +25,25 @@ private static Signature[] copySignatures(Signature[] orig, Signature extra) {
2625 return signatures ;
2726 }
2827
28+ private static String getHookClassName () {
29+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
30+ // https://cs.android.com/android/platform/superproject/+/android-15.0.0_r1:frameworks/base/services/core/java/com/android/server/pm/ComputerEngine.java;l=1484;drc=d970c566017e2c4a69e545775994fc46e0869247
31+ return "com.android.server.pm.ComputerEngine" ;
32+ } else if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
33+ // https://cs.android.com/android/platform/superproject/+/android-12.0.0_r1:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java;l=3302;drc=2cf61babf8de1e5e3a45770632fa067556021291
34+ return "com.android.server.pm.PackageManagerService$ComputerEngine" ;
35+ } else if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .ICE_CREAM_SANDWICH ) {
36+ // https://cs.android.com/android/platform/superproject/+/android-4.0.1_r1:frameworks/base/services/java/com/android/server/pm/PackageManagerService.java;l=1485;drc=58f42a59bda3bc912d0d2f81dc65a9d31d140eaa
37+ return "com.android.server.pm.PackageManagerService" ;
38+ } else {
39+ // Android SRC is unavailable for Android Honeycomb (3.x) and Android Cupcake (1.5)
40+ // but I confirmed this is accurate for those versions by extracting the system image
41+
42+ // https://cs.android.com/android/platform/superproject/+/android-2.2.3_r1:frameworks/base/services/java/com/android/server/PackageManagerService.java;l=1316;drc=e2fd45af93178b30e6da97b46fcd31b7d30f5426
43+ return "com.android.server.PackageManagerService" ;
44+ }
45+ }
46+
2947 @ Override
3048 public void handleLoadPackage (LoadPackageParam lpparam ) {
3149 if (!"android" .equals (lpparam .packageName )) return ;
@@ -58,8 +76,8 @@ protected void afterHookedMethod(MethodHookParam param) {
5876 }
5977
6078 // Check if the permission was granted
61- if (pi .requestedPermissions == null ||
62- pi .requestedPermissionsFlags == null ) return ;
79+ if (pi .requestedPermissions == null || ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . JELLY_BEAN &&
80+ pi .requestedPermissionsFlags == null )) return ;
6381 boolean granted = false ;
6482 for (int i = 0 ; i < pi .requestedPermissions .length ; i ++) {
6583 if ("android.permission.FAKE_PACKAGE_SIGNATURE" .equals (pi .requestedPermissions [i ]) &&
@@ -116,17 +134,9 @@ protected void afterHookedMethod(MethodHookParam param) {
116134 }
117135 };
118136
119- String targetClass ;
120- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
121- targetClass = "com.android.server.pm.ComputerEngine" ;
122- } else if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
123- targetClass = "com.android.server.pm.PackageManagerService$ComputerEngine" ;
124- } else {
125- targetClass = "com.android.server.pm.PackageManagerService" ;
126- }
127-
128- final Class <?> hookClass = XposedHelpers .findClass (targetClass , lpparam .classLoader );
137+ final String hookClassName = getHookClassName ();
138+ final Class <?> hookClass = XposedHelpers .findClass (hookClassName , lpparam .classLoader );
129139 XposedBridge .hookAllMethods (hookClass , "generatePackageInfo" , hook );
130- Log .d (TAG , String .format ("Hooking %s#generatePackageInfo(...)" , targetClass ));
140+ Log .d (TAG , String .format ("Hooking %s#generatePackageInfo(...)" , hookClassName ));
131141 }
132142}
0 commit comments