Skip to content

Instantly share code, notes, and snippets.

@tewilove
Created October 22, 2015 09:05
Show Gist options
  • Save tewilove/a5a66c7a3ef3216013c4 to your computer and use it in GitHub Desktop.
Save tewilove/a5a66c7a3ef3216013c4 to your computer and use it in GitHub Desktop.
306SH HOOK, partial works on CHINA MOBILE/TDD BAND 41
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="preferred_network_mode_choices">
<item>LTE/CDMA</item>
<item>CDMA</item>
<item>LTE/WCDMA/GSM</item>
<!--<item>GSM only</item>-->
</string-array>
<string-array name="preferred_network_mode_values">
<item>8</item>
<item>4</item>
<item>9</item>
<!--<item>1</item>-->
</string-array>
</resources>
package tewilove.unlock.pb25;
import java.util.HashMap;
import java.util.Map;
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;
/**
* Created by ming on 15-10-22.
*/
public class XHook_SystemProperties implements IXposedHookLoadPackage {
private static Map<String,String> sStringProperties = new HashMap<String,String>();
private static Map<String,Integer> sIntegerProperties = new HashMap<String,Integer>();
private static XC_MethodHook sHook_android_os_SystemProperties_get = new XC_MethodHook() {
@Override
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
if (param.args == null)
return;
if (param.args.length < 1)
return;
if (!(param.args[0] instanceof String))
return;
String key = (String) param.args[0];
if (sStringProperties.containsKey(key))
param.setResult(sStringProperties.get(key));
param.hasThrowable();
}
};
private static XC_MethodHook sHook_android_os_SystemProperties_getInt = new XC_MethodHook() {
@Override
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
if (param.args == null)
return;
if (param.args.length < 1)
return;
if (!(param.args[0] instanceof String))
return;
String key = (String) param.args[0];
if (sIntegerProperties.containsKey(key))
param.setResult(sIntegerProperties.get(key));
}
};
static {
sStringProperties.put("ro.debuggable", "1");
sStringProperties.put("telephony.lteOnCdmaDevice", "0");
sStringProperties.put("ro.telephony.default_network", "9");
sIntegerProperties.put("ro.debuggable", Integer.valueOf(1));
sIntegerProperties.put("telephony.lteOnCdmaDevice", Integer.valueOf(0));
sIntegerProperties.put("ro.telephony.default_network", Integer.valueOf(9));
}
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
// Those are properties applies to ALL
XposedHelpers.findAndHookMethod("android.os.SystemProperties", lpparam.classLoader,
"get", String.class,
sHook_android_os_SystemProperties_get);
XposedHelpers.findAndHookMethod("android.os.SystemProperties", lpparam.classLoader,
"get", String.class, String.class,
sHook_android_os_SystemProperties_get);
XposedHelpers.findAndHookMethod("android.os.SystemProperties", lpparam.classLoader,
"getInt",
String.class, int.class,
sHook_android_os_SystemProperties_getInt);
}
}
package tewilove.unlock.pb25;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Objects;
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;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
/**
* Created by ming on 15-10-22.
*/
public class XHook_TelephonyCommon implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpParam) throws Throwable {
if (!lpParam.packageName.equals("com.android.phone"))
return;
XposedHelpers.findAndHookMethod("com.android.internal.telephony.gsm.GSMPhone", lpParam.classLoader,
"setProperties", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("create missing ApnListTracker bgn");
try {
Class<?> clz = Class.forName("jp.co.sharp.android.internal.telephony.dataconnection.ApnListTracker");
Constructor<?> ctor = clz.getConstructor(Class.forName("com.android.internal.telephony.PhoneBase"));
ctor.newInstance(param.thisObject);
} catch (Throwable t) {
XposedBridge.log(t);
}
XposedBridge.log("create missing ApnListTracker end");
}
});
XposedHelpers.findAndHookMethod("jp.co.sharp.android.internal.telephony.dataconnection.ApnListTracker", lpParam.classLoader,
"createAllApnList", new XC_MethodHook() {
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("fix mAllApns bgn");
try {
Object thz = param.thisObject;
Class<?> clz = thz.getClass();
Field fid = clz.getDeclaredField("mAllApns");
fid.setAccessible(true);
Object obj = fid.get(thz);
ArrayList<Object> mAllApns = (ArrayList<Object>) obj;
for (Object apn : mAllApns) {
Class<?> clzApn = apn.getClass();
Field fidApn = clzApn.getDeclaredField("apnClass");
fidApn.setAccessible(true);
// internet 1
// ota 2
// pam 3
fidApn.setInt(apn, 1);
}
} catch (Throwable t) {
XposedBridge.log(t);
}
XposedBridge.log("fix mAllApns end");
}
});
XposedHelpers.findAndHookMethod("jp.co.sharp.android.internal.telephony.dataconnection.ApnSyncedToBP", lpParam.classLoader,
"log", String.class, new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
if (param.args != null && param.args[0] instanceof String) {
String str = (String) param.args[0];
XposedBridge.log("[ApnSyncedToBP] " + str);
}
return null;
}
});
}
}
package tewilove.unlock.pb25;
/**
* Created by tewilove on 15/10/18.
*/
import android.content.res.XModuleResources;
import java.lang.Override;
import java.lang.reflect.Field;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.IXposedHookInitPackageResources;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_InitPackageResources;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class XHook_TeleService implements IXposedHookZygoteInit, IXposedHookInitPackageResources,
IXposedHookLoadPackage {
private static String MODULE_PATH = null;
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
MODULE_PATH = startupParam.modulePath;
}
@Override
public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) throws Throwable {
if (!resparam.packageName.equals("com.android.phone"))
return;
try {
XposedBridge.log("hook bgn");
// resparam.res.setReplacement("com.android.phone", "bool", "world_phone", false);
// resparam.res.setReplacement("com.android.phone", "bool", "config_enabled_lte", true);
XModuleResources modRes = XModuleResources.createInstance(MODULE_PATH, resparam.res);
resparam.res.setReplacement("com.android.phone", "array", "preferred_network_mode_choices",
modRes.fwd(R.array.preferred_network_mode_choices));
resparam.res.setReplacement("com.android.phone", "array", "preferred_network_mode_values",
modRes.fwd(R.array.preferred_network_mode_values));
XposedBridge.log("hook end");
} catch (Throwable t) {
XposedBridge.log(t);
}
}
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpParam) throws Throwable {
if (!lpParam.packageName.equals("com.android.phone"))
return;
try {
XposedHelpers.findAndHookMethod("com.android.internal.telephony.CallManager", lpParam.classLoader,
"unregisterPhone",
Class.forName("com.android.internal.telephony.Phone"),
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("prevent com.android.phone from force closing");
try {
Object thz = param.thisObject;
Class<?> clz = thz.getClass();
Field fid = clz.getDeclaredField("mWFCStateRegistered");
fid.setAccessible(true);
fid.setBoolean(thz, false);
} catch (Throwable t) {
XposedBridge.log(t);
}
}
}
);
} catch (Throwable t) {
XposedBridge.log(t);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment