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


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