smsBomb 短信轰炸机:11 家服务商,4 条命令跑通
【免费下载链接】smsBomb短信💣炸🐔项目地址: https://gitcode.com/gh_mirrors/sms/smsBomb
把一批泄露的短信通道一晚验完 📮
半夜有人把一份泄露的短信渠道清单丢过来,问这些通道现在还能不能发。逐家手写签名、改手机号、发请求验证,跑两家就得耗掉一下午。smsBomb 把这件事压成了一条命令:它把十余家短信服务商的发送接口封装成插件,从本地配置里按权重抽取通道,用多进程把验证码短信批量发出去,再用彩色日志标出每一步的结果。整台机器只有三层:插件、调度、日志。
先看懂这台机器的三层构造 ⚙️
| 层 | 干什么 | 位置 |
|---|---|---|
| 插件层 | 每个文件实现一家服务商的签名与发送,统一返回 True/False | smsBomb/plugins/下 11 个 .py |
| 调度层 | 加权随机抽节点、多进程并发、失败降权、失败率熔断 | smsBomb/smsBomb.py |
| 输出层 | coloredlogs 按级别上色,格式固定为[级别 时间 模块:行号] 内容 | 同上文件的setup_logger |
把 smsBomb 想成一个快递调度中心:config/sms.json里的每个节点是一个快递站点,短信是包裹,weight 是分配给该站点的派件份额。节点"退件"(请求失败)不会直接报废,份额被调低一档;调到 0 就进停用名单;所有节点都停用时,调度中心还会把名单翻出来重新派一遍。
插件这边,它做的事其实很简单——配置里写product: "aliyun",程序就去加载对应插件并调用它的 send 方法。技术上这叫插件化(plugin architecture),plugins/aliyun.py 里能看到从拼参数到 HMAC-SHA1 签名的完整实现。选节点那步做的事其实很简单——把每个节点按 weight 复制若干份放进池子,随机抽一份。技术上这叫加权随机选择(weighted random selection),实现在SmsBomb._random_weight_select里。另外还有一条保命红线:失败次数除以目标次数,超过 0.95 就停手。技术上这叫熔断(circuit breaker),阈值写死在max_allowed_failed_rate字段。
从克隆到跑通只要 4 条命令 🚀
环境要求 Python 3.6 及以上,不兼容 2.x;多版本机器建议用 PyEnv 或 Anaconda 隔离一个干净环境。
跑完这一步,本地应出现 smsBomb 目录,里面有config和smsBomb两个关键子目录。
git clone https://gitcode.com/gh_mirrors/sms/smsBomb这一步把 11 个服务商插件和 19 个示例节点配置全部拿到手。
这一步没有输出,跑完当前路径应停在仓库根目录。
cd smsBomb默认配置路径config/sms.json是相对当前目录解析的,不在根目录跑会直接报"配置不可为空"。
装完终端只回显依赖安装成功的几行。
pip install -r requirements.txtCLI 版依赖只有 requests 和 coloredlogs 两个包;GUI 依赖在requirements-gui.txt,需要时再装。
预期你会先看到 DEBUG 级的"成功加载配置文件",随后 INFO 级打印目标号码,日志开始滚动。
python -m smsBomb -t 13800138000 -n 3 -vv-n 3表示只发 3 条,-vv打开 DEBUG 日志,第一次跑用它能把调度全过程看清;目标号码建议用自己的。完整参数面板如下,第一次用记住前两个就够:
| 参数 | 作用 | 默认值 |
|---|---|---|
-t / --target | 目标手机号,必填 | 无 |
-n / --times | 发送次数 | 10 |
-p / --product | 指定服务商,如 netease | 全部节点加权随机 |
-c / --config | 配置文件路径 | config/sms.json |
--process | 并发进程数 | 5 |
-m / --message | 自定义短信内容,仅对enable_custom_msg: true的节点生效 | 无 |
-x / --proxy | HTTP/HTTPS 代理 | 自动读环境变量 |
-v / -vv / -vvv | 日志详细程度 | 0(WARNING 起) |
把彩色日志逐行读明白 🌈
日志由 coloredlogs 上色,颜色即级别:绿色 DEBUG、蓝或白 INFO、黄色 WARNING、红色 ERROR,扫一眼颜色就能判断程序状态。
用-vvv跑一次,滚过去的日志大致长这样(从仓库截图节选):
[DEBUG 2018-05-31 11:29:17 root:26] 成功加载配置文件:config/sms.json,产品: None [INFO 2018-05-31 11:29:17 smsBomb.smsBomb:187] Start attacking phone: 138**** [DEBUG 2018-05-31 11:29:17 smsBomb.plugins.aliyun.AliyunPlugin:88] 拼接完成请求体: Signature=... [INFO 2018-05-31 11:29:17 smsBomb.plugins.aliyun.AliyunPlugin:92] {'Message': 'OK', 'Code': 'OK', ...} [DEBUG 2018-05-31 11:29:17 root:168] 攻击进度(成功数/期望攻击次数): 1/2 = 50.00%, ...行尾的"模块名:行号"能直接定位到是哪一行代码打的这条日志,排查时非常好用。
| 你看到的行 | 它实际在说 |
|---|---|
Start attacking phone: ... | 任务已入队,目标号码确认 |
拼接完成请求体: Signature=... | 插件完成签名,请求即将发出 |
{'Message': 'OK', 'Code': 'OK'} | 服务商接单,这条计为成功 |
节点{...}请求失败,尝试降低此配置的优先级 | 该节点被降权 1 档并移入失败名单 |
详细程度由-v的个数控制,级别越往上调看得越多:
| 命令 | 生效级别 | 多出来的信息 |
|---|---|---|
不带-v | WARNING | 节点失败警告、无可用配置提示 |
-v | INFO | 任务开始/结束、服务商返回的 JSON |
-vv | DEBUG | 进度百分比、拼接完成的请求体 |
-vvv | DEBUG(含 requests 库) | 连接建立等传输层细节 |
把 config/sms.json 的字段与节点权重拆开看 📦
这是整台机器唯一需要改的文件。它是一个 JSON 数组,每个元素代表一个可用节点:
| 字段 | 类型 | 含义 |
|---|---|---|
product | string | 产品名,必填,决定交给哪个插件处理 |
desc | string | 人类可读的描述,随便写 |
source | string | 配置出处,便于溯源核对 |
auth | object | 密钥键值对,key 名随服务商而变 |
payloads | object | 提交的请求参数,模板、签名等 |
api | string | 请求地址,不写则用插件内置默认值 |
method | string | 请求方式,默认 GET |
weight | int | 派单权重,默认 1,越大越常被选中;0 表示停用 |
enable_custom_msg | bool | 是否把-m的内容当短信正文发,默认 false |
哪些能直接用:product、payloads、api的结构可以照抄现有示例;哪些必须改:auth里的密钥。仓库自带的这份配置年久失修,除阿里云外多数节点已失效,README 自己也承认了,需要按source字段给的线索或自行检索新的密钥补进去。
新增节点照下面这份骨架填,填完丢回数组即可:
{ "product": "aliyun", "auth": {"app_key": "你的AccessKeyId", "app_secret": "你的Secret"}, "payloads": { "template_code": "SMS_114035014", // 模板编号,来自服务商后台 "sign_name": "你的签名", "template_params": {"code": "123456"} } }product写成 aliyun 后,程序会自动交给 AliyunPlugin 处理,签名和请求体拼装都不用你管。要接完全没有插件的小众服务商,就用product: "normal",在payloads里用{{mobile}}、{{content}}占位符,替换逻辑在plugins/normal.py里。
把速度、代理和回调调到顺手 ⚡
默认 5 个进程、10 次发送,想快一点只需要动两个参数。
把并发进程数拉起来
进程数会自动取"你设的值"和"发送次数"中的较小者,不会多开无用进程。
跑完这一步,终端应看到多个 worker 交替输出请求日志,总耗时明显缩短。
python -m smsBomb -t 13800138000 -n 20 --process 8 -vv把请求挂上 HTTP 代理
不传-x时程序自动读HTTP_PROXY和HTTPS_PROXY环境变量,两者都没有才直连。
预期你会看到请求经由代理发出,-vvv下连接日志里会出现代理地址。
python -m smsBomb -t 13800138000 -n 3 -x http://127.0.0.1:7890 -vv把进度回调接进自己的系统
start()每完成一次派单就会调一次内置回调(往日志里打进度),传入自己的函数即可替换,参数是(成功数, 失败数, 总数, finished)。
这段代码嵌进你自己的脚本里,跑完会多出一行汇总,方便对接监控系统。
def my_cb(success, failed, total, finished=False): if finished: print("done: success=%d failed=%d" % (success, failed)) sms_bomb.start(cb=my_cb)不想敲命令,还有一条python -m smsBomb.gui能打开 Kivy 图形界面:填号码、次数、进程数,点按钮开跑,进度条直接画在界面上。作者标注过 GUI 未经严格测试,正式操作还是建议走命令行。
把常见报错一次对号入座 🧯
出问题时先盯日志里黄色和红色的行,下表覆盖最高频的几种情况:
| 现象 | 原因 | 对策 |
|---|---|---|
| 报"短信轰炸机配置不可为空" | 配置文件为空数组,或-c指到的路径不存在 | 用python -m json.tool config/sms.json验证内容,换存在的-c路径 |
| 日志出现"无此插件:XxxPlugin,跳过" | product与插件类名对不上(类名 = 产品名首字母大写 + Plugin) | 把 product 改成plugins/下已有的插件文件名 |
| 日志出现"没有可用配置可供使用",任务提前结束 | 节点密钥全部失效,权重被逐一降到 0 | 替换 auth 与 payloads,把 weight 改回 1 |
| 日志只有寥寥几行,看不到进度 | 默认级别是 WARNING,进度行在 DEBUG | 加-vv |
| HTTP 返回 200 却被判失败 | 各插件按响应体判成败(如阿里云要求Code == 'OK'),200 不等于发成功 | 用-vv看该节点返回的 JSON,按服务商错误码定位 |
| GUI 里日志不显示 | Kivy 收集控制台输出的已知限制 | 用同样参数回 CLI 排查 |
回到那批待验证的通道 🎬
开头那批通道清单,现在只需要把新密钥填进config/sms.json,跑一条带-vv的命令,日志里就能看到每个节点被逐一判定的过程。想继续往下读,从 smsBomb/smsBomb.py 的加权随机与 95% 熔断逻辑看起,再翻plugins/aliyun.py的签名实现,关键路径基本就覆盖了。
⚠️ 仅供学习研究,请勿用于非法用途。
【免费下载链接】smsBomb短信💣炸🐔项目地址: https://gitcode.com/gh_mirrors/sms/smsBomb
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考