diff --git a/.idea/gradle.xml b/.idea/gradle.xml index a2d7c21..6e5389e 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -7,6 +7,7 @@ + diff --git a/.idea/misc.xml b/.idea/misc.xml index 2a4d5b5..d85de58 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,5 @@ - - + diff --git a/app/src/main/java/run/evan/hotspotip/MainHook.java b/app/src/main/java/run/evan/hotspotip/MainHook.java index 4624a70..62413ff 100644 --- a/app/src/main/java/run/evan/hotspotip/MainHook.java +++ b/app/src/main/java/run/evan/hotspotip/MainHook.java @@ -1,9 +1,11 @@ package run.evan.hotspotip; import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import de.robv.android.xposed.IXposedHookLoadPackage; +import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; @@ -13,27 +15,41 @@ public class MainHook implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { if (loadPackageParam.packageName.equals("com.android.networkstack.tethering.inprocess")) { - XposedBridge.log("Hotspot Ip init"); + XposedBridge.log("Hotspot IP init process="+loadPackageParam.packageName); XposedHelpers.findAndHookMethod("com.android.networkstack.tethering.PrivateAddressCoordinator", loadPackageParam.classLoader, "requestDownstreamAddress", "android.net.ip.IpServer", boolean.class, new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { - Class linkAddressClass = XposedHelpers.findClass("android.net.LinkAddress", loadPackageParam.classLoader); - Constructor linkAddressConstructor = linkAddressClass.getConstructor(String.class); - Class ipServerClass = XposedHelpers.findClass("android.net.ip.IpServer", loadPackageParam.classLoader); - Method interfaceTypeMethod = ipServerClass.getDeclaredMethod("interfaceType"); - int iFaceType = (int) interfaceTypeMethod.invoke(methodHookParam.args[0]); - switch (iFaceType) { - case 3: - return linkAddressConstructor.newInstance("192.168.49.1/24"); - case 0: - return linkAddressConstructor.newInstance("192.168.6.1/24"); - case 1: - return linkAddressConstructor.newInstance("192.168.7.1/24"); - default: - return linkAddressConstructor.newInstance("192.168.8.1/24"); - } + return buildPrivateAddressResponse(methodHookParam, loadPackageParam); + } + }); + } + + if (loadPackageParam.packageName.equals("com.android.networkstack.tethering")) { + XposedBridge.log("Hotspot IP init process="+loadPackageParam.packageName); + XposedHelpers.findAndHookMethod("com.android.networkstack.tethering.PrivateAddressCoordinator", loadPackageParam.classLoader, "requestDownstreamAddress", "android.net.ip.IpServer",int.class, boolean.class, new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { + return buildPrivateAddressResponse(methodHookParam, loadPackageParam); } }); } } + + private static Object buildPrivateAddressResponse(XC_MethodHook.MethodHookParam methodHookParam, XC_LoadPackage.LoadPackageParam loadPackageParam) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { + Class linkAddressClass = XposedHelpers.findClass("android.net.LinkAddress", loadPackageParam.classLoader); + Constructor linkAddressConstructor = linkAddressClass.getConstructor(String.class); + Class ipServerClass = XposedHelpers.findClass("android.net.ip.IpServer", loadPackageParam.classLoader); + Method interfaceTypeMethod = ipServerClass.getDeclaredMethod("interfaceType"); + int iFaceType = (int) interfaceTypeMethod.invoke(methodHookParam.args[0]); + switch (iFaceType) { + case 3: + return linkAddressConstructor.newInstance("192.168.49.1/24"); + case 0: + return linkAddressConstructor.newInstance("192.168.6.1/24"); + case 1: + return linkAddressConstructor.newInstance("192.168.7.1/24"); + default: + return linkAddressConstructor.newInstance("192.168.8.1/24"); + } + } } diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index 07b1e8b..88972e5 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -2,5 +2,6 @@ android + com.android.networkstack \ No newline at end of file