|
//读取好友状态
int MyQQ::qq_buddy_status_read(unsigned char * data, unsigned char ** cursor, int len, qq_buddy_status * s)
{
int bytes;
bytes = 0;
// 000-003: uid
bytes += read_packet_dw(data, cursor, len, &s->uid);
// 004-004: 0x01
bytes += read_packet_b(data, cursor, len, &s->unknown1);
// 005-008: ip
s->ip = (unsigned char *)malloc(4);
bytes += read_packet_data(data, cursor, len, s->ip, 4);
// 009-010: port
bytes += read_packet_w(data, cursor, len, &s->port);
// 011-011: 0x00
bytes += read_packet_b(data, cursor, len, &s->unknown2);
// 012-012: status
bytes += read_packet_b(data, cursor, len, &s->status);
// 013-014:
bytes += read_packet_w(data, cursor, len, &s->unknown3);
// 015-030: unknown key
s->unknown_key = (unsigned char *)malloc(QQ_KEY_LENGTH);
bytes += read_packet_data(data, cursor, len, s->unknown_key, QQ_KEY_LENGTH);
if (s->uid == 0 || bytes != 31)
return -1;
return bytes;
}
void MyQQ::AddBuddyToList(qq_buddy * pBuddy)
{
qq_buddy * temp = (qq_buddy*)malloc(sizeof(qq_buddy));
memcpy(temp,pBuddy,sizeof(qq_buddy));
QQFriend * p = (QQFriend*)malloc(sizeof(QQFriend));
p->Buddy = temp;
p->next = NULL;
if(FriendListHead == NULL)
{
FriendListHead = p;
FriendListTail = p;
}
else
{
FriendListTail->next = p;
FriendListTail = p;
}
}
void MyQQ::GetFriendList()
{
qq_send_packet_get_buddies_list(QQ_FRIENDS_LIST_POSITION_START);
}
void MyQQ::GetOnlineFriendList()
{
qq_send_packet_get_buddies_online(QQ_FRIENDS_ONLINE_POSITION_START);
}
void MyQQ::ListFriend()
{
char Num[15];
char Name[256];
QQFriend * p = FriendListHead;
while(p != NULL)
{
sprintf(Num,"%d",(p->Buddy)->uid);
sprintf(Name,"%s%c",(char*)((p->Buddy)->nickname),'\0');
MessageBox(NULL,Name,Num,MB_OK);
p = p->next;
}
}
//发送收到消息的ACK
void MyQQ::qq_send_packet_recv_im_ack(short seq, unsigned char * data)
{
qq_send_cmd(QQ_CMD_RECV_IM, FALSE, seq, FALSE, data, 16);
}
int MyQQ::random()
{
return 0xdead;
}
//私有函数,发送在线包
void MyQQ::qq_send_packet_keep_alive()
{
unsigned char *raw_data, *cursor;
raw_data = (unsigned char*)malloc(4);
cursor = raw_data;
//其实发送什么内容都可以
create_packet_dw(raw_data, &cursor, UserID);
qq_send_cmd(QQ_CMD_KEEP_ALIVE, FALSE, 0, TRUE, raw_data, 4);
}
void MyQQ::KeepAlive()
{
qq_send_packet_keep_alive();
}
void MyQQ::qq_send_packet_get_info(DWORD uid)
{
char uid_str[15];
qq_info_query *query;
sprintf(uid_str, "%d", uid);
qq_send_cmd(QQ_CMD_GET_USER_INFO, TRUE, 0, TRUE, (unsigned char*)&uid_str[0], strlen(uid_str));
}
void MyQQ::qq_get_logintoken()
{
unsigned char *buf, *cursor;
buf = (unsigned char*)malloc(MAX_PACKAGE_LENGTH); //包长65535
cursor = buf;
time_t now = time(NULL);
short bytes_written = 0;
bytes_written += create_packet_b(buf, &cursor, QQ_PACKET_TAG);
bytes_written += create_packet_w(buf, &cursor, QQ_CLIENT);
bytes_written += create_packet_w(buf, &cursor, QQ_CMD_REQUEST_LOGIN_TOKEN);
bytes_written += create_packet_w(buf, &cursor, (WORD)now);
bytes_written += create_packet_dw(buf, &cursor, (DWORD)UserID);
bytes_written += create_packet_b(buf, &cursor, 0);
bytes_written += create_packet_b(buf, &cursor, QQ_PACKET_TAIL);
int aa = sendto(s,(const char *)buf,bytes_written,0,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr));
if(aa == SOCKET_ERROR)
{
aa = WSAGetLastError();
char num[6];
sprintf(num,"%d",aa);
MessageBox(NULL,num,"SendError!",MB_OK);
}
free(buf);
}
//处理请求登录令牌返回包
void MyQQ::qq_process_logintoken_reply(unsigned char * data,int len)
{
if(LoginToken!= NULL)
return;
int bytes;
unsigned char* cursor;
unsigned char RCode,TokenLen;
cursor = data;
bytes = 0;
// 000-000: reply code
bytes+=read_packet_b(data,&cursor,len,&RCode);
if(RCode == 0x00)
{
//令牌长度
bytes += read_packet_b(data, &cursor, len, &TokenLen);
LoginTokenLength = TokenLen;
LoginToken = (unsigned char *)malloc(TokenLen);
//令牌内容
bytes += read_packet_data(data, &cursor, len, LoginToken, (int)TokenLen);
}
Login(LoginMode);
}
//初始化参数
int MyQQ::InitParam(int QQnum,char *QQpass)
{
UserID=QQnum;
if(UserID == 0)
return 1;
strcpy(Password,QQpass);
if(Password == NULL)
return 2;
//得到密码密钥
md5_state_t ctx;
md5_byte_t pwkey_tmp[QQ_KEY_LENGTH];
md5_init(&ctx);
md5_append(&ctx, (unsigned char*)Password, strlen(Password));
md5_finish(&ctx, pwkey_tmp);
md5_init(&ctx);
md5_append(&ctx, pwkey_tmp, QQ_KEY_LENGTH);
md5_finish(&ctx, pwkey_tmp);
PwdKey = (unsigned char*)malloc(QQ_KEY_LENGTH);
memcpy(PwdKey,pwkey_tmp,QQ_KEY_LENGTH);
//本地地址
char szName[255];
memset(szName,0,255);
gethostname(szName,255);
hostent * host;
host= gethostbyname(szName);
if(host->h_addr_list[0])
{
struct in_addr addr;
memmove(&addr, host->h_addr_list[0], 4);
//获得标准IP地址
MyIP=inet_ntoa(addr);
}
//创建UDP Socket
s = socket(AF_INET,SOCK_DGRAM,0);
int ErrCode;
//本地端口
MyPort = 4000;
while(1)
{
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_addr.s_addr = inet_addr(MyIP);
LocalAddr.sin_port = htons(MyPort);
ErrCode = bind(s,(LPSOCKADDR)&LocalAddr,sizeof(LocalAddr));
if(ErrCode == SOCKET_ERROR)
{
if((ErrCode = WSAGetLastError()) == 10048)
{
//如果该端口已被使用,则端口数加1,再重试
MyPort++;
continue;
}
char num[15];
sprintf(num,"错误代码%d",ErrCode);
MessageBox(NULL,num,"本地创建Socket失败!",MB_OK);
break;
}
else
break;
}
return 0;
}
//初始化QQ服务端信息
int MyQQ::InitUDPServer()
{
strcpy(LoginServer,udp_server_list[UDPServerNum]);
//服务器端口
LoginPort = 8000;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = inet_addr(LoginServer);
ServerAddr.sin_port = htons(LoginPort);
return 0;
}
/*
int UserID;//QQnum
char PassWord[32];//
Unsigned char PwdKey[QQ_KEY_LENGTH];
SOCKET s;
char MyIP[16];
int MyPort;
SOCKADDR_IN LocalAddr,ServerAddr;
*/
| 网游盗号木马实现手记 | 01-09 |
| 黑色技术蠕虫下载者[完整源码] | 11-01 |
| 利用BCB自己打造QQ炸弹 | 10-23 |
| 从内存中加载并启动一个exe(delp | 09-27 |
| 开启和关闭Windows xp 防火墙(de | 09-27 |
| 让你的程序通过XP防火墙(delphi编 | 09-27 |
| 如何让你的程序安全通过windows防 | 08-20 |
| 如何透过程序来控制 Windows (XP | 08-20 |
| 动易2005-2006算号器的源代码 | 08-11 |
| API对注册表进行操作(Delphi编程 | 07-30 |
| 一段隐藏注册表项的代码 | 07-26 |
| 了解VB编写病毒的大体方法 | 07-02 |