基于MT6261的短信拦截和修改

来源:互联网 发布:输油管道问题 算法 编辑:程序博客网 时间:2024/06/05 08:07

此前做的一个功能的小部分,简而言之就是提取短信中的内容,进行判断看是否为修改手机默认快速拨号号码的指令。是则提取修改,不是则放过不做处理。

这个功能的实现首先注意的几点:

1、默认的快速拨号效果是打开并且自己已经做过初步的调整,可以达到默认的号码植入。

2、需要判断的永远是最新的一条短信,而不是所有的短信。

  开始:

    第一、必须要找到SMS通知用户前获取SMS解析的content,这个步骤只得通过自己的调试来一步步追踪,除非非常了解SMS这块代码,不然你是不知道内容相关的函数是srv_sms_indicate_data(U8 index)、srv_sms_get_data(index, data, content);然而这两个函数对我来讲,我没有用上,因为我还不需要在这个刚开始处理的阶段进行甄别,毕竟我只是需要判断和提取内容而已。所以看来上面函数的相互调用的关系,很快就确定了srv_sms_save_sms_callback(srv_sms_callback_struct* data)函数才是自己所需的。如此前所说, 我需要判断的是在只是最新的一条SMS,此前的对我没有任何用处,如果去从过于底层去整改,哪无疑是捡芝麻丢西瓜,得不偿失。

 第二、分析上面的函数,很容易就发现这一句:

   /* put to awaited list last entry, from now on only process new data as awaited list last entry */
            srv_sms_add_new_data(msg_id, pdu_id, msg_data, app_lib_data->pdu_len, app_lib_data->forMMI_UserData);    

注释的清晰明了,等待条目最末尾的,重新开始处理。该函数:static void srv_sms_add_new_data(U16 msg_id,  U16 pdu_id, srv_sms_new_msg_struct *entry, U16 length, U8 *data) 通过参数甄别是最末尾的参数为最新SMS内容。所以,起步就从这里开始。

 

进入:

  假设客户要求发送的指令为:AB0+KEY_NUM+PHONE_NUM+B08.

即:AB0为SMS content的前三个字符,KEY_NUM为对应的默认的快速拨号的键值(key_1 、KEY_2……),PHONE_NUM为需要新写入的电话号码。B08为后续的三个字符。

假如需要将13808001122 号码默认为3键的速拨号码,那么短信发送的指令是:AB0313808001122B08

所以在接收新SMS的时候,判定这个内容的合法性即可。就是app_lib_data->forMMI_UserData中的内容。

  判断最好遵循由大到小的规则,而不是逐个逐个字符去适配判断。

1、首先判断长度,只有长度符合这个规则之下的才能被认定为具有下一步判定的价值。

可以直接使用strlen函数来获取app_lib_data->forMMI_UserData的长度。S_content_len=strlen(app_lib_data->forMMI_UserData); 

2、判定了长度以后,又需要注意一个地方,此时还是不需要挨个判断字符,而是优先判定电话号码的首位。即长度等于18位的内容的第五个字符是否为1.

国内手机号的第一位没有不是1的。不是1目前来说肯定不是正常手机号(带区号的这些排除)。

3、判定手机号的正确性,应该都是在’0‘到’9‘的范围内,如果不是,也就舍弃继续判断的价值。

4、最后判定前三个字符和手三个字符的正确性。

5、确认为修改默认号码的指令后,再做提取号码的准备(毕竟最终目的是修改默认号码,肯定需要做一个提取的)。

6、采用strncpy函数,将app_lib_data->forMMI_UserData内容的第5到15位字符提取到新定义的数组中。


至于后期存储电话号码的数组怎么处理,则不是这里需要说明的!