黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图

您现在的位置: 黑客风云 >> 黑客文章 >> 黑客进阶 >> 黑客编程 >> 正文
·没有路由密码权限时的鸽08-23·上网安全 Vista自我防范10-11
·让濒临崩溃的Windows XP10-11·有备无患,快速自制救急10-11
·要你好看!Windows看图工10-11·空间赞助网提供不同类型10-11
·讨论net.exe和net1.exe的10-10·让3389远程桌面传输更通10-10
·巧妙入侵渗透赌博站10-10·Aspx空间扫权限工具10-10
·Windows2003最新提权工具10-10·易淘乐提供100M免费全能10-10
·系统开机密码忘了不着急10-09·中意网络提供免费100M免10-09
·与众不同 Windows XP开始10-08·让桌面图标翻跟斗 在XP上10-08
·上海宽元站长资助计划-提10-08·个性化Windows XP的任务10-07
·趣盘提供3G免费网络硬盘10-07·秀山热线提供200MB免费全10-07
·一次艰辛的提权过程10-06·成功入侵IT大卖场的渗透10-06
·mysqlhack- MYSQL利用工10-06·lanker一句话PHP后门客户10-06
·WIXI提供3G免费多媒体网10-06·新人网络提供100M/ftp免10-06
·如何利用QQ带来高流量10-05·UuShare提供免费网络文件10-05
[推荐]MyQQ.cpp 非完全版本(C语言黑客编程)
      ★★★★

MyQQ.cpp 非完全版本(C语言黑客编程)

文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-9-2 9:20:06

//读取好友状态
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;
*/

上一页  [1] [2] [3] [4] 

文章录入:cainiaowang    责任编辑:cainiaowang 
【字体:
Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
ICP备案:冀06009886