适配Xiaomi HyperOS

This commit is contained in:
wenyifan 2023-11-01 17:32:14 +08:00
parent a7fbe6264f
commit 8b2a13cfe8
4 changed files with 35 additions and 18 deletions

View File

@ -7,6 +7,7 @@
<option name="testRunner" value="GRADLE" /> <option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" /> <option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="Android Studio default JDK" />
<option name="modules"> <option name="modules">
<set> <set>
<option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$" />

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="temurin-11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View File

@ -1,9 +1,11 @@
package run.evan.hotspotip; package run.evan.hotspotip;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import de.robv.android.xposed.IXposedHookLoadPackage; 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.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.XposedHelpers;
@ -13,27 +15,41 @@ public class MainHook implements IXposedHookLoadPackage {
@Override @Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if (loadPackageParam.packageName.equals("com.android.networkstack.tethering.inprocess")) { 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() { XposedHelpers.findAndHookMethod("com.android.networkstack.tethering.PrivateAddressCoordinator", loadPackageParam.classLoader, "requestDownstreamAddress", "android.net.ip.IpServer", boolean.class, new XC_MethodReplacement() {
@Override @Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
Class linkAddressClass = XposedHelpers.findClass("android.net.LinkAddress", loadPackageParam.classLoader); return buildPrivateAddressResponse(methodHookParam, loadPackageParam);
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) { if (loadPackageParam.packageName.equals("com.android.networkstack.tethering")) {
case 3: XposedBridge.log("Hotspot IP init process="+loadPackageParam.packageName);
return linkAddressConstructor.newInstance("192.168.49.1/24"); XposedHelpers.findAndHookMethod("com.android.networkstack.tethering.PrivateAddressCoordinator", loadPackageParam.classLoader, "requestDownstreamAddress", "android.net.ip.IpServer",int.class, boolean.class, new XC_MethodReplacement() {
case 0: @Override
return linkAddressConstructor.newInstance("192.168.6.1/24"); protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
case 1: return buildPrivateAddressResponse(methodHookParam, loadPackageParam);
return linkAddressConstructor.newInstance("192.168.7.1/24");
default:
return linkAddressConstructor.newInstance("192.168.8.1/24");
}
} }
}); });
} }
} }
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");
}
}
} }

View File

@ -2,5 +2,6 @@
<resources> <resources>
<string-array name="scope"> <string-array name="scope">
<item>android</item> <item>android</item>
<item>com.android.networkstack</item>
</string-array> </string-array>
</resources> </resources>