在无需授权的情况下,通过Xposed实现短信的监听,附加发送短信以及发送状态监听

2024-01-03 12:18

本文主要是介绍在无需授权的情况下,通过Xposed实现短信的监听,附加发送短信以及发送状态监听,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在开发中有这样的一个需求,拦截手机中收到的所有短信进行记录,特此记录一下实现代码。

Class<?> mSmsMessageClass = XposedHelpers.findClass("com.android.internal.telephony.gsm.SmsMessage", classLoader);XposedHelpers.findAndHookMethod(mSmsMessageClass, "createFromPdu", byte[].class,new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param)throws Throwable {// TODO Auto-generated method stubtry {Object smsMessage = param.getResult();if (null != smsMessage) {String from = (String) XposedHelpers.callMethod(smsMessage, "getOriginatingAddress");String msgBody = (String) XposedHelpers.callMethod(smsMessage, "getMessageBody");XLog.e("test_sms", "收到短信---->" + "from:" + from + " msgBody:" + msgBody);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();XLog.e("SMS listen error", e.getMessage());}}});

以下为发送短信的实现代码

import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;import java.util.ArrayList;/*** createTime: 2019/7/16.17:28* updateTime: 2019/7/16.17:28* author: singleMan.* desc: 发送短信的class*/public class SMSUtils {//短信发送状态public static final String SENT_SMS_ACTION = "SENT_SMS_ACTION";//短信发送结果public static final String DELIVERED_SMS_ACTION = "SMS_DELIVERED_ACTION";//目标手机号码public static final String KEY_PHONENUM = "phonenumber";//短信消息IDpublic static final String MSG_ID = "msg_id";/*** 发送短信** @param msgEntity* @return*/public static boolean SendSMS(Context context, SMSEntity msgEntity, int index) {if (null == msgEntity) {return false;}if (TextUtils.isEmpty(msgEntity.getMobile()) || TextUtils.isEmpty(msgEntity.getMsgTxt())) {return false;}//如果短信内容大于70if (msgEntity.getMsgTxt().length() > 70) {return SendLongMessage(context, msgEntity, index);}try {Intent intent = new Intent(SENT_SMS_ACTION);intent.putExtra(KEY_PHONENUM, msgEntity.getMobile());intent.putExtra(MSG_ID, msgEntity.getId());PendingIntent pSendIntent = PendingIntent.getBroadcast(context, index, intent, PendingIntent.FLAG_ONE_SHOT);Intent deliveryIntent = new Intent(DELIVERED_SMS_ACTION);deliveryIntent.putExtra(KEY_PHONENUM, msgEntity.getMobile());deliveryIntent.putExtra(MSG_ID, msgEntity.getId());PendingIntent pDeliveryIntent = PendingIntent.getBroadcast(context, index, deliveryIntent, PendingIntent.FLAG_ONE_SHOT);android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();smsManager.sendTextMessage(msgEntity.getMobile(), null, msgEntity.getMsgTxt(), pSendIntent, pDeliveryIntent);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 内容超过70的短信将被分为两条短信进行发送* @param context* @param msgEntity* @param index* @return*/private static boolean SendLongMessage(Context context, SMSEntity msgEntity, int index) {ArrayList<PendingIntent> sentPendingIntents = new ArrayList<PendingIntent>();ArrayList<PendingIntent> deliveredPendingIntents = new ArrayList<PendingIntent>();android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();try {Intent intent = new Intent(SENT_SMS_ACTION);intent.putExtra(KEY_PHONENUM, msgEntity.getMobile());intent.putExtra(MSG_ID, msgEntity.getId());PendingIntent pSendIntent = PendingIntent.getBroadcast(context, index, intent, PendingIntent.FLAG_ONE_SHOT);Intent deliveryIntent = new Intent(DELIVERED_SMS_ACTION);deliveryIntent.putExtra(KEY_PHONENUM, msgEntity.getMobile());deliveryIntent.putExtra(MSG_ID, msgEntity.getId());PendingIntent pDeliveryIntent = PendingIntent.getBroadcast(context, index, deliveryIntent, PendingIntent.FLAG_ONE_SHOT);ArrayList<String> mSMSMessage = smsManager.divideMessage(msgEntity.getMsgTxt());for (int i = 0; i < mSMSMessage.size(); i++) {sentPendingIntents.add(i, pSendIntent);deliveredPendingIntents.add(i, pDeliveryIntent);}/* 发送SMS短信,注意倒数的两个PendingIntent参数 */smsManager.sendMultipartTextMessage(msgEntity.getMobile(), null, mSMSMessage, sentPendingIntents, deliveredPendingIntents);return true;} catch (Exception e) {e.printStackTrace();}return false;}}

附上发送方法中用到的Model类

/*** createTime: 2019/7/16.17:43* updateTime: 2019/7/16.17:43* author: singleMan.* desc: 一条短息*/public class SMSEntity {String id;String mobile;String msgTxt;public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;}public String getMsgTxt() {return msgTxt;}public void setMsgTxt(String msgTxt) {this.msgTxt = msgTxt;}public String getId() {return id;}public void setId(String id) {this.id = id;}}

接下来是在广播中监听短信的发送状态,并进行相应的处理

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.text.TextUtils;/*** createTime: 2019/7/16.17:29* updateTime: 2019/7/16.17:29* author: singleMan.* desc: 状态监听广播*/public class SmsStateListenerReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();String phoneNumber = intent.getStringExtra(SMSUtils.KEY_PHONENUM);String msgId = intent.getStringExtra(SMSUtils.MSG_ID);XLog.e("SMS-receiver", "短信的广播中心:" + action + "--->" + msgId + ":" + phoneNumber);//是否已发送if (TextUtils.equals(action, SMSUtils.SENT_SMS_ACTION)) {switch (getResultCode()) {case Activity.RESULT_OK://TODO 上报已经发送但是不确定是否成功XLog.e("SMS-receiver", "已发送");reportSendMsgStatus(msgId, true, "已发送完成");break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE:case SmsManager.RESULT_ERROR_RADIO_OFF:case SmsManager.RESULT_ERROR_NULL_PDU:default://TODO 上报发送失败XLog.e("SMS-receiver", "发送失败");reportSendMsgStatus(msgId, false, "发送失败");
//                    sendMessageToView(2, msgId);break;}}//是否已送达else if (TextUtils.equals(action, SMSUtils.DELIVERED_SMS_ACTION)) {switch (getResultCode()) {case Activity.RESULT_OK://TODO 上报已经送达XLog.e("SMS-receiver", "已送达");reportSendMsgStatus(msgId, true, "短信已送达");break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE:case SmsManager.RESULT_ERROR_RADIO_OFF:case SmsManager.RESULT_ERROR_NULL_PDU:default://TODO 上报未送达XLog.e("SMS-receiver", "未送达");reportSendMsgStatus(msgId, false, "短信未送达");break;}}}/*** 上报发送状态** @param taskId* @param isSuccess* @param message*/private void reportSendMsgStatus(String taskId, boolean isSuccess, String message) {//TODO 我这里执行的上报,可以根据需求进行自行修改}

记得注册广播呦 !  unRegisger的代码就不粘的,相信大家也不需要。

 /*** 注册广播*/private void registerSMSReceiver() {//注册监听短信是否成功的广播.SmsStateListenerReceiver mSMSStateListenerReceiver = new SmsStateListenerReceiver();IntentFilter mFilter = new IntentFilter();mFilter.addAction(SMSUtils.SENT_SMS_ACTION);mFilter.addAction(SMSUtils.DELIVERED_SMS_ACTION);registerReceiver(mSMSStateListenerReceiver, mFilter);}

特此记录发送短信以及监听发送状态的实现。以及通过Xposed进行短信的监听。

这篇关于在无需授权的情况下,通过Xposed实现短信的监听,附加发送短信以及发送状态监听的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565666

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin