QQ心跳包格式分析 监听局域网QQ号代码
以下我是抓取的QQ客戶端向服務器發送的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 
在中國協議分析網上看到了相關的解釋
02 開始是payload
11 5B 是qq版本號
00 C6就是心跳信息命令代碼,(這個數據是會變化的)
38 A9 是令牌號(也會變化,好像是每次加1,有待考證)
23 D8 07 B9是QQ號
由上面的包格式我們不難得到局域網中其它用戶的QQ號,將網卡設為混合模式,監聽所有的數據,對UDP包進行分析,若端口在4000-4007之間,我們認定為QQ數據包.可按上面格式分析出QQ號碼.C++代碼如下:
#include <winsock2.h>
#include "stdio.h"
#pragma comment(lib,"WS2_32")
#define SIO_RCVALL 0x98000001
//IP 頭 20字節
typedef struct _IPHeader
{
UCHAR iphVerLen;???? //版本號和頭長度
UCHAR ipTOS;???????? //服務類型
USHORT ipLength;????? //封包總長度,即整個IP報的長度
USHORT ipID;????????? //封包標識,惟一標識發送的第一個數據報
USHORT ipFlags;?????? //標志
UCHAR ipTTL;???????? //生存時間
UCHAR ipProtocol;??? //協議,TCP UDP ICMP等
USHORT ipChecksum;??? //校驗和
ULONG ipSource;????? //源IP地址
ULONG ipDestination; //目的IP地址
}IPHeader,*PIPHeader;
//TCP 頭結構 20字節
typedef struct _TCPHeader
{
USHORT sourcePort;??????? //16bits 源端口號
USHORT destinationPort;?? //16bits 目的端口號
ULONG sequenceNumber;??? //32bits 序列號
ULONG acknowledgeNumber; //32bits 確認號
UCHAR dataoffset;??????? //4bits 首部長度
UCHAR flags;???????????? //6bits 標志位
USHORT windows;?????????? //16bits 窗口大小
USHORT checksum;????????? //16bits 校驗和
USHORT urgentPointer;???? //16bits 緊急數據偏移量
}TCPHeader,*PTCPHeader;
//UDP 包頭
typedef struct _UDPHeader
{
USHORT sourcePort;
USHORT destinationPort;
USHORT len;
USHORT checksum;
}UDPHeader,*PUDPHeader;
//加載網絡庫
void InitWinSock()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
?? printf("Windows sockets 2.2 startup failed!");
}
}
//將網絡順序轉換成本機順序
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);//具體數據見我另一篇文章,偏移量7處為QQ密碼
?? printf("源地址:%s 端口:%d QQ:%d 服務器:%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;
//在調用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("開始監聽局域網中的QQ...../n");
if(bind(sRaw,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR)
{
?? printf("Bind error!/n");
?? return;
}
//設置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);
}
為原創,若轉載請注明出處.
總結
以上是生活随笔為你收集整理的QQ心跳包格式分析 监听局域网QQ号代码的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 288. Man proposes, G
 - 下一篇: 计算机怎么审单流程,通关一体化的具体流程