问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

QQ的工作原理是什么?

发布网友 发布时间:2022-04-29 23:13

我来回答

2个回答

热心网友 时间:2022-06-25 13:33

一、 口令加密  

每个oicq帐号的口令都保存在本地的一个文件中。登录oicq时,先将输入的口令与本地的

文件进行比较。如果口令与文件中保存的不符,将提示"输入的密码与上次成功登录的密码

不一致,是否到服务器验证?"。  

OICQ 99c的口令文件为matrix.cnt。OICQ 99b的口令文件为matric.ewh。  

口令加密算法的函数原型为:  

void CalcPassword(char *password ,int len ,char *outbuffer)  

参数:  

password为输入的明码口令  

len: password长度  

outbuffer:固定16个字节长度的加密后的口令。  

说明:该函数用调试工具查到入口地址为15f:456718。在口令加密和用户之间通讯时都要

用到这个函数。已知能够计算的最长口令为20个字节,见下文用户之间加密通信。  

Oicq99b的口令文件就是将口令进行一次CalcPassword计算后保存在每个oicq帐号目录中的

matrix.ewh,该文件正好为16个字节。因此有这个文件就可以使用暴力进行口令破解了。

Oicq99c的口令文件就复杂多了,第一次将明码的口令用CalcPassword进行计算,然后

将结果再作为口令进行计算,迭代计算很多次。计算次数用4个字节的双字表示。将4个字

节的次数和计算后的口令保存在每个oicq帐号的matrix.cnt文件中,这个文件正好为20个

字节长度。因为迭代计算了很多次,使口令计算时间极大地延长了,使用暴力破解oicq99

c的口令几乎不太可能。  

二、 聊天历史的查看  

与每个人聊天的历史都存在自已的oicq号目录下,文件名为对方的oicq号.msh(99b)或

.msj(99c)文件中。  

核心解密函数的原型为:  

BOOL Decode(char *src ,int srclen ,char *decodekey, char   outbuffer,int * p

outlen)  

参数:  

src:存放加密数据的缓冲区。  

Srclen:src字节数。  

Decodekey:固定16个字节的密钥。  

Outbuffer:输出明文缓冲区的地址。  

Poutlen:解密后的长度存放地址。  

说明:该函数入口地址:15f:456D33。这个函数以密钥进行解密。如果成功返回TRUE,否

则返回FALSE。  

显而易见,解密的关键是如何得到16个字节的密钥decodekey。  

查看聊天历史的密钥生成不需要口令。算法为:  

1、 用当前使用的oicq号为口令,调用口令计算函数CalcPassword,得出一个临时密

钥keycode1。  

2、 用keycode1为密钥,进行解密。数据为文件matrix2.ewh(99b为matrix.ewh) 从0

起第17个字节,长度为32个字节,解出16个字节的密钥为keycode2。  

3、 用keycode2为密钥,可以解开跟任何人聊天的历史。  

例如要查看oicq号为123456的聊天历史记录,算法为:  

BYTE keycode1<16>;  

BYTE filebuffer<32>;  

//读文件matrix2.ewh,从0起第17个字长,长度为32的内容读出保存在filebuffer。

ReadToBuffer(filebuffer);  

//用当前的oicq号计算keycode1  

CalcPassword(’123456’, 6 , keycode1)。  

//计算keycode2  

BYTE keycode2<16>;  

int len = 16;  

Deocode(filebuffer , 32 , keycode1,keycode2,&len);  

//现在keycode2就是能看任何聊天历史的密钥了。  

//如看跟888888的聊天历史,将文件888888.msj读到缓冲区largerbuffer  

Decode(largerbuffer,largerbufferlen,keycode2,outbuffer,*outlen),成功后  

outbuffer中为解密后的聊天记录。  

三、 与服务器通信的加密  

与Decode相对应,是一个加密函数Encode。  

void Encode(char *src,int srclen,char *encodekey,char *outbuffer,int *  

poutlen)  

参数:  

src:明文缓冲区。  

Srclen: 明文缓冲区的长度。  

Encodekey:固定16个字节的加密的密钥。  

Outbuffer:输出加密缓冲区。  

Poutlen:输出长度的保存地址。  

说明:该函数入口地址:15f:456b62。将明文进行加密,密钥为encodekey。用d  

ecode函数和同样的密钥可以进行解密。  

l 登录服务器:  

发送的数据包为 

{BYTE b1;固定为0x2  

BYTE b2;固定为0x3  

BYTE b3;固定为0XA  

BYTE b4;固定为0X0  

BYTE cmd; 登录服务器为0X15。  

WORD seq; 顺序号,从高到低存放 

DWORD oicq号;以从高到低顺利存放二进制的OICQ号。  

BYTE key<16> ;随机产生的16个字节的密钥。  

BYTE buffer<64>;64字节的加密内容。  

BYTE endchar ;固定为0x3。  

最核心的是buffer<64>的内容。用口令调用CalcPassword进行一次计算,然后作  

为密钥对0长度的明文进行加密,得出16个字节的结果,再进行加密发送。例如口  

令为’abc123’,算法为  

BYTE passkey<16>  

CalcPassword(’abc123’,6’,passkey)  

BYTE keycode<16>  

int keycodelen=16;  

Encode(0,0,passkey,keycode,&keycodelen)  

BYTE sndbuffer<51>;  

memset(sndbuffer,0,51)  

memcpy(sndbuffer,keycode,16)  

//sndbuffer其余的内容为当前机器的ip等信息,与检查口令无关  

BYTE result<64>  

int sresultlen=64  

Encode(sndbuffer,51,随机产生16个字节的密钥,result,&resultlen)  

最后把16个字节的随机密钥和64字节加密后的口令一同发给服务器验证。如果能用sniffe

r侦听到别人与服务器的通信,就能进行口令破解。当然也可以通过服务器进行在线的口令

破解,只是速度很慢,没有实用价值。  

l 如果登录成功,服务器返回16个字节的密钥--ServerKey。  

l UPD数据包的格式为  

BYTE b1;固定为2  

BYTE b2;固定为1  

BYTE b3;固定为0  

BYTE b4;固定为0  

BYTE cmd;登录为0X15  

WORD seq;从高到低顺序,与发送的seq一致。  

BYTE msg<56>;  

BYTE endchar ;固定0x3。  

用口令经过一次CalcPassword计算,得出16个字节的密钥,对msg进行解密。从第1个字节

开始的16个字节即为与服务器通信的密钥暂称为ServerKey。该密钥经常变化。  

在本次登录中,以后所有跟服务器的通信都用这个ServerKey为密钥进行加密和解密。  

四、 其它用户发来的加密消息的解密。  

其它用户的发来的加密消息格式为:  

BYTE b1;固定为0x0  

BYTE b2;固定为0x3  

BYTE b3;固定为0xA或0X2  

BYTE salt; OICQ号加密用 

DWORD EncodeOicqID;加密后的从高到低的oicq号。 

DWORD seq;序号  

BYTE msg<变长>  

l 对方oicq号的解密。  

将EncodeOicqID的4个字节分别与salt进行异或操作,然后取反。  

如salt = 0XA0, EncodeOicqID = 0X 5F5EBD1F。  

//分别进行异或操作  

0X 5F5EBD1F XOR 0XA0A0A0A0 = 0X FFFE1DBF  

//再取反  

NOT 0X FFFE1DBF = 0X1E240,转为10进制就是123456。因此对方的oicq号为123456。  

l 消息的解密。  

先合成一个20字节的口令。前4个字节为从高到低的二进制对方的oicq号。后16个字节为服

务器发来的ServerKey。ServerKey的来源见第三节。  

如对方的oicq号为123456,20字节的口令为 

00 01 E2 40 + 16字节的ServerKey。  

用口令算法对这20字节的口令进行计算,得16个字节的密钥,就可以解开对方发来的消息

。  

五、 发给其它用户消息的加密  

在登录后,服务器会通知好友的IP地址和端口,以及一个16个字节的密钥。就是当前的OI

CQ号加对方16个字节ServerKey通过CalcPass的计算结果。  

向对方发送消息时,只要用这16个字节进行加密即可。  

六、 一些结论  

oicq 99c的加密是严密的,不易进行破解。除非得到某人的口令,否则不可能进行消息假

冒等。如果你有每秒能运算百亿次的巨型机,也许能解开对方跟服务器通信的16个字节的

ServerKey,而且必须要快。总之oicq 99c 是安全的,仍然在使用的早期用户间明文通信

协议不在本文考虑之内。

热心网友 时间:2022-06-25 13:34

首先QQ客户端向服务器发送一个请求登录令牌的数据包.服务器返回登录令牌.这个令牌是在服务器端生成的.和客户端的IP地址,版本信息等数据相关.以后会用到这个令牌去进行其他操作.
在QQ客户端得到登录令牌之后.就会向服务器发送一个包含登录信息的登录请求.要求登录.服务顺会首先看看客户端的号码.I守址和版本是否可以在本服务器上进行登录.如果可以的话,就验证客户端的登录信息是否与服务器上保存的登录信息进行比较.匹配的就向客户端返回一个登录成功的数据包.不匹配返回登录失败.因为QQ的服务器有很多台.可能要分管不同的QQ版本.IP等.所以如果客户端的号码.IP地址和版本无法在本服务器进行登录.服务器就返蜀犬吠日一个重定向包.让客户端去另外一台服务器登录.其实整个QQ登录过程就是这么简单的两个步骤.
了解了QQ登录的过程后.我们还需要知道具人本的数据包格式.以便解析出我们需要的数据内容.QQ登录过程的数据包分为头部.内容和尾部三个部分.其中头的格式固定为:0x02客户端版本 命令 序列号 QQ号码. 其中0x02是1个字节的标志;客户端版本2个字节.用于表示QQ客户端的版本;命令2个字节.表示要发送的命令类型.例如请求登录令牌登录请求等;序列号是一个2字节的随机数,在一次QQ会话中通过它来确认回应包是否对应请求包.QQ客户端默认每次加1;QQ号码就是4字节的QQ号.对于服务器来说是每个字段是无所谓的.QQ登录过程数据包的尾部固定为0x03.
1. 请求登录令牌包
包内容就是对一次命令的具体信息,对于第一次发送的请求登录令牌包来说,包命令是0x0062,整个请求包如下所示;
而服务器返回包则相对复杂一些,如下所示;

其中0x18表示登录令牌的长度,现在QQ默认的登录令牌长度是0x18.这个令牌是在服务器端生成的.具体的生成算法我们当然还无从得知,应该是参考了QQ客户端的I守址.端口和其他一些信息生成这个令版的,因为你把在A机器上得到的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
极品飞车18游侠下载的免安装版,点了nfs14没有程序运行但游戏出不来... 极品飞车14咋玩不了了 每次玩好极品飞车后,windows资源管理器进程explorer会一直占30%CPU... 极品飞车14英文版运行单机后一直出现LOADING 还有很多英文提示什么的... 中国银行股份有限公司阜阳阜王路支行怎么样? 顺风递加盟条件及费用 如何去除combobox当中的空白行(页面好像要通过'管理' 可采的补水面贴膜,使用过的姐妹们请谈谈想法 可采草本毛孔紧致面贴膜怎么是黄色的啊 可采面贴膜男士可以用吗 一桶洗衣液和两瓶洗洁精共56元,两桶洗衣液和六瓶洗洁精共118元,一桶洗衣液和一瓶洗洁精各多少元? babyQQC,我想和你请教怎么进外企做外贸呢,我的文凭是大专,英语只有六级,有希望吗 散装洗衣液,洗车液,洗洁精,全部25块钱一桶十斤,两桶45块钱,薰衣草自然馨香,不含荧光剂 QQ币和QQC有什么区别吗?QQCoin是腾讯的Q币还是虚拟货币QQC? 工业洗洁精与家用区别 100斤一桶的洗洁精好不好 QQC的后台是什么意思?? 一桶清洗剂成本需要多少钱 QQC到底是什么意思啊/ 洗车店的洗车液,用什么牌子的泡沫比较多,不伤漆,价格又合理,我最近老是买到假的洗车液 散装洗洁精价格。 我现在主要负责IQCI,PQC,QA,QQC的工作,请问如何做好一个品质组长,应具备哪些条件 饭店里面使用的大桶洗洁精多少钱 15KG劳工牌洗洁精多少钱一桶 洗洁精的市场价是多少? 怎么把模版添加到PPT里 我的扣扣号被人骗走了,我怎么申诉都申诉不回来而且我是心悦会员,现在他又开通了穿越的会员,号怎么才可 我一个心悦会员2被盗号没人管申诉QQ好友全被删,没人管吗? 号让盗了,还是心悦会员,也绑定了。申诉也申诉不回来..... 心悦俱乐部之前绑定的手机号现在不用了,没办法验证,怎么修改手机号 QQ是一种什么网络工作模式 工业用洗洁精配方 qq飞车wc喷c是什么意思啊 c起什么作用啊 怎么把苹果手机弄坏 还看不出来是人为的 苹果手机怎么样才样让他坏了 iphone5怎么弄坏换机 双眼皮怎么贴双眼贴使双眼皮更加深更加大更好看 柠檬蜂蜜水用开水还是冷水 多少度水冲柠檬蜂蜜水 用柠檬和蜂蜜泡水水温多少适宜 IPHONE手机淘宝里的交易成功的订单可以删除吗? 怎么用语音在百度知道上面提问? 做的柠檬蜂蜜水,放柠檬在杯子里的时候要倒里面的蜂蜜水吗? 新鲜柠檬泡蜂蜜水用热水还是冷水还是冰水比较好?大概多久时间合适?是否需要放冰箱? 怎么让百度读一段话怎样用语音读一段话,用百度语音读一段话? 我抖音新修改了名字和头像后在别人那里显示的还是以前的名字和头像,这是怎会_百度问一问 百度语音搜索使用方法? 为什么抖音私信别人后我换头像了对方看到的还是我原来的头像? 怎么使用百度把语音变文字? 搜索一个人的抖音为什么变成原始抖音标志了?