|
字节内容 0 0x02 报文开始 1-2 QQ 版本号码,QQ2005beta2 是0x0d51 3-4 QQ 命令,这里是0x0022 表示登录请求 5-6 报文序号,可以是随即,但是我发现QQ2005 一直用不变 的,实际中我们用rand() 函数生成 7-10 四字节的QQ 号码,网络字节顺序 11-26 16 字节的随即密钥,以前是全部位0x01 27 – 458 加密的登录数据432 字节 459 0x03 报文结尾
下面是没有用TEA 加密前的416 字节数据
字节内容 0-15 先将密码用MD5-16 运算两轮,然后用这个结果 作为密钥用TEA 加密任意字串得到这16 字节的 内容 16-51 我不知道意思,看来是固定,LumaQQ 也是这样 的 52 登录模式,0x0a 是正常,0x28 是隐身 53-68 不知道意思,共16 字节 69 登录令牌的长度,目前是24 字节 70 – 93 24 字节的登录令牌 94 固定内容0x01 我猜测是平台代码,也许 95 固定内容0x40 96 – 415 全部为0 不知道意思
当服务器收到我们发送的数据后,先尝试用TEA 解密,密钥是两轮MD5-16 得到的结
果。如果可以解密。它的回应格式如下:回应数据1:
点击查看大图
第一位是0x00 的情况
字节内容 0 0x00 1-16 会话令牌,以后的会话加密会用到,以后的数据都 需要用这个令牌加密,共16 字节 17-20 你的QQ 号码,网络字节顺序 21-24 服务器测试到的你的登录IP,网络字节顺序 25-26 服务器测试到的你的登录port ,网络字节顺序 27-30 服务器自己的倾听IP 31-32 服务器自己的倾听port 33-36 本次的登录时间 37-62 未知 63-66 未知的IP 地址
| 67-68 | 未知的端口 | 69-72 | 未知的服务器IP 73-74 | 未知的端口 75-122 | 未知内容 123-126 | 上次的登录IP 127-130 | 上次登录时间 131-138 | 未知含义
第一位是0x01 的情况:
字节内容 0 0x01 1-4 登录用的QQ 号码 5-8 重定向的新服务器IP 9-10 新服务器port
如果使用第一个密钥不可解密,就尝试用登录加密数据使用的随即密钥解密,一般我们全部设置位0x01
如果第一个字节是0x01 也是重定向操作,0x02,0x05 是密码错误。
下面的代码展示了简单的登录:
/* 登录代码*/
int qq_login( struct qq_client qc, /* 客户端数据结构*/ const char*id, /*字符形式的QQ号*/ const char pass, /*密码*/ unsigned char login_mode,/* 登录模式,0x0a= 正常,0x28= 隐身*/ const char*local_ip,/* 本地倾听IP, 设置为“0.0.0.0”*/ int local_port, /*本地的端口,指定一个未用的*/ const char*server_ip,/* 腾训的服务器*/ int server_port /*QQ 服务器端口,一般是8000*/ )
{
struct sockaddr_in sin; int i = 0; int len = sizeof(struct sockaddr_in); int len2 = 0; uint16_t tmp16 = 0; uint32_t tmp32 = 0; struct in_addr in; int e = 0; fd_set fds; struct timeval timeout; unsigned char data_raw[1024]; unsigned char data_encrypted[1024+16]; unsigned char data_decrypted[1024]; unsigned char buff_tx[65535]; unsigned char buff_rx[65535]; unsigned char *p = NULL; unsigned char login_token[256]; int login_token_len = 0; unsigned char tmp[16]; md5_context ctx;
上一篇:命令行下可以解读TCP数据报内容的Sniffer
下一篇:QQ协议分析之TCPF包结构