[T-Mobile LG G5 Guides, News, & Discussion] TTObo:
I am not going to provide a pre-built apk.

If you want to hide tethering, you have to learn and know the basics of xposed and compiling an apk.

I would prefer that no one provides a pre-built APK either, but I obviously can't demand/enforce this

Requirements: H830 T-mobile LG G5, root, xposed

May or may not work with other LG G5 variants

Technical details:

Tethering app verifies permission with T-mobile before starting

When you enable tethering, there is a popup saying something like "Please wait, verifing...".

The "whichurl" backdoor bypasses this check/popup.​

Tethered data gets diverted into separate tethering APN

T-mobile monitors this separate APN. The initZygote stuff attempts to stop this from happening. I have not tested this throughly, but it seems to work​

Rest of the hooks, probably not important

Code

package com.xposed.lgg5.tethering;

import android.content.Context;
import android.content.res.XResources;
import android.util.Log;
import android.widget.Toast;
import de.robv.android.xposed.*;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import static de.robv.android.xposed.XposedHelpers.setIntField;

public class XposedTetheringH830 implements IXposedHookLoadPackage, IXposedHookZygoteInit{

public void initZygote(IXposedHookZygoteInit.StartupParam var1) throws Throwable {
Log.i("XposedTetheringH830", "Updating systemwide arrays to stop tethering data being diverted into tethering APNs");
XResources.setSystemWideReplacement("android", "array", "config_mobile_hotspot_provision_app", new String[0]);

// If we override the three items below, tethering is completely disabled on device
/*XResources.setSystemWideReplacement("android", "array", "config_tether_usb_regexs", new String[0]);
XResources.setSystemWideReplacement("android", "array", "config_tether_wifi_regexs", new String[0]);
XResources.setSystemWideReplacement("android", "array", "config_tether_bluetooth_regexs", new String[0]);*/

// don't know if this is necessary
XResources.setSystemWideReplacement("android", "array", "config_tether_upstream_types", new int[0]);

// necessary, otherwise phone diverts tethered data into separate APNs
XResources.setSystemWideReplacement("android", "array", "config_tether_apndata", new String[0]);
}

@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if(lpparam.packageName == null || lpparam.appInfo == null || lpparam.appInfo.packageName == null) {
return;
}
if(lpparam.packageName.equals("com.lge.upsell")) {
// stops tethering APK from checking with Tmobile on tethering permissions on your account
findAndHookMethod("com.lge.upsell.UpsellUtil", lpparam.classLoader, "getSettingInt", Context.class, String.class, int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

Context context = (Context) param.args[0];
if (param.args[1].equals("whichurl")) {
Toast.makeText(context, "Upsell whichurl override = 4", Toast.LENGTH_SHORT).show();
Log.i("XposedTetheringH830", "Nice LG backdoor, Upsell whichurl override = 4");
param.setResult(4);
}
}
}
);
}

// rest of these hooks probably not needed... the whichurl backdoor above is most important
if(lpparam.packageName.equals("com.lge.wifihotspotwidget")) {
findAndHookMethod("com.lge.wifihotspotwidget.MDMWifiSettingsAdapter", lpparam.classLoader, "checkDisallowHotspot", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
Log.i("XposedTetheringH830", "checkDisallowHotspot = false");
return false;
}
});

findAndHookMethod("com.lge.wifihotspotwidget.WidgetPopup", lpparam.classLoader, "isTmusSimCard", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
Log.i("XposedTetheringH830", "widgetPopup isTmusSimCard = false");
return false;
}
});

findAndHookMethod("com.lge.wifihotspotwidget.HotspotWidgetProvider", lpparam.classLoader, "isTmusSimCard", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
Log.i("XposedTetheringH830", "HotspotWidgetProvider isTmusSimCard = false");
return false;
}
});

findAndHookMethod("android.os.UserManager", lpparam.classLoader, "hasUserRestriction", String.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

if(param.args[0].equals("no_config_tethering")){
Log.i("XposedTetheringH830", "no_config_tethering = false");
param.setResult(false);
}

}
});
}

}
}