Xposed实现短信拦截

最近在玩Xposed,然后刚好要实现个功能,收到短信的时候自动将短信的内容打印到log中,其实也算是短信拦截的一种了。然后做的时候遇见了一点坑,就写一下记录下来,当时做的时候参考了这个博客的内容。写的也很清楚,包括发短信的原理啥的,但是真正做的时候有点小问题,也研究了一下,这里就改编了一些,顺便说一下自己的一些理解。

Hook包名

啥也不说,先上代码。

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;


public class HookManager implements IXposedHookLoadPackage {

   // private static final String SMSPACKAGENAME = "com.google.android.talk";
    private static final String SMSPACKAGENAME = "com.android.mms"


    public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {


        if (lpparam.appInfo != null && lpparam.isFirstApplication
                && (SMSPACKAGENAME.equals(lpparam.packageName)))
        {
            XposedBridge.log("Loaded App:" + lpparam.packageName);
            Logger.log("Loaded App:" + lpparam.packageName);
            HookSmsMessage.GetHookSmsMessage(lpparam);
        }
    }
}

这段代码只是先获取包名,有一点需要注意的是那个注释的地方,并不是没用的,在参考的那篇博客中,要hook的包名是“com.android.mms”,但是经过测试,原生的nexus手机接收短信的包并不是这个包,仔细一看,原生手机有个接收短信的应用叫“环聊”,查了一下,这个包实际为“com.google.andriod.talk”,也就是注释掉的那句话。也就是说,如果用普通手机去hook的话,用com.android.mms,但是如果用原生手机去hook的话,就要把注释放开了,换成com.google.andriod.talk

Hook类和方法

还是先放代码



import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;

public class HookSmsMessage {


    private static final String class_name = "com.android.internal.telephony.gsm.SmsMessage$PduParser";

    public static void GetHookSmsMessage(XC_LoadPackage.LoadPackageParam lpparam) {


        findAndHookMethod(class_name, lpparam.classLoader, "getUserDataUCS2", int.class, new XC_MethodHook() {

            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                Logger.log("beforeHookedMethod");
                // this will be called before the clock was updated by the original method
            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                // this will be called after the clock was updated by the original method
                try {
                    String message = param.getResult().toString();
                    Logger.log("the message is : " + message);
                    //新增其他操作
                } catch (Exception e) {
                    XposedBridge.log(e);
                }
            }
        });
    }
 }

代码也很清楚,那篇参考的博客说的也很清楚,这里是接收短信的时候系统会调用com.android.internal.telephony.gsm.SmsMessage$PduParser类中的getUserDataUCS2方法,然后在这个方法执行后进行hook,我这里的操作是log打印,当然有其他的操作也可以在这里加上。这段代码在原生手机nexus上实测有效,同时在普通的手机上测试也有效,当然有一个出现问题的地方,也是走过的比较坑的地方,下面就来说一下。

双卡接收短信

这里在测试的时候发现了一个问题,当时笔者使用的是中兴的一个电信定制的手机双卡的手机进行测试的,发现当插入移动卡的时候这个拦截短信的程序好使,而插入电信卡的时候,这个程序并不好使,同时xposed的日志显示找不到这个方法(Not Fount Method)。

然后经过查找一些资料,发现那个插卡的卡槽,有一个下面写着gsm,这个卡是移动(联通没测过,应该也行)可以使用的,而这个时候,看一下我们的代码,我们hook的类名刚好叫gsm.SmsMessage,所以很明显,这个类是专门给gsm用的。

然后另一个卡槽,只能电信卡用,下面写着cdma,所以自然,我们要找的包肯定是关于cdma的包,这里笔者找的了一个包叫com.android.internal.telephony.cdma.SmsMessage,这个就是cdma卡进行接收短信的包了。这里贴一下cdma包的API源码。看一下果然发现没有getUserDataUCS2这样的方法了,当然xposed会报错找不到该方法。至于cdma卡hook的时候是什么方法,笔者也没有继续做下去,刚刚上面把cdma源码链接附上去了,有兴趣的小伙伴可以自己研究一下,当然成功的话可以在下面留言告诉我一下:-)

总结

xposed的短信拦截要注意手机的机型,有些深度定制的机型会改掉一些包名或者方法名,其次要注意双卡和单卡的问题,尤其是电信的卡。差不多就酱~o~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Xposed框架是一种基于Android系统的模块化框架,它可以在不修改系统源码的情况下,通过插件方式对Android系统的各个部分进行修改和增强。通过Xposed框架,我们可以修改短信应用的功能以满足个人需求。 首先,在Xposed框架中,我们需要找到适合修改短信的模块。可能有一些第三方模块已经提供了短信功能的修改。我们可以通过Xposed框架的模块库或者其他资源渠道搜索到相应模块。在找到适合的模块后,我们可以安装并启用它。 其次,在启用了模块后,我们可以开始修改短信应用。具体的修改方式取决于所使用的模块。一般来说,我们可以通过模块的设置界面来配置短信的修改功能。例如,我们可以增加短信的过滤规则,将某些短信自动转到垃圾箱中,或者自动回复某些特定的短信。我们还可以更改短信的界面样式,增加一些个性化的功能,如修改字体颜色、背景等。这些都可以通过模块的设置来实现。 最后,在完成对短信应用的修改后,我们需要重启手机,以使Xposed框架生效。在重启后,我们可以体验修改后的短信应用功能。 总的来说,通过Xposed框架,我们可以修改短信应用的功能,增加个性化设置,满足我们对短信功能的定制需求。但是需要注意的是,使用Xposed框架修改系统功能可能存在一定的风险,如果操作不当可能导致系统不稳定或程序崩溃。因此,在进行修改前,建议备份好数据,确保有恢复的方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值