前言

看成了QQ号查手机号点了进来的请自觉关掉,避免“然并卵”!春节逛BBS无意看到一款小软件【手机号2QQ号】,起初是想能不能实现批量,于是写了个python3版的测试(Linux党,没办法),理想总是美好的。。。

设置手机号查找

  • PC端

  • 移动端

手机号登录

PC端与移动端的设置没有必然关系,比如通讯录启用在移动端可使用手机号查找,在PC端不能,手机号登录启用其他全部关闭的情况下是不能通过手机号查找到QQ的,这里实现的是在开启手机号登录(手机端开启/辅助帐号绑定)功能的情况下提取QQ号。

实现

PCQQ登录过程

  1. 发送握手包
  2. 返回握手状态码
  3. 发送密码包
  4. 返回登录状态,由于登录方式不是QQ号,QQ会很返回真实QQ号更新数据包
  5. ……

用wireshark抓PCQQ登录数据包前4条报文(0825与0826指令)

看这4次(2发2收)数据交互的抓包,长度分别是213、161、632、249,减去包头,那么数据bytes长度分别是:271、119、590、207

TEA算法

QQTEA 算法建立在标准 TEA算法的基础上,使用16轮的加密,由于需要加密不定长的数据,所以使用了一些常规的填充办法和交织算法。【详细戳这里】

0825指令

发送的数据包(假设为data)

02  # 包头,通讯都是以02开口35 55 # QQ版本,6.708 25 # 指令00 00 # 随机,2位十六进制00 00 00 00 # QQ号HEX,因用手机号登录,这里直接填0003 00 00 00 01 01 01 00 00 67 42 00 00 00 00 # 固定77 92 39 4f 1a fd 3b bf a9 00 6b c8 07 bc f2 3b  # key,直接用抓包的就行

TEA加密段(假设以下为txt)

00 18 00 16 00 0100 00 04 4b 00 00 00 01 00 00 15 09  # 固定00 00 00 00 00 00 00 0000 04 00 0f 00 00 00 0b30 30 30 30 30 30 30 30 30 30 30  # 手机号分解,每位前面加上303 0900 0800 01 00 00 00 00 00 0400 36 00 1200 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 0001 14 00 1d 01 02 00 1902 51 ca 4a ab 66 e8 0a e4 d2 79 92 1a ce 3c 3d fe e2 37 88 15 1f 45 36 8d  # HDKey

将以上数据包加密后与前面数据包拼接在尾部补上03形成一段完整的交互数据包

data += b2a_hex(tea.encrypt(bytes.fromhex(txt), bytes.fromhex(key0825))).decode()
data += '03'
data  = a2b_hex(data)

发包,通讯协议是UDP,直接socket然后接收数据

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(data, ('183.60.56.100', 8000))
recvPack = sock.recv(1024)
sock.close()

在0826登录中需要令牌、服务器IP、时间这三个参数将从返回的数据包中获取

解包,去掉14位头部为数据包加密段

recvData = b2a_hex(tea.decrypt(recvPack[14:-1], bytes.fromhex(key0825))).decode()

TEA解码后的数据有多种情况,比如不以’00’开头的会多偏移8位十六进制(暂时没发现其他偏移),具体获取如下

if(recvData[:2]!='00'):recvData = recvData[16:]if(recvData[:2]=='00'):token0825  = recvData[10:122]   # "00 38 " 和 " 00 17 00 0E 00 01" 之间的是tokenserverTime = recvData[134:142]serverIP   = recvData[166:174]
else:print('0825 error!')

获取成功后就可以封装0826的登录验证数据包了

0826指令

0826登录验证数据包封装过程跟0825差不多,就不贴数据包了,大致说下过程

data  = '02'
......
txt   = '01 12 00 38'
......

密码密文,密码随意,并不真正要登录

pwd = md5('123456')
pwd  += '00 00 00 00'
pwd  += '00 00 00 00'  # QQ Hex,用0填从

封装密码后是密钥加密,将密码密文作为key进行TEA加密

txt  += b2a_hex(tea.encrypt(bytes.fromhex(keyTxt), bytes.fromhex(pwd))).decode()

接下来是一段CRC值封装

txt  = '00 15 00 30 00 00'
......
txt += b2a_hex(tea.encrypt(bytes.fromhex(mcrc), bytes.fromhex(key0826))).decode()
......
txt += '62 e1 72 e6 14 21 fe 8c 85 0c 62 89 1e fc f7 f9 3a 19 b8 92'

最后封装成数据包

data += b2a_hex(tea.encrypt(bytes.fromhex(txt), bytes.fromhex(keyCode))).decode()
data += '03'
data  = a2b_hex(data)

具体实现看源码,发包,然后接收解码,和0825过程一致,剩下到解码后获取QQ号了,QQ号用4位十六进制保存,通常解码后以06开头是偏移3位十六进制,fc开头偏移7位十六进制,如果尝试批量的时候,返回的数据包就比较诡异了,这需要进一步分析

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 = Falseif qq: print(qq)

效果

单个IP对单个服务器可以小许批量(可能访问频繁,被防火墙干掉了,几十到几百个查找后返回了另一种状态码,PC端还是可以正常登录)

效果并不理想,如果有兴趣,可以继续研究,比如来个异步/多线程+多代理对多服务器遍历。。。

以上仅供学习交流,造成一切后果与本人无关!

参考

  • [手机号2QQ号] http://www.52pojie.cn/thread-385527-1-1.html
  • [QQLib for Python] https://github.com/JetLua/qqlib

【源码戳这里(Github)】

ps:手机号可以查到某些私人QQ,最后祝大家:新年快乐!

手机号查QQ号(Python3版)相关推荐

  1. 正则表达式匹配、手机号、QQ号、邮箱号

    正则表达式匹配.手机号.QQ号.邮箱号 第一个正则表达式匹配手机号 ```首先我们来创建一个变量接受用户输入的数据var son = number(prompt(""))然后再来一 ...

  2. 通过QQ邮箱反查QQ号

    2019独角兽企业重金招聘Python工程师标准>>> 一.通过QQ邮箱反查QQ号 平时生活中,经常会遇到被QQ收购的第三方邮箱,绑定到QQ邮箱的服务,以达到隐藏邮件地址的目的,比如 ...

  3. html中qq号码怎么写,根据QQ头像hash分析QQ号(html版)

    昨天看网友求助,想根据QQ头像的文件名找回QQ号,他发了一个链接https://my.oschina.net/alex001/blog/481078,是java写的代码.原来QQ头像的文件名就是MD5 ...

  4. 正则表达式匹配手机号、QQ号、邮箱

    import re #匹配邮箱 # def email_match(str1): # #12312313413@sdeqwe.com # res = re.findall(r"(\w{1,} ...

  5. qq头像在java程序_根据QQ头像hash分析QQ号(html版)

    昨天看网友求助,想根据QQ头像的文件名找回QQ号,他发了一个链接https://my.oschina.net/alex001/blog/481078,是java写的代码.原来QQ头像的文件名就是MD5 ...

  6. 根据QQ头像hash分析QQ号(html版)

    昨天看网友求助,想根据QQ头像的文件名找回QQ号,他发了一个链接https://my.oschina.net/alex001/blog/481078,是java写的代码.原来QQ头像的文件名就是MD5 ...

  7. php正则检查QQ,PHP 正则匹配手机号的QQ号

    //匹配手机号码 //$mode = '/\d{3}-\d{8}|\d{4}-\d{7}|\d{11}/'; //不匹配以-开头的手机号码 //$mode = '/^((?!-).)*\d{3}-\d ...

  8. 随机生成手机号,QQ号,姓名...小工具类汇总

    项目中有用到,先记录一下 import java.util.Random;public class RandomValueUtil {private static String ALPHABET = ...

  9. (转)最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等...

    什么是 RegExp? RegExp 是正则表达式(Regular expression)的缩写,作用是对字符串执行模式匹配. 通常用于格式验证.正则替换.查找子串等 各种编程语言的正则表达式基本相同 ...

最新文章

  1. Centos7更改root密码
  2. Yann LeCun力挺前AAAI主席,批判深度学习的Marcus遭怒怼
  3. CAPSNET:具有自我注意路由的胶囊网络
  4. 【Linux基础】作业二
  5. 014_Spring事务
  6. Echarts(自己整理的一些散点图、饼图、条形图、散点图的基本配置参数)
  7. 云服务器怎么管理,第一次使用云服务器,如何使用和管理云服务器
  8. css3毛玻璃效果白边问题
  9. QQ音乐限制专辑重复购买 此前已取消人气榜等非作品类排名
  10. QTableWidget简单使用
  11. C++对象数组的实例学习
  12. shell脚本中 EOF的意思
  13. 什么是强制性3C认证?
  14. 恢复被误删的ESP引导分区
  15. hive的dual表
  16. 静下来读《一个人的村庄》
  17. 【神经网络与深度学习】1.线性分类与感知机
  18. libjpeg的简单使用
  19. 电脑没有u盘怎么重装系统
  20. 期货价格什么意思(期货价格是指什么)

热门文章

  1. vi编辑器壁纸(1440x900)
  2. 我们实际上是房地产开发商 和 我们政府的奴隶
  3. Iconfont 图标大全 样式和代码对齐
  4. 眼动和脑波相关性分析和回归分析
  5. 理解Fourier变换,Laplace变换和Z变换的几个基本点
  6. 2021-04-05 c++程序设计原理与实践持续学习笔记:第三章对象、类型和值。
  7. [转载]Ajax的错误处理机制探讨
  8. Mysql实现统计查询
  9. 职场中上级如何和下级面谈
  10. python爬取王者荣耀英雄的背景故事