|
bzero(buff_tx,sizeof(buff_tx)); bzero(buff_rx,sizeof(buff_rx)); bzero(data_raw,sizeof(data_raw)); bzero(data_encrypted,sizeof(data_encrypted));
/*检查传入的参数*/ if(!qc!id!pass!local_ip!server_ip){ return -EFAULT; }
/*是否已经登录*/ if(qc->logined){ return 0; }
/*设置模式*/ qc->login_mode = login_mode;
if( qc->login_mode!=0x0a && qc->login_mode!=0x28 ){ qc->login_mode = 0x0a;
}
/*必要设置*/ qc->id = atol(id); snprintf(qc->pass,sizeof(qc->pass),pass);
printf("login id = %d pass = \"%s\"\n",qc->id,qc->pass);
qc->local_port = local_port; snprintf(qc->local_ip,sizeof(qc->local_ip),local_ip);
qc->server_port = server_port; snprintf(qc->server_ip,sizeof(qc->server_ip),server_ip);
printf("local address %s:%d\n",qc->local_ip,qc->local_port); printf("server address %s:%d\n",qc->server_ip,qc->server_port);
/*设置加密登录数据的密钥,随即设置即可*/ /*重新设置随机种子*/ srand(time(0)); for(i=0;i<16;i++){
qc->init_key[i] = rand()&0xff; }
/*创建一个套节字用来作UDP通讯*/ qc->server = socket(PF_INET,SOCK_DGRAM,0);
if(qc->server<0){ return -EFAULT; }
/*设置套节字为非阻塞套节字*/ fcntl(qc->server,F_SETFL,O_NONBLOCK);
sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr(qc->local_ip); sin.sin_port = htons(qc->local_port);
len = sizeof(sin);
/*我们需要绑定这个UDP套节字,因为我们想用固定端口通讯!*/
if(bind(qc->server,(struct sockaddr*)&sin,len)<0){ close(qc->server); qc->server = -1; return -EFAULT;
}
sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr(qc->server_ip); sin.sin_port = htons(qc->server_port);
len = sizeof(sin);
/*采用connect 后我们就可以调用read/write 系统调用了*/
/*连接到腾训服务器*/
if(connect(qc->server,(struct sockaddr*)&sin,len)<0){ close(qc->server); qc->server = -1; return -EFAULT;
}
/*请求登录令牌,重试8次*/
for(i=0;i<8;i++){ login_token_len = qq_request_login_token(qc,login_token); if(login_token_len>0){
/*如果成功就退出*/ break; } }
/*看看是否请求到了登录令牌*/
if(i==8){ close(qc->server); qc->server = -1; return -EFAULT;
}
/*两轮MD5-16 加密密码,保存在qc->pass_encrypted 中*/ md5_starts(&ctx); md5_update(&ctx,pass,strlen(pass)); md5_finish(&ctx,tmp);
md5_starts(&ctx); md5_update(&ctx,tmp,16); md5_finish(&ctx,qc->pass_encrypted);
上一篇:命令行下可以解读TCP数据报内容的Sniffer
下一篇:QQ协议分析之TCPF包结构
|