Skip to content

Instantly share code, notes, and snippets.

@silverzhaojr
Created January 16, 2024 06:14
Show Gist options
  • Save silverzhaojr/0fae15126daa0265ad3013aa6bb59595 to your computer and use it in GitHub Desktop.
Save silverzhaojr/0fae15126daa0265ad3013aa6bb59595 to your computer and use it in GitHub Desktop.
share vpn for multiple users / work profile
package com.github.silverzhaojr.xposed.sharevpnformultiusers;
import android.util.Range;
import androidx.annotation.Keep;
import java.util.List;
import java.util.Set;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
@Keep
public class HookVPN implements IXposedHookLoadPackage {
private static final String classname = "com.android.server.connectivity.Vpn";
private static final String methodname = "createUserAndRestrictedProfilesRanges";
// Android source code:
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/core/java/com/android/server/connectivity/Vpn.java;l=1703
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("Loaded app: " + lpparam.packageName);
if (!lpparam.packageName.equals("android")) {
return;
}
XposedHelpers.findAndHookMethod(classname, lpparam.classLoader, methodname,
int.class, List.class, List.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
int orgiUserId = (int) param.args[0];
List<String> allowedApplications = (List<String>) param.args[1];
List<String> disallowedApplications = (List<String>) param.args[2];
Set<Range<Integer>> ranges = (Set<Range<Integer>>) param.getResult();
XposedBridge.log(
String.format(
"Before patching: original userId: %s, ranges: %s",
orgiUserId, ranges)
);
int userId = 10;
XposedHelpers.callMethod(
param.thisObject,
"addUserToRanges",
ranges, userId, allowedApplications, disallowedApplications);
XposedBridge.log("After patching: " + ranges);
param.setResult(ranges);
}
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment