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

您现在的位置: 黑客风云 >> 黑客文章 >> 黑客进阶 >> 黑客编程 >> 正文
·没有路由密码权限时的鸽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

//处理登录Reply的消息
void MyQQ::qq_process_login_reply(unsigned char* buf, int buf_len)
{
if(IsLogin == true)
return;

int len, ret, bytes;
unsigned char *data;

len = buf_len;
data = (unsigned char*)malloc(len);
if (MCrypter.qq_crypt(DECRYPT, buf, buf_len, PwdKey, data, &len)) {

if (data[0] == QQ_LOGIN_REPLY_OK) {
ret = qq_process_login_ok(data, len);
} else {
ret = QQ_LOGIN_REPLY_MISC_ERROR;
}
} else {
len = buf_len;
if (MCrypter.qq_crypt(DECRYPT, buf, buf_len, InitKey, data, &len)) {
bytes = 0;
switch (data[0]) {
case QQ_LOGIN_REPLY_REDIRECT:
ret = qq_process_login_redirect(data, len);
break;
case QQ_LOGIN_REPLY_PWD_ERROR:
ret = qq_process_login_wrong_pwd(data, len);
break;
default:
ret = QQ_LOGIN_REPLY_MISC_ERROR;
}
} else {
ret = QQ_LOGIN_REPLY_MISC_ERROR;
}
}

switch (ret) {
case QQ_LOGIN_REPLY_PWD_ERROR:
MessageBox(NULL,"QQ密码错误!","错误",MB_OK);
break;
case QQ_LOGIN_REPLY_MISC_ERROR:
MessageBox(NULL,"QQ登录出错,请重试!","错误",MB_OK);
break;
case QQ_LOGIN_REPLY_OK:
break;
case QQ_LOGIN_REPLY_REDIRECT:
break;
default:
break;
} // switch ret
}

void MyQQ::qq_process_group_cmd_reply(unsigned char* cursor, int len, short seq){}

void MyQQ::qq_process_msg_sys(unsigned char* cursor, int len, short seq){}

void MyQQ::qq_process_friend_change_status(unsigned char* buf, int buf_len)
{
int len, bytes;
unsigned char *data, *cursor;

len = buf_len;
data = (unsigned char*)malloc(len);
cursor = data;

qq_buddy_status * ss;

if(MCrypter.qq_crypt(DECRYPT, buf, buf_len, SessionKey, data, &len))
{
ss = (qq_buddy_status *)malloc(sizeof(qq_buddy_status));
bytes = 0;
// 000-003: uid
bytes += read_packet_dw(data, &cursor, len, &ss->uid);
// 004-004: 0x01
bytes += read_packet_b(data, &cursor, len, &ss->unknown1);
// 005-008: ip
ss->ip = (unsigned char*)malloc(4);
bytes += read_packet_data(data, &cursor, len, ss->ip, 4);
// 009-010: port
bytes += read_packet_w(data, &cursor, len, &ss->port);
// 011-011: 0x00
bytes += read_packet_b(data, &cursor, len, &ss->unknown2);
// 012-012: status
bytes += read_packet_b(data, &cursor, len, &ss->status);
// 013-014:
bytes += read_packet_w(data, &cursor, len, &ss->unknown3);
// 015-030: unknown key
ss->unknown_key = (unsigned char*)malloc(QQ_KEY_LENGTH);
bytes += read_packet_data(data, &cursor, len, ss->unknown_key, QQ_KEY_LENGTH);
}
//这里是更新好友的状态,可自己实现接口
//I_QQChangeBuddyStatus(ss->uid, ss->status);
}

int MyQQ::qq_process_login_ok(unsigned char * data, int len)
{
qq_login_reply_ok lrop;
int bytes;
unsigned char* cursor;

cursor = data;
bytes = 0;

// 000-000: reply code
bytes += read_packet_b(data, &cursor, len, &lrop.result);
// 001-016: session key
lrop.session_key = (unsigned char*)malloc(QQ_KEY_LENGTH);
memcpy(lrop.session_key,cursor,QQ_KEY_LENGTH);

cursor += QQ_KEY_LENGTH;
bytes += QQ_KEY_LENGTH;

// 017-020: login uid
bytes += read_packet_dw(data, &cursor, len, &lrop.uid);
// 021-024: server detected user public IP
bytes += read_packet_data(data, &cursor, len, (unsigned char *) & lrop.client_ip, 4);
// 025-026: server detected user port
bytes += read_packet_w(data, &cursor, len, &lrop.client_port);
// 027-030: server detected itself ip 127.0.0.1 ?
bytes += read_packet_data(data, &cursor, len, (unsigned char *) & lrop.server_ip, 4);
// 031-032: server listening port
bytes += read_packet_w(data, &cursor, len, &lrop.server_port);
// 033-036: login time for current session
bytes += read_packet_dw(data, &cursor, len, (DWORD *) & lrop.login_time);
// 037-062: 26 bytes, unknown
bytes += read_packet_data(data, &cursor, len, (unsigned char *) & lrop.unknown1, 26);
// 063-066: unknown server1 ip address
bytes += read_packet_data(data, &cursor, len, (unsigned char *) & lrop.unknown_server1_ip, 4);
// 067-068: unknown server1 port
bytes += read_packet_w(data, &cursor, len, &lrop.unknown_server1_port);
// 069-072: unknown server2 ip address
bytes += read_packet_data(data, &cursor, len, (unsigned char *) & lrop.unknown_server2_ip, 4);
// 073-074: unknown server2 port
bytes += read_packet_w(data, &cursor, len, &lrop.unknown_server2_port);
// 075-076: 2 bytes unknown
bytes += read_packet_w(data, &cursor, len, &lrop.unknown2);
// 077-078: 2 bytes unknown
bytes += read_packet_w(data, &cursor, len, &lrop.unknown3);
// 079-110: 32 bytes unknown
bytes += read_packet_data(data, &cursor, len, (unsigned char *) & lrop.unknown4, 32);
// 111-122: 12 bytes unknown
bytes += read_packet_data(data, &cursor, len, (unsigned char *) & lrop.unknown5, 12);
// 123-126: login IP of last session
bytes += read_packet_data(data, &cursor, len, (unsigned char *) & lrop.last_client_ip, 4);
// 127-130: login time of last session
bytes += read_packet_dw(data, &cursor, len, (DWORD *) & lrop.last_login_time);
// 131-138: 8 bytes unknown
bytes += read_packet_data(data, &cursor, len, (unsigned char *) & lrop.unknown6, 8);

memcpy(SessionKey,lrop.session_key, QQ_KEY_LENGTH);

sprintf(MyIP,"%d.%d.%d.%d",lrop.client_ip[0],lrop.client_ip[1],lrop.client_ip[2],lrop.client_ip[3]);
MyPort = lrop.client_port;
IsLogin = true;

qq_send_packet_get_info(UserID);

switch(LoginMode)
{
case 1:
Status = 1;
break;
case 2:
Status = 3;
break;
default:
break;
}

qq_send_packet_change_status();

GetFriendList();

return QQ_LOGIN_REPLY_OK;
}

int MyQQ::qq_process_login_redirect(unsigned char * data, int len)
{
int bytes, ret;
unsigned char *cursor;

qq_login_reply_redirect_packet lrrp;

cursor = data;
bytes = 0;

// 000-000: reply code
bytes += read_packet_b(data, &cursor, len, &lrrp.result);

// 001-004: login uid
bytes += read_packet_dw(data, &cursor, len, &lrrp.uid);

// 005-008: redirected new server IP
bytes += read_packet_data(data, &cursor, len, lrrp.new_server_ip, 4);

// 009-010: redirected new server port
bytes += read_packet_w(data, &cursor, len, &lrrp.new_server_port);

if (bytes != QQ_LOGIN_REPLY_REDIRECT_PACKET_LEN) {
ret = QQ_LOGIN_REPLY_MISC_ERROR;
} else {
sprintf(LoginServer,"%d.%d.%d.%d",lrrp.new_server_ip[0],lrrp.new_server_ip[1],lrrp.new_server_ip[2],lrrp.new_server_ip[3]);

//服务器端口
LoginPort = lrrp.new_server_port;

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = inet_addr(LoginServer);
ServerAddr.sin_port = htons(LoginPort);

//向新的服务器地址发送登录请求
Login(LoginMode);

ret = QQ_LOGIN_REPLY_REDIRECT;
}

return ret;
}
int MyQQ::qq_process_login_wrong_pwd(unsigned char * data, int len)
{
return QQ_LOGIN_REPLY_PWD_ERROR;
}

void MyQQ::qq_send_packet_change_status()
{
unsigned char *raw_data, *cursor, away_cmd;
DWORD misc_status;

if (IsLogin == false)
return;

switch (Status) {
case 1:
away_cmd = QQ_BUDDY_ONLINE_NORMAL;
break;
case 2:
away_cmd = QQ_BUDDY_ONLINE_INVISIBLE;
break;
case 3:
away_cmd = QQ_BUDDY_ONLINE_AWAY;
break;
default:
away_cmd = QQ_BUDDY_ONLINE_NORMAL;
} // switch

raw_data = (unsigned char*)malloc(5);
cursor = raw_data;
misc_status = 0x00000000;


create_packet_b(raw_data, &cursor, away_cmd);
create_packet_dw(raw_data, &cursor, misc_status);

qq_send_cmd(QQ_CMD_CHANGE_ONLINE_STATUS, TRUE, 0, TRUE, raw_data, 5);

}

void MyQQ::TurnInvisible()
{
Status = 2;
qq_send_packet_change_status();
}

void MyQQ::TurnVisible()
{
Status = 1;
qq_send_packet_change_status();
}

void MyQQ::TurnAway()
{
Status = 3;
qq_send_packet_change_status();
}

void MyQQ::Logout()
{
int i;

for (i = 0; i < 4; i++)
qq_send_cmd(QQ_CMD_LOGOUT, FALSE, 0xffff, FALSE, PwdKey, QQ_KEY_LENGTH);

IsLogin = false;
Status = 0;
}

void MyQQ::QQSendTextMessage(DWORD to_uid, char * msg, int type)
{

unsigned char *cursor, *raw_data;
short client_tag, normal_im_type;
int msg_len, raw_len, bytes;
time_t now;
unsigned char *md5;
char *msg_filtered;
char *font_size = NULL, *font_color = NULL, *font_name = NULL, *tmp;
bool is_bold = FALSE, is_italic = FALSE, is_underline = FALSE;
const char *start, *end, *last;


client_tag = QQ_CLIENT;
normal_im_type = QQ_NORMAL_IM_TEXT;

last = msg;

msg_filtered = msg;

msg_len = strlen(msg_filtered);
now = time(NULL);
md5 = gen_session_md5(UserID, SessionKey);

int font_name_len, tail_len;
font_name_len = DEFAULT_FONT_NAME_LEN;
tail_len = font_name_len + QQ_SEND_IM_AFTER_MSG_HEADER_LEN + 1;

raw_len = QQ_SEND_IM_BEFORE_MSG_LEN + msg_len + tail_len;
raw_data = (unsigned char*)malloc(raw_len);
cursor = raw_data;
bytes = 0;

//000-003: receiver uid
bytes += create_packet_dw(raw_data, &cursor, UserID);
//004-007: sender uid
bytes += create_packet_dw(raw_data, &cursor, to_uid);
//008-009: sender client version
bytes += create_packet_w(raw_data, &cursor, client_tag);
//010-013: receiver uid
bytes += create_packet_dw(raw_data, &cursor, UserID);
//014-017: sender uid
bytes += create_packet_dw(raw_data, &cursor, to_uid);
//018-033: md5 of (uid+session_key)
bytes += create_packet_data(raw_data, &cursor, md5, 16);
//034-035: message type
bytes += create_packet_w(raw_data, &cursor, normal_im_type);

//036-037: sequence number
//bytes += create_packet_w(raw_data, &cursor, qd->send_seq);
bytes += create_packet_w(raw_data, &cursor, send_seq);

//038-041: send time
bytes += create_packet_dw(raw_data, &cursor, (DWORD)now);
//042-042: always 0x00
bytes += create_packet_b(raw_data, &cursor, 0x00);
//043-043: sender icon
//bytes += create_packet_b(raw_data, &cursor, qd->my_icon);
bytes += create_packet_b(raw_data, &cursor, MyIcon);
//044-046: always 0x00
bytes += create_packet_w(raw_data, &cursor, 0x0000);
bytes += create_packet_b(raw_data, &cursor, 0x00);
//047-047: we use font attr
bytes += create_packet_b(raw_data, &cursor, 0x01);
//048-051: always 0x00
bytes += create_packet_dw(raw_data, &cursor, 0x00000000);
//052-052: text message type (normal/auto-reply)
bytes += create_packet_b(raw_data, &cursor, type);
//053- : msg ends with 0x00
bytes += create_packet_data(raw_data, &cursor, (unsigned char *)msg_filtered, msg_len);

unsigned char *send_im_tail = qq_get_send_im_tail(font_color, font_size, font_name, false,false, false, tail_len);

bytes += create_packet_data(raw_data, &cursor, send_im_tail, tail_len);

if (bytes == raw_len) // create packet OK
{
qq_send_cmd(QQ_CMD_SEND_IM, TRUE, 0, TRUE, raw_data, cursor - raw_data);
}
}

 

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

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