从密码学的⾓度看腾讯QQ通信协议0.分析⽬的
制作⼀款命令⾏QQ软件。可以在命令⾏下登录qq,以及处理⼀些简单的⽂本消息。
1.怎么通信
A->server
陈文非个人资料server->B
2.采⽤何种协议
QICQ:⽤于更新数据库中的状态(在线,离线,隐⾝…),
传递对称加密的密钥(sessionkey)。
UDP:data本⾝是经过加密的。⽤上⼀步得到的sessionkey进⾏加密。
3.攻击者的⾓度
唯密⽂攻击
已知明⽂攻击
选择明⽂攻击
选择密⽂攻击
选择⽂本攻击
4.猜测的登录流程
M=…+QQ密码+…
client A:
tea(M);
5.别⼈分析的流程,不知道真伪
blog.csdn/mingzznet/article/details/46910437
6.OICQ协议分析
命令字 解释
1 log out
2 hert message
4 跟新⽤户信息
5 搜索⽤户
6 获取⽤户信息
9 不需认证⽅式添加好友
10 删除好友
11 需要认证的⽅式添加好友
13 设置隐⾝、⽰忙等状态
18 确认收到系统消息
22 发送消息
23 receive message
29 request key
39 get friend online
60 group name operation
62 memo operation
88 download group operation
92 get level
101 request extra information
103 signature operation
7.wireshark分析
QQ发送消息⽤的是运输层的UDP协议。
⽽登录,初始化协商对称加密密钥,服务器端不断地验证客户端是否在线同时客户端不断地索要服务器端⾃⼰的好友数据这些则⽤OCIQ协议完成。
8.结构体
typedef _oicqhdr {
uint8_t flag;
信息管理与信息系统是学什么的uint16_t ver;
uint16_t command;
uint16_t sequence;
uint32_t qq;
}__attribute__((packed)) oicqhdr;
9.实战中获取到的信息
1>qq客户端如何获取QQ服务器端IP地址
qq客户端怎么知道腾讯的IP?
通过DNS协议。
⽬前检测到的tencent的域名有,(域名是腾讯写死在软件⾥的)
相机恢复t
rs.qq
rs7.qq
对应的⼏个IP地址池:(1类IP)
123.*
111..*
125.*
通过不让QQ登录成功来得到结果
2>想象⼀下登录流程
登录其实就是从tx的服务器池⾥⾯选出了⼀台机器进⾏处理你的消息。
这些服务器应该是类似于docker形式部署的实例。
⼀个IP就只服务⼀个⽤户吗?
通过⽹上的数据,qq⽉活跃⽤户数达到了7.07亿,
也就是7.07 * 10^8。空工资一般多少钱一个月
⽽假设以111.*.*.*为例服务⽤户,那么共有2^24=16,777,216个机器。
即使使⽤1类IP地址,也还是⽆法解决如此⼤的⽤户量。
那么复⽤是必然的。
可能⼀个⽤户掉线后⽴马回收这个资源给另⼀个⽤户使⽤。
服务器端接受消息,那么服务器端必然不能只给⼀个⽤户使⽤。那样太浪费了。
综上所述,登录QQ就是从tx的服务器中⼀台为⾃⼰服务。这台服务器可能还同时为其他⼈服务。然后⾃⼰下线后,这个服务器就会将⾃⼰保存在服务器上的数据进⾏转存等等。情空你的信息后为其他⼈服务。
嗯,应该是这样。
3>联想⼀下怎么得到QQ好友的地理位置
A和B通信。需要经过tx的服务器转发。
但是A,B都是在内⽹。那么他们上⽹会获得⼀个临时的公⽹IP。腾讯服务器就会记录这个IP。⼲什么呢?
假如A和B要直接通信,(为什么不中继转发?这样会对服务器造成压⼒很⼤。)台湾艺人王阳明
那么就通过tx的服务器告诉对⽅的IP地址。
这样就实现了判断好友在哪⼉。
10.算法搜集
tea算法,md5加密算法。
11.参考资料
wenku.baidu/view/241747906bec0975f465e25e.html
12.⼤致思路
Login verify:客户端向server发送
Login verifyUDPpacket = key2 + Tea(key2,Tea(key1,PlainUDPPacket))
这个算法好像3des?
⽤了两个密钥,⽽且密钥2还是公开的。
密钥key1只有⽤户⾃⼰知道,就像私钥。
引⼊key2纯属为了防⽌穷举暴破。
穷举的时间复杂度为2^(key1和key2的有效位数求和)
已知key1=MD5(MD5(password)+QQ号))
现在key1,key2已知,可以得出PlainUDPPacket.
PlainUDPPacket中包含login_verify_key.
tx为什么要对PlainUDPPacket加密?且和⽤户的密码绑定?⼀定有不可告⼈的秘密。
Login verify key:服务器返回的报⽂。
发送报⽂后服务器返回的报⽂。使⽤login_verify_key解密可以得到login_verify_reply_key. Login session:服务器发回来的报⽂。
使⽤login_verify_key可以解密得到session_key.
13.软件怎么做
gocui
go command line UI.做界⾯的。
github/jroimartin/gocui
小鹿结婚了吗
可以先做⼀个命令⾏的UI界⾯。
然后将QQ的⼀些东西封装进函数。
按下按键就会激活相应的功能。
先建⽴⼀个仓库吧。
github/jroimartin/gocui
github/happysmile12321/lazyqq.git