解决Xposed框架拦截修改手机型号失败问题

时间:2025-01-26 08:13:40

在使用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,如果使用该文章请标明出处!