Skip to content

📱 SmsManagerHook

监控 android.telephony.SmsManager短信发送与读取行为,覆盖普通文本、数据短信、长短信三种发送方式及 SIM 卡短信读取。

属性
源码路径SmsManagerHook.java
类型具体类(extends ApiMonitorHook)
所在包com.android.reverse.apimonitor
关键依赖android.telephony.SmsManagerandroid.util.Base64RefInvokeLogger

🎯 职责

短信是移动端最常见的隐私泄露渠道之一(验证码拦截、静默扣费短信)。SmsManagerHookSmsManager 的全部发送路径实施拦截,记录目标号码、短信内容(或 Base64 编码内容),同时监控对 SIM 卡存储短信的读取行为。

🔍 监控的 API

被 Hook 的方法记录的参数 / 行为
SmsManager.sendTextMessage()目标号码(args[0])、文本内容(args[2])
SmsManager.getAllMessagesFromIcc()触发即记录(无参数可提取)
SmsManager.sendDataMessage()目标号码(args[0])、端口(args[2])、内容 Base64(args[3])
SmsManager.sendMultipartTextMessage()目标号码(args[0])、拼接后完整内容(args[2])

🧠 关键实现

sendTextMessage Hook

java
Method sendTextMessagemethod = RefInvoke.findMethodExact(
        "android.telephony.SmsManager", ClassLoader.getSystemClassLoader(),
        "sendTextMessage",
        String.class, String.class, String.class,
        PendingIntent.class, PendingIntent.class);
hookhelper.hookMethod(sendTextMessagemethod, new AbstractBahaviorHookCallBack() {
    @Override
    public void descParam(HookParam param) {
        Logger.log_behavior("Send SMS ->");
        String dstNumber = (String) param.args[0];
        String content = (String) param.args[2];
        Logger.log_behavior("SMS DestNumber:" + dstNumber);
        Logger.log_behavior("SMS Content:" + content);
    }
});

sendTextMessage 签名为 (destinationAddress, scAddress, text, sentIntent, deliveryIntent),因此:

  • args[0] = 目标号码
  • args[2] = 短信正文(args[1] 是短信中心号码,通常为 null)

sendDataMessage Hook(二进制数据短信)

java
Method sendDataMessagemethod = RefInvoke.findMethodExact(
        "android.telephony.SmsManager", ClassLoader.getSystemClassLoader(),
        "sendDataMessage",
        String.class, String.class, short.class,
        byte[].class, PendingIntent.class, PendingIntent.class);
hookhelper.hookMethod(sendDataMessagemethod, new AbstractBahaviorHookCallBack() {
    @Override
    public void descParam(HookParam param) {
        Logger.log_behavior("Send Data SMS ->");
        String dstNumber = (String) param.args[0];
        short port = (Short) param.args[2];
        String content = Base64.encodeToString((byte[]) param.args[3], 0);
        Logger.log_behavior("SMS DestNumber:" + dstNumber);
        Logger.log_behavior("SMS destinationPort:" + port);
        Logger.log_behavior("SMS Base64 Content:" + content);
    }
});

二进制短信的威胁

sendDataMessage 用于发送端口寻址的二进制短信,常被恶意软件用于向特定端口(如 WAP Push、OTA 配置端口)发送隐蔽指令。ZjDroid 将 byte[] 内容通过 Base64.encodeToString() 转换为可打印字符串记录,避免乱码。

sendMultipartTextMessage Hook(长短信)

java
Method sendMultipartTextMessagemethod = RefInvoke.findMethodExact(
        "android.telephony.SmsManager", ClassLoader.getSystemClassLoader(),
        "sendMultipartTextMessage",
        String.class, String.class,
        ArrayList.class, ArrayList.class, ArrayList.class);
hookhelper.hookMethod(sendMultipartTextMessagemethod, new AbstractBahaviorHookCallBack() {
    @Override
    public void descParam(HookParam param) {
        Logger.log_behavior("Send Multipart SMS ->");
        String dstNumber = (String) param.args[0];
        ArrayList<String> sms = (ArrayList<String>) param.args[2];
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < sms.size(); i++) {
            sb.append(sms.get(i));
        }
        Logger.log_behavior("SMS DestNumber:" + dstNumber);
        Logger.log_behavior("SMS Content:" + sb.toString());
    }
});

长短信被系统拆分为多个分段(ArrayList<String>),此处通过遍历 args[2] 并拼接 StringBuilder 还原完整内容。

getAllMessagesFromIcc Hook(SIM 卡短信读取)

java
Method getAllMessagesFromIccmethod = RefInvoke.findMethodExact(
        "android.telephony.SmsManager", ClassLoader.getSystemClassLoader(),
        "getAllMessagesFromIcc");
hookhelper.hookMethod(getAllMessagesFromIccmethod, new AbstractBahaviorHookCallBack() {
    @Override
    public void descParam(HookParam param) {
        Logger.log_behavior("Read SMS From Icc ->");
    }
});

getAllMessagesFromIcc() 无参数,仅记录触发行为本身。该方法被调用即意味着应用正在读取 SIM 卡上存储的短信(而非手机内存短信)。

🔗 调用关系

📌 小结

SmsManagerHook 以 4 个 Hook 点覆盖了 SmsManager 的完整公开发送接口,是检测短信木马、吸费软件、验证码拦截的核心组件。其中对二进制短信的 Base64 编码处理和对长短信的分段拼接还原,体现了对实际攻击场景的针对性设计。

相关文档:

基于 MIT 协议发布 · 本文档仅用于安全研究与教学目的