在使用Xposed框架拦截修改Build系列的静态值一直很顺利,一直到拦截修改MODEL手机机型这个静态变量的sh时候出现问题,博主发现,通过正常的途径以及采用映射都无法修改点手机机型,遂一直努力查找技术文档攻克,终于功夫不负有心人,解决了该问题。闲话少说,上代码。
博主具体参考一款插件“应用变量”来做讲解,具体的项目地址参考应用变量
package ;
import ;
import ;
import ;
import .XC_MethodHook;
import ;
import ;
import .XC_LoadPackage;
/**
* 作者: Sollyu
* 时间: 16/10/20
* 联系: sollyu@
* 说明:
*/
public class XposedHookHelper {
private static final String TAG = "AppEnv";
public BuildImpl Build = null;
public TelephonyImpl Telephony = null;
public WifiImpl Wifi = null;
public SettingsImpl Settings = null;
private XC_LoadPackage.LoadPackageParam loadPackageParam = null;
private static XposedHookHelper instances = null;
@RequiresApi(api = .VERSION_CODES.CUPCAKE)
private XposedHookHelper(XC_LoadPackage.LoadPackageParam loadPackageParam) {
= loadPackageParam;
Build = new BuildImpl();
Telephony = new TelephonyImpl();
Wifi = new WifiImpl();
Settings = new SettingsImpl();
}
@RequiresApi(api = .VERSION_CODES.CUPCAKE)
public static XposedHookHelper getInstances(XC_LoadPackage.LoadPackageParam loadPackageParam) {
if (instances == null){
instances = new XposedHookHelper(loadPackageParam);
}
return instances;
}
public XC_LoadPackage.LoadPackageParam getLoadPackageParam() {
return loadPackageParam;
}
/**
* 拦截
*/
@SuppressWarnings("WeakerAccess")
public class BuildImpl {
public VersionImpl Version = new VersionImpl();
public HashMap<String, String> hashMap = new HashMap<>();
private BuildImpl() {
(("", getLoadPackageParam().classLoader), "get", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (([0].toString())) {
(([0].toString()));
}
}
});
}
public void MANUFACTURER(String value) {
(, "MANUFACTURER", value);
("", value);
}
public void BRAND(String value) {
(, "BRAND", value);
("", value);
}
public void BOOTLOADER(String value) {
(, "BOOTLOADER", value);
("", value);
}
public void MODEL(String value) {
(, "MODEL", value);
("", value);
}
public void DEVICE(String value) {
(, "DEVICE", value);
("", value);
}
public void DISPLAY(String value) {
(, "DISPLAY", value);
("", value);
}
public void PRODUCT(String value) {
(, "PRODUCT", value);
("", value);
}
public void BOARD(String value) {
(, "BOARD", value);
("", value);
}
public void HARDWARE(String value) {
(, "HARDWARE", value);
("", value);
}
public void SERIAL(String value) {
(, "SERIAL", value);
("", value);
}
public void TYPE(String value) {
(, "TYPE", value);
("", value);
}
public void TAGS(String value) {
(, "TAGS", value);
("", value);
}
public void FINGERPRINT(String value) {
(, "FINGERPRINT", value);
("", value);
}
public void USER(String value) {
(, "USER", value);
("", value);
}
public void HOST(String value) {
(, "HOST", value);
("", value);
}
public class VersionImpl {
private VersionImpl() {
}
public void INCREMENTAL(String value) {
(, "INCREMENTAL", value);
("", value);
}
public void RELEASE(String value) {
(, "RELEASE", value);
("", value);
}
public void BASE_OS(String value) {
(, "BASE_OS", value);
(".base_os", value);
}
public void SECURITY_PATCH(String value) {
(, "SECURITY_PATCH", value);
(".security_patch", value);
}
public void SDK(String value) {
(, "SDK", value);
("", value);
}
public void CODENAME(String value) {
(, "CODENAME", value);
(".all_codenames", value);
}
public void SDK_INT(int value) {
(, "SDK_INT", value);
}
}
}
@SuppressWarnings("WeakerAccess")
public static class TelephonyImpl {
private TelephonyImpl() {
}
public void getDeviceId(String value) {
(, "getDeviceId", new XC_ResultHook(value));
}
public void getDeviceSoftwareVersion(String value) {
(, "getDeviceSoftwareVersion", new XC_ResultHook(value));
}
public void getLine1Number(String value) {
(, "getLine1Number", new XC_ResultHook(value));
}
public void getMmsUAProfUrl(String value) {
(, "getMmsUAProfUrl", new XC_ResultHook(value));
}
public void getMmsUserAgent(String value) {
(, "getMmsUserAgent", new XC_ResultHook(value));
}
public void getNetworkCountryIso(String value) {
(, "getNetworkCountryIso", new XC_ResultHook(value));
}
public void getNetworkOperator(String value) {
(, "getNetworkOperator", new XC_ResultHook(value));
}
public void getNetworkOperatorName(String value) {
(, "getNetworkOperatorName", new XC_ResultHook(value));
}
public void getSimCountryIso(String value) {
(, "getSimCountryIso", new XC_ResultHook(value));
}
public void getSimOperator(String value) {
(, "getSimOperator", new XC_ResultHook(value));
}
public void getSimOperatorName(String value) {
(, "getSimOperatorName", new XC_ResultHook(value));
}
public void getSimSerialNumber(String value) {
(, "getSimSerialNumber", new XC_ResultHook(value));
}
public void getSubscriberId(String value) {
(, "getSubscriberId", new XC_ResultHook(value));
}
public void getCallState(int value) {
(, "getCallState", new XC_ResultHook(value));
}
public void getDataNetworkType(int value) {
(, "getDataNetworkType", new XC_ResultHook(value));
}
public void getDataState(int value) {
(, "getDataState", new XC_ResultHook(value));
}
public void getNetworkType(int value) {
(, "getNetworkType", new XC_ResultHook(value));
}
public void getPhoneCount(int value) {
(, "getPhoneCount", new XC_ResultHook(value));
}
public void getPhoneType(int value) {
(, "getPhoneType", new XC_ResultHook(value));
}
public void getSimState(int value) {
(, "getSimState", new XC_ResultHook(value));
}
}
@SuppressWarnings("WeakerAccess")
public static class WifiImpl {
public InfoImpl Info = new InfoImpl();
private WifiImpl() {
}
public void enableNetwork(boolean returnStatus) {
(, "enableNetwork", new XC_ResultHook(returnStatus));
}
public void disableNetwork(boolean returnStatus) {
(, "disableNetwork", new XC_ResultHook(returnStatus));
}
public void getWifiState(int returnStatus) {
(, "getWifiState", new XC_ResultHook(returnStatus));
}
public static class InfoImpl {
private InfoImpl() {
}
public void getSSID(String value) {
(, "getSSID", new XC_ResultHook(value));
}
public void getBSSID(String value) {
(, "getBSSID", new XC_ResultHook(value));
}
public void getMacAddress(String value) {
(, "getMacAddress", new XC_ResultHook(value));
}
public void getIpAddress(int value) {
(, "getIpAddress", new XC_ResultHook(value));
}
public void getFrequency(int value) {
(, "getFrequency", new XC_ResultHook(value));
}
public void getLinkSpeed(int value) {
(, "getLinkSpeed", new XC_ResultHook(value));
}
}
}
@RequiresApi(api = .VERSION_CODES.CUPCAKE)
@SuppressWarnings("WeakerAccess")
public static class SettingsImpl {
public SystemImpl System = new SystemImpl();
private SettingsImpl() {
}
@SuppressWarnings("WeakerAccess")
public static class SystemImpl {
private HashMap<String, String> hashMap = new HashMap<>();
@RequiresApi(api = .VERSION_CODES.CUPCAKE)
private SystemImpl() {
(, "getString", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if ( > 1 && [1] != null && ([1].toString())) {
(([1].toString()));
}
}
});
(, "getString", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if ( > 1 && [1] != null && ([1].toString())) {
(([1].toString()));
}
}
});
}
public void getString(String keyName, String value) {
(keyName, value);
}
}
}
private static class XC_ResultHook extends XC_MethodHook {
private Object resultObject = null;
XC_ResultHook(Object resultObject) {
= resultObject;
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (resultObject != null)
(resultObject);
}
}
}
以上代码是项目“应用变量”的文件
其中关键代码为:
使用了HashMap存放Build中的静态变量,然后通过判断HashMap中的键值是否存在,存在则去修改返回结果
(("", getLoadPackageParam().classLoader), "get", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (([0].toString())) {
(([0].toString()));
}
}
});
把MODEL值存放进HashMap
public void MODEL(String value) {
(, "MODEL", value);
("", value);
}
解析上面两句代码,我们可以得出:
”应用变量“首先通过setStaticObjectField()方法设置了自定义值,然后又通过setResult()方法修改了get方法的返回值,以此达到了修改的目的。
看到这里是不是恍然大悟了呢?所以赶快去试试吧。
最后非常感谢项目”应用变量“的作者kingsollyu,如果使用该文章请标明出处!