日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QQ心跳包格式分析 监听局域网QQ号代码

發(fā)布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QQ心跳包格式分析 监听局域网QQ号代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

以下我是抓取的QQ客戶端向服務(wù)器發(fā)送的UDP包

00000000 02 11 5B 00 C6 38 A9 23 D8 07 B9 04 9A BA 69 A6?? ..[..8.# ......i.
00000010 F4 AF 1E 60 BD B0 AE 56 DC FE F9 03?????????????? ...`...V ....

00000000 02 11 5B 00 C6 38 A9 D0 82 3C AD 82 7F FA 54 A9?? ..[..8.. .<.. .T.
00000010 58 12 86 0B D4 89 50 51 12 69 C9 48 34 94 24 BB?? X.....PQ .i.H4.$.
00000020 24 15 A6 B1 79 2C FC 03

在中國協(xié)議分析網(wǎng)上看到了相關(guān)的解釋

02 開始是payload
11 5B 是qq版本號
00 C6就是心跳信息命令代碼,(這個數(shù)據(jù)是會變化的)
38 A9 是令牌號(也會變化,好像是每次加1,有待考證)
23 D8 07 B9是QQ號

由上面的包格式我們不難得到局域網(wǎng)中其它用戶的QQ號,將網(wǎng)卡設(shè)為混合模式,監(jiān)聽所有的數(shù)據(jù),對UDP包進行分析,若端口在4000-4007之間,我們認(rèn)定為QQ數(shù)據(jù)包.可按上面格式分析出QQ號碼.C++代碼如下:

#include <winsock2.h>
#include "stdio.h"
#pragma comment(lib,"WS2_32")

#define SIO_RCVALL 0x98000001

//IP 頭 20字節(jié)
typedef struct _IPHeader
{
UCHAR iphVerLen;???? //版本號和頭長度
UCHAR ipTOS;???????? //服務(wù)類型
USHORT ipLength;????? //封包總長度,即整個IP報的長度
USHORT ipID;????????? //封包標(biāo)識,惟一標(biāo)識發(fā)送的第一個數(shù)據(jù)報
USHORT ipFlags;?????? //標(biāo)志
UCHAR ipTTL;???????? //生存時間
UCHAR ipProtocol;??? //協(xié)議,TCP UDP ICMP等
USHORT ipChecksum;??? //校驗和
ULONG ipSource;????? //源IP地址
ULONG ipDestination; //目的IP地址
}IPHeader,*PIPHeader;

//TCP 頭結(jié)構(gòu) 20字節(jié)
typedef struct _TCPHeader
{
USHORT sourcePort;??????? //16bits 源端口號
USHORT destinationPort;?? //16bits 目的端口號
ULONG sequenceNumber;??? //32bits 序列號
ULONG acknowledgeNumber; //32bits 確認(rèn)號
UCHAR dataoffset;??????? //4bits 首部長度
UCHAR flags;???????????? //6bits 標(biāo)志位
USHORT windows;?????????? //16bits 窗口大小
USHORT checksum;????????? //16bits 校驗和
USHORT urgentPointer;???? //16bits 緊急數(shù)據(jù)偏移量
}TCPHeader,*PTCPHeader;


//UDP 包頭
typedef struct _UDPHeader
{
USHORT sourcePort;
USHORT destinationPort;
USHORT len;
USHORT checksum;
}UDPHeader,*PUDPHeader;

//加載網(wǎng)絡(luò)庫
void InitWinSock()
{
WSADATA wsaData;

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
?? printf("Windows sockets 2.2 startup failed!");
}

}

//將網(wǎng)絡(luò)順序轉(zhuǎn)換成本機順序
int ToLocal(int net)
{
byte bb[4];
int local;
bb[0]=(byte)(net&0xff);
bb[1]=(byte)((net>>8)&0xff);
bb[2]=(byte)((net>>16)&0xff);
bb[3]=(byte)((net>>24)&0xff);
local=(int)((bb[0]<<24)|(bb[1]<<16)|(bb[2]<<8)|(bb[3]));
return local;
}
void DecodeUDPPacket(char* pData,in_addr source,in_addr dest)
{
//得到源地址和目的地址
UDPHeader *pUDPHdr=(UDPHeader *)pData;
char szSourceIp[32],szDestIp[32];
strcpy(szSourceIp,::inet_ntoa(source));
strcpy(szDestIp,::inet_ntoa(dest));

//從4000開始為QQ使用端口,具體到多少,不知道,先定到7吧
switch(::ntohs(pUDPHdr->sourcePort))
{
case 4000:
case 4001:
case 4002:
case 4003:
case 4004:
case 4005:
case 4006:
case 4007:
?? int qq[1];
?? memcpy(qq,pData+4*sizeof(USHORT)+7,4);//具體數(shù)據(jù)見我另一篇文章,偏移量7處為QQ密碼
?? printf("源地址:%s 端口:%d QQ:%d 服務(wù)器:%s/n",szSourceIp,ntohs(pUDPHdr->sourcePort),ToLocal(qq[0]),szDestIp);
?? break;
default:break;
}
}
void DecodeIPPacket(char *pData)
{
IPHeader *pIPHdr=(IPHeader *)pData;
in_addr source,dest;
source.S_un.S_addr=pIPHdr->ipSource;
dest.S_un.S_addr=pIPHdr->ipDestination;

int nHeaderLen=(pIPHdr->iphVerLen&0xf)*sizeof(ULONG);
switch(pIPHdr->ipProtocol)
{
case IPPROTO_TCP:
?? break;
case IPPROTO_UDP:??
?? DecodeUDPPacket(pData+nHeaderLen,source,dest);
?? break;
default:break;
}
}
void main()
{
InitWinSock();
SOCKET sRaw=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
//獲取本機IP
char szHostName[56];
SOCKADDR_IN addr_in;
struct hostent *pHost;
gethostname(szHostName,56);
if((pHost=gethostbyname((char *)szHostName))==NULL)
?? return;

//在調(diào)用ioctl之前,綁定
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(0);
memcpy(&addr_in.sin_addr.S_un.S_addr,pHost->h_addr_list[0],pHost->h_length);
printf("開始監(jiān)聽局域網(wǎng)中的QQ...../n");
if(bind(sRaw,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR)
{
?? printf("Bind error!/n");
?? return;
}
//設(shè)置SIO_RCVAL控制代碼,以便接收所有IP包
DWORD dwValue=1;
if(ioctlsocket(sRaw,SIO_RCVALL,&dwValue)!=0)
?? return;
//開始收封包
char buf[1024];
int nRet;
while(true)
{
?? nRet=recv(sRaw,buf,1024,0);
?? if(nRet>0)
?? {
??? DecodeIPPacket(buf);
?? }
}
closesocket(sRaw);

}

為原創(chuàng),若轉(zhuǎn)載請注明出處.

總結(jié)

以上是生活随笔為你收集整理的QQ心跳包格式分析 监听局域网QQ号代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。