最近想用C#做一个简单的QQ实现,研究Lumaqq时发现,QQ的loginPacket中QQ_LENGTH_LOGIN_DATA=416加上头尾12字节,初始秘钥16字节一共有444字节,可是用Ethereal截获Lumaqq和qq2006的登陆包都有460字节,这事困惑了我一下午,以为新协议改变封包结构了。就去下了一个Eclipse把最新版的Lumaqq check out出来看看究竟,郁闷地发现没有变化,去论坛发帖也没人回,晚上吃饭的时候突然突然想到他们正好差了16字节,以qq加密算法的填充机制,412字节不正好要填充16字节嘛,回去用VS调试了一下,果然。
只怪自己当时看到412是8的倍数就想当然的觉得加密时不需要填充了,没有仔细的想一下。又看到存储LoginPacket的字节数组只有412字节,以为数据增大的话会产生溢出,不承想Crypter函数返回以后,它已经指向一个新的字节数组了。
这些只要想一下就不会弄错了,可是总有那么多让我不需要想的直觉。以后要注意。