MBomb源码逐行解读:无限群发核心循环是如何实现的
MBomb(Gmail To Gmail)Mail Bombing 是一款开源的邮箱轰炸工具,其核心功能是通过 Gmail 的 SMTP 服务实现"无限群发"——用同一个 Gmail 账号向目标邮箱连续发送指定数量的邮件。这篇文章带你逐行解读 MBomb 源码,看懂它的无限群发核心循环到底是怎么实现的,包括一个隐藏的混淆外壳和几个新手容易忽略的细节。
📂 项目结构一览:4 个文件,各干什么?
整个仓库很小,打开项目目录就能看到全部核心文件:
| 文件 | 角色 |
|---|---|
MBomb.py(根目录) | 混淆版入口,真正逻辑藏在编码数据里 |
MBomb v2.py | 可读版源码(Engine Ripper 修改版),核心循环就在这里 |
MBomb v2/MBomb.py | 原版源码,结构与 v2 完全一致 |
MBomb Pro/MBomb.py | 加壳版,用 PyArmor 加密保护,只有运行时代码 |
想读懂无限群发的核心循环,直接看 MBomb v2.py 即可,它就是根目录 MBomb.py 解码后的真身。
🕵️ 先破壳:根目录 MBomb.py 的"三段式"混淆
根目录的 MBomb.py 只有 8 行可见代码,却完全看不出发送逻辑。它的结构是:
joy = '\x72\x6f\x74\x31\x33' # 十六进制拼出来是字符串 "rot13"
trust = magic + codecs.decode(love, joy) + god + ...
eval(compile(base64.b64decode(trust), '<string>', 'exec'))
拆解下来一共三层保护:
- 十六进制转义:
joy变量用\x72...形式拼出解码密钥rot13; - ROT13 + 字符串拼接:
love、destiny两段字符串用 ROT13 字符偏移编码,与magic、god拼接后得到完整的 Base64 文本; - Base64 + eval/compile 动态执行:最后
base64.b64decode还原出约 90 行 Python 源码,再经compile+eval直接执行——还原结果与MBomb v2.py几乎逐行相同。
这种"混淆外壳 + 动态加载"是逆向学习的好素材:它演示了如何用编码把明文源码藏在看似无意义的长字符串里。
🚀 主流程逐段拆解
第一步:花哨的"加载进度条"(纯装饰)
for i in trange(int(7**7.5)):
pass
tqdm 的进度条跑了约 2400 次空循环,只为营造"正在加载"的视觉效果,随后 os.system('cls') 清屏并打印 ASCII 艺术 Logo。它和群发功能毫无关系。
第二步:收集 5 个输入参数
程序依次读取 Gmail 账号、密码、目标邮箱、邮件正文、发送数量。这里有两个新手容易踩坑的"变量命名陷阱":
Password = getpass.getpass(...):用getpass隐藏密码输入,终端不回显,这是处理密码的标准姿势;sender变量其实是"收件人"(目标邮箱),而color变量才是真正的发送数量。读源码时别被名字带偏。
第三步:Gmail SMTP 登录(无限群发的起点)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls() # 升级为 TLS 加密连接
server.login(user, Password)
关键点:使用 587 端口 + STARTTLS 加密通道登录 Gmail 的 SMTP 服务器。登录成功后,这个连接会一直保留,供后面的循环反复调用——这是"无限群发"能跑起来的前提。
🔁 核心重点:无限群发循环的实现
整个工具的灵魂只有这几行:
for i in range(1, color + 1):
subject = os.urandom(9) # 每封邮件随机主题
message = 'From: ' + user + '\nSubject: ' + subject + '\n' + message
server.sendmail(user, sender, message)
sys.stdout.flush()
server.quit()
循环设计一:数量由用户说了算
range(1, color + 1) 中的 color 就是用户输入的发送数量。循环体里没有 time.sleep(虽然顶部 import time 了,却从未使用)——这是一个紧循环,上一封发完立刻发下一封,理论上不设上限,也就是宣传的"Unlimited Bombing"。
循环设计二:os.urandom(9) 生成"随机主题"
每封邮件的 Subject 都用 os.urandom(9) 生成一段随机二进制数据作为标题。这招的目的是让每封邮件在 Gmail 的反垃圾系统看来都"主题各不相同",降低被一次性整批拦截的概率——这是群发类脚本里典型的规避手段。
循环设计三:一条连接反复 sendmail
循环内不重新建立连接,而是复用登录后的同一个 SMTP 会话调用 server.sendmail(user, sender, message)。省去重复握手与登录开销,是吞吐量的关键。
⚠️ 一个隐藏 bug:print 的"py2 语法"
循环里还有一行:
print ("\033[94m☑ Email SENT :\033[93m %i") % i
在 Python 2 中 print 是语句,括号里的格式化正常生效;但在 Python 3 中 print(...) 先执行并返回 None,None % i 会直接抛 TypeError。所以这套代码实际只能在 Python 2 下完整跑通(README 也写明了 python2 MBomb.py)。这正是"读源码比跑源码多一层收获"的典型例子。
🛡️ 异常处理:认证失败时给出自救提示
except KeyboardInterrupt:
print('[✘] Canceled')
except smtplib.SMTPAuthenticationError:
print("Check if the Options of 'Applications are less secure' is enabled")
- 按
Ctrl+C优雅退出; - 登录失败时提示检查 Gmail 的"低安全级别应用"开关(需在账号安全设置中开启,否则第三方 SMTP 登录会被拒)。
⚖️ 使用风险与合规提醒
学习源码之余,请务必注意:
- 邮件轰炸属于垃圾邮件/骚扰行为,用于攻击他人违反多数地区法律及 Gmail 服务条款,作者也在 README 中声明"请勿用于报复";
- 它依赖的"Less Secure App Logins"开关谷歌已逐步停用,新账号应使用应用专用密码(App Password);
- 无延时紧循环极易触发 Gmail 限流甚至封号,请只对自己的测试账号验证 SMTP 群发原理;
- 开源协议为 GPL v3(见仓库根目录
LICENSE),商用与分发需遵守相应条款。
📌 一句话总结
MBomb 的"无限群发"并不神秘:SMTP 587 + STARTTLS 登录 Gmail → for 循环按用户指定数量反复 sendmail → 用 os.urandom(9) 随机主题规避拦截,再加上 Base64+ROT13+eval 的混淆外壳。读懂这一个循环,你就掌握了用 Python smtplib 做批量邮件发送的完整骨架。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



