能力值:
( LV2,RANK:10 )
|
-
-
8 楼
这是发送SYN请求的函数
//////////////////////////////////////////////////////////////////////////
DWORD WINAPI SendPacketThread(LPVOID lpParam)
{
PSDTCP_HEADER psd_header;
IP_HEADER ip_header;
TCP_HEADER tcp_header;
ETHERNETHEADER etherHeader;
//发送SYN包
ZeroMemory(&ip_header,sizeof(IP_HEADER));
ZeroMemory(&tcp_header,sizeof(TCP_HEADER));
ZeroMemory(ðerHeader,sizeof(ETHERNETHEADER));
ZeroMemory(&psd_header,sizeof(PSDTCP_HEADER));
//ip header
ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));//高四位IP版本号,低四位首部长度
ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)+strlen(g_BehindString));//16位总长度(字节)
ip_header.ident=0x14BB;//16位标识
ip_header.frag_and_flags=0x0040;//3位标志位
ip_header.ttl=128;//8位生存时间TTL
ip_header.proto=IPPROTO_TCP;//8位协议(TCP,UDP…)
ip_header.checksum=0;//16位IP首部校验和
ip_header.sourceIP=inet_addr(g_szIPSelf);//32位源IP地址
ip_header.destIP=inet_addr(g_szIPDst);//32位目的IP地址
//填充TCP首部
tcp_header.th_sport=htons(1950);//源端口号
tcp_header.th_dport=htons(80);//目的端口号
tcp_header.th_seq=htonl(SEQ);//SYN序列号
tcp_header.th_ack=0;//ACK序列号置为0
tcp_header.th_lenres=((sizeof(TCP_HEADER)+strlen(g_BehindString))/4<<4|0); //TCP长度和保留位
tcp_header.th_flag=2;//SYN 标志
tcp_header.th_win=htons(65535); //窗口大小
tcp_header.th_urp=0; //偏移
tcp_header.th_sum=0; //校验和
//填充TCP伪首部(用于计算校验和,并不真正发送)
psd_header.saddr=ip_header.sourceIP;
psd_header.daddr=ip_header.destIP; //目的地址
psd_header.mbz=0;
psd_header.ptcl=IPPROTO_TCP; //协议类型
psd_header.tcpl=htons(sizeof(tcp_header)); //TCP首部长度
//ethernet header
etherHeader.eh_dst[0]=g_MacOfGateway[0];
etherHeader.eh_dst[1]=g_MacOfGateway[1];
etherHeader.eh_dst[2]=g_MacOfGateway[2];
etherHeader.eh_dst[3]=g_MacOfGateway[3];
etherHeader.eh_dst[4]=g_MacOfGateway[4];
etherHeader.eh_dst[5]=g_MacOfGateway[5];
etherHeader.eh_src[0]=g_MacOfNative[0];
etherHeader.eh_src[1]=g_MacOfNative[1];
etherHeader.eh_src[2]=g_MacOfNative[2];
etherHeader.eh_src[3]=g_MacOfNative[3];
etherHeader.eh_src[4]=g_MacOfNative[4];
etherHeader.eh_src[5]=g_MacOfNative[5];
etherHeader.eh_Type=0x0008;
char SendBuf[1600];
int datasize;
//----------------Send SYN Packet----------------
//计算TCP校验和
memset(SendBuf,0,1600);
memcpy(SendBuf,&psd_header,sizeof(psd_header));
memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
memcpy(SendBuf+sizeof(psd_header)+sizeof(tcp_header),g_BehindString,strlen(g_BehindString));
tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header)+strlen(g_BehindString));
tcp_header.th_sum = htons(ntohs(tcp_header.th_sum)-(USHORT)strlen(g_BehindString));
//计算IP校验和
memset(SendBuf,0,1600);
memcpy(SendBuf,&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
ip_header.checksum=checksum((USHORT *)SendBuf,sizeof(ip_header));
//填充发送缓冲区
memset(SendBuf,0,1600);
memcpy(SendBuf,ðerHeader,sizeof(ETHERNETHEADER));
memcpy(SendBuf+sizeof(ETHERNETHEADER),&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header)+sizeof(tcp_header),g_BehindString,strlen(g_BehindString));
datasize=sizeof(ip_header)+sizeof(tcp_header)+sizeof(ETHERNETHEADER)+strlen(g_BehindString);
pcap_sendpacket(g_adhandle,(const unsigned char *)SendBuf,datasize);
printf("Send SYN\n");
}
这是当收到对方的(SYN+ACK)回复后,分析回复的包头信息后,所调用的发送ACK和Get请求的函数
void SendAck_GetPacket(USHORT sPort,USHORT dPort,UINT nSyn,UINT nAck)
{
PSDTCP_HEADER psd_header;
IP_HEADER ip_header;
TCP_HEADER tcp_header;
ETHERNETHEADER etherHeader;
char SendBuf[1600];
int datasize;
//发送SYN包
ZeroMemory(&ip_header,sizeof(IP_HEADER));
ZeroMemory(&tcp_header,sizeof(TCP_HEADER));
ZeroMemory(ðerHeader,sizeof(ETHERNETHEADER));
ZeroMemory(&psd_header,sizeof(PSDTCP_HEADER));
//ip header
ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));//高四位IP版本号,低四位首部长度
ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)
ip_header.ident=0x16BB;//16位标识
ip_header.frag_and_flags=0x0040;//3位标志位
ip_header.ttl=128;//8位生存时间TTL
ip_header.proto=IPPROTO_TCP;//8位协议(TCP,UDP…)
ip_header.checksum=0;//16位IP首部校验和
ip_header.sourceIP=inet_addr(g_szIPSelf);//32位源IP地址
ip_header.destIP=inet_addr(g_szIPDst);//32位目的IP地址
//填充TCP伪首部(用于计算校验和,并不真正发送)
psd_header.saddr=ip_header.sourceIP;
psd_header.daddr=ip_header.destIP; //目的地址
psd_header.mbz=0;
psd_header.ptcl=IPPROTO_TCP; //协议类型
psd_header.tcpl=htons(sizeof(tcp_header)); //TCP首部长度
etherHeader.eh_dst[0]=g_MacOfGateway[0];
etherHeader.eh_dst[1]=g_MacOfGateway[1];
etherHeader.eh_dst[2]=g_MacOfGateway[2];
etherHeader.eh_dst[3]=g_MacOfGateway[3];
etherHeader.eh_dst[4]=g_MacOfGateway[4];
etherHeader.eh_dst[5]=g_MacOfGateway[5];
etherHeader.eh_src[0]=g_MacOfNative[0];
etherHeader.eh_src[1]=g_MacOfNative[1];
etherHeader.eh_src[2]=g_MacOfNative[2];
etherHeader.eh_src[3]=g_MacOfNative[3];
etherHeader.eh_src[4]=g_MacOfNative[4];
etherHeader.eh_src[5]=g_MacOfNative[5];
etherHeader.eh_Type=0x0008;
//更改TCP首部
tcp_header.th_flag=0x10;//ACK
tcp_header.th_seq=htonl(nAck); //SYN序列号
tcp_header.th_ack=htonl(nSyn+1);//ACK
tcp_header.th_sum=0; //校验和
tcp_header.th_sport=htons(dPort);
tcp_header.th_dport=htons(REMOTE_PORT); //目的端口号
tcp_header.th_win=htons(65535); //窗口大小
tcp_header.th_urp=0; //偏移
tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0); //TCP长度和保留位
//计算TCP校验和,计算校验和时需要包括TCP pseudo header
memset(SendBuf,0,1600);
memcpy(SendBuf,&psd_header,sizeof(psd_header));
memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
//计算IP校验和
memset(SendBuf,0,1600);
memcpy(SendBuf,&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
ip_header.checksum=checksum((USHORT *)SendBuf,sizeof(ip_header));
//填充发送缓冲区
memset(SendBuf,0,1600);
memcpy(SendBuf,ðerHeader,sizeof(ETHERNETHEADER));
memcpy(SendBuf+sizeof(ETHERNETHEADER),&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
datasize=sizeof(ETHERNETHEADER)+sizeof(ip_header)+sizeof(tcp_header);
pcap_sendpacket(g_adhandle,(const unsigned char *)SendBuf,datasize);
printf("Send ACK %d\n",dPort);
Sleep(200);
//-------------------Send Http Get Packet---------------
///////////////////////////////////////////////////////////////////////////
//更改IP首部
ip_header.checksum=0; //16位IP首部校验和
ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)+strlen(g_HttpHeader)); //16位总长度(字节)
ip_header.ident=0x17BB;//16位标识
//更改TCP首部
tcp_header.th_flag=0x18;//ACK+PSH
tcp_header.th_seq=htonl(nAck); //SYN序列号
tcp_header.th_ack=htonl(nSyn+1);//ACK
tcp_header.th_sum=0; //校验和
tcp_header.th_sport=htons(dPort);
tcp_header.th_win=htons(65535); //窗口大小
//计算TCP校验和,计算校验和时需要包括TCP pseudo header
memset(SendBuf,0,1600);
memcpy(SendBuf,&psd_header,sizeof(psd_header));
memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
//计算IP校验和
memset(SendBuf,0,1600);
memcpy(SendBuf,&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
ip_header.checksum=checksum((USHORT *)SendBuf,sizeof(ip_header));
//填充发送缓冲区
memset(SendBuf,0,1600);
memcpy(SendBuf,ðerHeader,sizeof(ETHERNETHEADER));
memcpy(SendBuf+sizeof(ETHERNETHEADER),&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header)+sizeof(tcp_header),g_HttpHeader,strlen(g_HttpHeader));
datasize=sizeof(ETHERNETHEADER)+sizeof(ip_header)+sizeof(tcp_header)+strlen(g_HttpHeader);
pcap_sendpacket(g_adhandle,(const unsigned char *)SendBuf,datasize);
printf("+++++++++++++++++GET ok %d\n",dPort);
return;
}
1、网卡是以混杂模式打开的
2、发送完Get请求之后,服务器就不给我响应了,这是什么原因呢?按说服务器那边已经建立好了连接,可为啥就不回复Get请求呢?为啥Get请求没有能够到达应用层呢?
请大侠指点迷津,谢谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
我把发get请求包里面的计算tcp校验和改为了
//计算TCP校验和,计算校验和时需要包括TCP pseudo header
memset(SendBuf,0,1600);
memcpy(SendBuf,&psd_header,sizeof(psd_header));
memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
memcpy(SendBuf+sizeof(psd_header)+sizeof(tcp_header),g_HttpHeader,strlen(g_HttpHeader));
tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header)+strlen(g_HttpHeader));
可结果,服务器应用层仍然没有收到包,奇怪。
|