Skip to content

Commit 5f6a1b7

Browse files
committed
feat: support android versions down to 1.5 (API 3)
1 parent ee21cb7 commit 5f6a1b7

File tree

2 files changed

+25
-20
lines changed

2 files changed

+25
-20
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ android {
88

99
defaultConfig {
1010
applicationId = "dev.materii.rushii.xspoofsignatures"
11-
minSdk = 16
11+
minSdk = 3 // Yes, this is accurate
1212
targetSdk = 35
1313
versionCode = 1
1414
versionName = "1.0.0"
@@ -47,11 +47,6 @@ android {
4747
}
4848
}
4949
}
50-
51-
compileOptions {
52-
sourceCompatibility = JavaVersion.VERSION_1_8
53-
targetCompatibility = JavaVersion.VERSION_1_8
54-
}
5550
}
5651

5752
tasks.withType<JavaCompile> {

app/src/main/java/dev/materii/rushii/xspoofsignatures/Main.java

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import de.robv.android.xposed.*;
88
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
99

10-
@SuppressWarnings("deprecation")
1110
public 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

Comments
 (0)