[原创]关于短信发送人中显示号码和名称
在MAP或SMPP协议中使用SenderID

1. 前言

最近发现手机接收短信的时候,如果用大陆的手机号码接收一些官方的短信,发送人是显示一个很复杂的SP号码,如果用国外的手机号码接收短信,发送人有机会会显示发送者名称。

发送人显示号码

图1:发送人显示号码

发送人显示名称

图2:发送人显示名称

2. SenderID政策

已经一番搜索,发现是国内大陆打击诈骗信息,规定对短信发送者要求不能使用名称(Sender ID),必须显示号码。境外不同国家也有不一样的规定,有些需要备案注册等手续才能使用SenderID,有些对SenderID有其他一些限制。

如果需要发送带SenderID的短信该怎么做呢?(国内运营商不用尝试了,会被屏蔽无法收到短信)


3. API发送

如果是使用一些第三方机构发送短信,如Aliyun、Amazon等,使用他们的api就行,在Sender处填入SenderID即可。


4. SCCP层修改

如果不用API,而是直接对接运营商来发送短信,需要修改短信协议里参数。

首次尝试修改SS7(Sigtran)协议中fowardSM消息里SCCP层的 Calling Party address - Global Title - Calling Party Digits参数,这个值表示发送人号码。

但是但是,这里的发送号码采用的是TBCD编码(Telephony BCD),取值范围只能是0-9、*、#、a、b、c这几个字符,只能把发送人号码修改成小写字母abc其中之一,不能修改成任意字母。

未达到理想效果。


5.MAP层修改

继续尝试修改,在MAP层中PDU协议里发现有个TPOA(TP-Originating-Address)参数,默认使用国际电话号码格式放入发送者号码,里面有个字节里的3个bit表示TON(Type of number)号码类型。

网上查到定义,001表示国际号码,101表示使用字母数字。

Bit6-4 TON(Type of number)含义如下:

6 5 4 Meaning
0 0 0 Unknown
0 0 1 International number
0 1 0 National number
0 1 1 Network specific number
1 0 0 Subscriber number
1 0 1 Alphanumeric, (GSM 7-bit default alphabet)
1 1 0 Abbreviated number
1 1 1 Reserved for extension

如果使用101后(字节是D0),后面的号码部分要是按照3GPP TS 23.038规范的7bit压缩编码来填入。文章后面附ACSII转7bit的原理说明,网上也能找到各种编程语言的转换代码。

最后格式改成如下(图是别人的,如侵立删)

最后测试OK。


6. SMS-DELIVER消息修改

SMS-DELIVER消息也是使用的PDU格式,和上面修改方法相同,修改TPOA参数即可。


7. SMPP协议修改

如果是使用SMPP协议通过短信中心SMSC发送短信,同样是修改submit_sm消息里的TON和发送人参数,这里放张图不再叙述。

最后格式改成如下(图是别人的,如侵立删)


8. 题外话

由于SS7、Sigtran、SMPP等通信协议的基础架构是多年之前制定的,所以在加解密防篡改方面并没有太完善,有机会被用于非法诈骗活动,希望全球各地运营商尽快将各个网元升级到5G网元设备,使用Diameter协议来发送短信,避免一些安全问题。



附:7bit编码格式转换

例子:把 Amazon 转换为 7bit编码

1. Amazon转成16进制ACSII码

Char: A m a z o n
ASCII: 41 6D 61 7A 6F 6E

2. 反向排列ACSII,从后往前

ASCII: 41 6D 61 7A 6F 6E
Revert: 6E 6F 7A 61 6D 41

3. 转为2进制

ASCII: 6E 6F 7A 61 6D 41
Binary: 01101110 01101111 01111010 01100001 01101101 01000001

4. 去掉第1位的0,8bit变7bit

8bit: 01101110 01101111 01111010 01100001 01101101 01000001
7bit: 1101110 1101111 1111010 1100001 1101101 1000001

5. 重新连接所有7bit值

Name Value
7bit: 1101110 1101111 1111010 1100001 1101101 1000001
Joint: 110111011011111111010110000111011011000001

6. 前面补0,凑够8的倍数

Name Value
Binary: 110111011011111111010110000111011011000001
Padding: 000000110111011011111111010110000111011011000001

7. 重新按8bit分割转ACSII

Binary: 00000011 01110110 11111111 01011000 01110110 11000001
ASCII: 03 76 FF 58 76 C1

8. 反向排列ACSII,从后往前

ASCII: 03 76 FF 58 76 C1
Revert: C1 76 58 FF 76 03

完成,Amazon的7bit编码是C17658FF7603


Last modified on 2023-11-28