尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从零读懂手机号查询QQ号:phone2qq逆向脚本拆解手记

从零读懂手机号查询QQ号:phone2qq逆向脚本拆解手记 从零读懂手机号查询QQ号phone2qq逆向脚本拆解手记【免费下载链接】phone2qq项目地址: https://gitcode.com/gh_mirrors/ph/phone2qqphone2qq 是一个通过手机号查询QQ号的开源 Python3 小工具整个仓库只有 qq.py 和 tea.py 两个核心文件加起来不足三百行。它没有花哨的界面也没有复杂的依赖却把「手机号查询QQ号」这件事的完整链路——协议封装、TEA 加密、数据包解析——全部摆在了你面前。这篇文章不打算把它包装成神话而是想带你把每一行都读明白搞清楚它为什么能跑又为什么可能跑不通。先泼一盆冷水它依赖什么又可能失效在动手之前有必要先弄清这个 Python 逆向工具的运行前提。phone2qq 之所以能用手机号换到 QQ 号靠的是 QQ 官方的「手机号登录」机制当你在登录界面输入手机号时服务器会把这个手机号映射到绑定的 QQ 号上。换句话说目标手机号必须开启了手机号登录查询才可能成功。另一个必须正视的事实是时效性。项目作者在 README.md 里明确留了一行备注「该方法可能已经失效2016.04.14」。QQ 的通信协议这些年一直在更新当年的握手流程如今未必还能收到预期的响应。所以更务实的定位是把它当作一份协议逆向的活教材而不是包查包灵的查询器。抱着这样的预期去读收获反而更大。三分钟跑通一次查询最小复现路径抛开顾虑先让工具转起来。克隆项目后直接运行git clone https://gitcode.com/gh_mirrors/ph/phone2qq python3 qq.py脚本默认查询手机号10000000000也就是 qq.py 第 196 行的这行测试代码print(login.getQQ(10000000000)) # 单个手机号码测试改成自己的号码再运行即可。如果你想在自己的代码里调用最小的写法是这样from qq import QQLogin login QQLogin() result login.getQQ(13812345678) print(result) # 返回 QQ 号字符串失败则返回 False如果你的号码返回了False通常有三种可能该手机号未开启手机号登录、查询的号码本身没有绑定 QQ或者协议已更新导致请求被拒。后一种情况正如 README 里那条备注所说属于「看运气」的范畴。跑通只是第一步接下来的疑问是这一行getQQ背后到底跟服务器说了什么两步握手0825 拿票据0826 换身份翻开源码会发现查询不是一发请求就完事而是两段连续的 UDP 通信对应QQLogin类里的login0825和login0826两个方法。第一步 0825 相当于「进门」。客户端向服务器代码里硬编码的地址是183.60.56.100:8000发送一段用 TEA 加密的报文服务器验证通过后会回传三样东西会话票据token0825、服务器时间serverTime和服务器 IPserverIP。这些信息被暂存在对象属性里供下一步使用。第二步 0826 相当于「亮明身份」。客户端把上一步拿到的票据、自己的手机号、密码的 MD5 值拼装进新报文再次加密发送。服务器核对无误后才会在响应包里把绑定的 QQ 号返回。用生活经验类比第一次握手是取号排队第二次握手才是真正的柜台办理。这种「先建会话、再验身份」的两段式设计是 QQ 协议解析里非常典型的结构也是理解后续数据包格式的钥匙。tea.py三十行代码里的 TEA 加密报文在网络上传输时都是密文负责加解密的就是 tea.py。TEA 是一种经典的分组加密算法几个关键参数可以一句话说清128 位密钥16 字节、64 位数据块8 字节、16 轮迭代。数据被切成 8 字节一块用 16 字节的密钥反复「搅动」16 轮搅动过程中用到一个魔法常数delta 0x9e3779b9它由黄金分割比衍生而来作用是保证每轮混淆得足够均匀。encipher函数是加密核心别看只有几行for i in range(n): s.value delta y.value (z.value 4) k[0] ^ z.value s.value ^ (z.value 5) k[1] z.value (y.value 4) k[2] ^ y.value s.value ^ (y.value 5) k[3]左移、右移、异或、累加四类运算反复叠加就是 TEA 加密算法的全部把戏。它不依赖任何第三方加密库只用标准库里的struct和ctypes就实现了完整加解密——这正是 TEA 加密算法适合拿来当学习素材的原因原理透明代码极短性能还不差。作者在 README 里提到 decrypt 部分参考了 QQLib 并做了小改动动手复刻一遍对位运算和字节序的理解会深不少。把十六进制字节翻译成 QQ 号加密只是为了传输真正有意思的是拿到响应之后怎么解析。login0826尾部有一段判定逻辑if recvData[:2] 06: qq str(int(recvData[6:14], 16)) else: recvData recvData[8:] if recvData[:2].lower() fc: qq str(int(recvData[14:22], 16)) else: qq False解密回来的数据是一串十六进制字符前两位是状态码06代表正常返回此时从第 6 位起截取 8 个十六进制字符int(..., 16)转成十进制就是 QQ 号fc则代表另一种包装格式需要先跳过 8 位偏移再截取。这 8 位十六进制其实就是 QQ 号在协议里的原始形态——QQ 号从来都是直接以数字形式塞进数据包的我们要做的只是把它挖出来。顺带一提我在读代码时注意到一个有趣的细节login0826里密码字段的 MD5 是硬编码的md5(123456)。这种「怎么简单怎么来」的写法在当年的逆向脚本里很常见性能没问题但显然不该照搬到正式项目里——看代码学思路可以学坏习惯就不必了。批量查询与「别上头」的三条红线脚本本身是支持批量查询的qq.py 末尾就留了一段被注释掉的号段遍历示例遍历一万个号码、命中即打印。想批量用思路就是循环调用getQQfrom qq import QQLogin login QQLogin() for phone in [13812345678, 13987654321]: print(phone, , login.getQQ(phone))但批量能力是一把双刃剑这里必须划三条红线频率红线短时间高频请求极易触发服务器风控还可能影响他人正常使用务必控制节奏。边界红线手机号查询QQ号只能用于查询自己拥有合法使用权的号码比如账号找回场景拿别人的号码批量试探既不道德也违法。合规红线这类查询涉及个人信息必须遵守《网络安全法》和《个人信息保护法》切勿用于任何侵犯隐私的用途。结语这个项目最值钱的其实是过程绕了一圈你会发现phone2qq 的价值从来不在「能不能查出号码」这一结果上——协议会过时服务器会升级但那段从构建报文、加密传输到解析响应的完整逆向链路才是它留给学习者的最大财富。想深入 UDP 数据包构造可以读login0825想理解分组加密可以啃tea.py想研究响应解析login0826尾部那段判定就是现成的例子。项目采用 Apache-2.0 协议你可以自由阅读、修改和再分发。如果你读懂了这两百多行代码不妨顺手做点贡献把 README 的说明补全、给QQLogin加上重试机制、或者封装一个命令行参数解析——开源项目的生命力恰恰来自每一个愿意把「读懂了」变成「改进了」的人。下一次当你面对一个陌生协议无从下手时也许就该想起这个用三十行代码讲清楚加密、用两次握手讲清楚会话的小项目。【免费下载链接】phone2qq项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表