获取IMEI码:getDeviceId()和 getDeviceId(int slotIndex)比较,以及相应Xposed拦截策略

getDeviceId()和getDeviceId(int slotIndex)比较

 getDeviceId()和getDeviceId(Int)两个方法都是TelephonyManager类中获取IMEI码的方法,一般情况下,我们需要获取IMED码的时候,通常调用getDeviceId()方法,返回一条String字符串为获得的IMEI码。

getDeviceId(Int) 方法同样也是返回IMEI码,主要用于需要获取双SIM卡的手机IMEI码。我们都知道,双SIM卡的手机拥有两个卡槽,分别为卡1和卡2,所以,getDeviceId(Int)方法的参数Int指的是双SIM卡的下标,即卡1的下标为0,卡2的下标为1。getDeviceId(0)返回的是卡1的IMEI码,getDeviceId(1)返回的是卡2的IMEI码。

下面我们看一下源码:

getDeviceId():

public String getDeviceId() {
        try {
            ITelephony telephony = getITelephony();
            if (telephony == null)
                return null;
            return telephony.getDeviceId(mContext.getOpPackageName());
        } catch (RemoteException ex) {
            return null;
        } catch (NullPointerException ex) {
            return null;
        }
    }

从源码中我们可以看到,首先程序通过getITelephony()方法获取了一个ITelephony接口的实例telephony,然后判断实例是否获取成功,没有拿到则返回null,获取成功则通过调用接口的getDeviceId()方法,传入该程序的包名,拿到IMEI码。

getDeviceId(Int):

public String getDeviceId(int slotIndex) {
        // FIXME this assumes phoneId == slotIndex
        try {
            IPhoneSubInfo info = getSubscriberInfo();
            if (info == null)
                return null;
            return info.getDeviceIdForPhone(slotIndex, mContext.getOpPackageName());
        } catch (RemoteException ex) {
            return null;
        } catch (NullPointerException ex) {
            return null;
        }
    }

从源码中我们可以看出getDeviceId()和getdeviceId(Int)方法的不同。

在getDeviceId(Int)方法里,首先通过getSubscriberInfo()方法获取了IPhoneSubInfo接口实例。之后也是判断实例是否获取成功,获取成功则会调用接口的getDevicedIdForPhone()方法,传入想要获取的SIM卡的下标和该程序的包名,拿到相对应的SIM卡的IMEI码。

总结:

getDeviceId():

适用:单卡的手机设备。

作用:获取IMEI码。

内部调用:通过ITelephony接口的getDeviceId()方法。

传入参数:无。

getDeviceId(Int):

适用:双卡的手机设备。

作用:获取相应的SIM卡的IMEI码。

内部调用:通过IPhoneSubInfo接口的getDevicedIdForPhone()方法。

传入参数:相应的SIM卡下标。

提示:当手机仅插入的一张SIM卡,使用getDevicedId(Int)方法获取卡1和卡2的IMEI码,getDeviceId(0)和getDeviceId(1)返回值相同,都是仅有的一张SIM卡的IMEI码。

针对Xposed拦截修改以上两种方式获取IMEI码:

针对getDeviceId()方式获取IMEI码,正常Hook拦截即可:

XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                //抓取到方法
                

            }
        });

针对getDeviceId(Int)方式获取IMEI码,需要钩子方法的参数补上整形类,表示钩取的为带参数的getDeviceId()方法:

XposedHelpers.findAndHookMethod(TelephonyManager.class, methodName, int.class, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                XposedBridge.log("进入函数");
                if ((int)param.args[0]==0){
                    XposedBridge.log("进入判断"+0);
                    param.setResult("testing");
                }else {
                    XposedBridge.log("进入判断"+1);
                    param.setResult("testing");
                }

            }
        });

其中可以在回调方法里对SIM卡下标进行判断,以达到修改相应的SIM卡的IMEI码目的。

引用本文请标明出处,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_34149335/article/details/81113721