
第二次握手后本地會快速發一個RST包。,報文是填充好在底層發出,但是服務器回傳的SYN&ASCK包是會回傳給TCP協議的,TCP協議發現自己沒有進行這個SYN連接,就在我的程式發送ACK之前發了一個RST把我的連接關掉了。
USHORT Get_checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
int U_char_strlen(const u_char *str ) {
int counter=0;
for (;str[counter]!='\0';counter++) ;
return counter;
}
struct eth_header {
BYTE dst_mac[6];
BYTE src_mac[6];
USHORT type; //point next lawyer type;
};
struct ip_header {
BYTE version_4_and_header_len_4;
BYTE tos;
USHORT total_len;
USHORT id;
USHORT flags_3_and_frags_13;
BYTE ttl;
BYTE type;
USHORT header_checksum;
ULONG src_ip_addr;
ULONG dst_ip_addr;
};
struct tcp_header {
USHORT src_port;
USHORT dst_port;
ULONG seq_number;
ULONG ack_number;
BYTE header_len_4_and_remain_4;
BYTE remain_2_and_flags_6;
USHORT windows_size;
USHORT checksum;
USHORT urgent_pointer;
BYTE options[12];
};
struct _psdTcp
{
ULONG sAddr;
ULONG dAddr;
BYTE x;
BYTE type;
USHORT dataLength;
};
struct header {
eth_header _eth_header;
ip_header _ip_header;
tcp_header _tcp_header;
_psdTcp psdTcp;
};
#include "stdafx.h"
#include <string>
#include <iostream>
#pragma comment (lib,"ws2_32.lib")
#include "winsock2.h"
#pragma comment (lib,"wpcap.lib")
#include "pcap.h"
#include "protocol_header_define.h"
//function defination;
USHORT Get_checksum(USHORT *buffer, int size);
//parameter define;
const char *src_ip_addr="192.168.1.101";
const char *dst_ip_addr="119.75.217.109";
BYTE dst_mac[6]={0xfc,0xd7,0x33,0x93,0x66,0x24}; //gateway mac addr;
BYTE src_wlan_mac[6]={0xd0,0x7e,0x35,0x92,0xb2,0xf6}; // host mac addr;
BYTE src_netcard_mac[6]={0x08,0x19,0xa6,0x9b,0xec,0x94};
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
/*
cout<<"please input src_ip "<<endl;
cin>>src_ip_addr;
cout<<"please input dst_ip "<<endl;
cin>>dst_ip_addr;
*/
header header_syn;
//frame input;
memcpy(header_syn._eth_header.dst_mac,dst_mac,6);
memcpy(header_syn._eth_header.src_mac,src_wlan_mac,6);
header_syn._eth_header.type=0x0008;
//ip input
header_syn._ip_header.version_4_and_header_len_4=0x45;
header_syn._ip_header.tos=0;
header_syn._ip_header.total_len=htons(52);
header_syn._ip_header.id=0xede6;
header_syn._ip_header.flags_3_and_frags_13=64;
header_syn._ip_header.ttl=0x80;
header_syn._ip_header.type=0x6;
header_syn._ip_header.header_checksum=0;
header_syn._ip_header.dst_ip_addr=inet_addr(dst_ip_addr);
header_syn._ip_header.src_ip_addr=inet_addr(src_ip_addr);
header_syn._ip_header.header_checksum=Get_checksum((USHORT*)&header_syn._ip_header,sizeof(header_syn._ip_header));
//tcp input;
header_syn._tcp_header.dst_port=htons(80);
header_syn._tcp_header.src_port=htons(44523);
header_syn._tcp_header.seq_number=0xa5dd24ee;
//header_syn._tcp_header.seq_number=0x1;
header_syn._tcp_header.ack_number=0;
header_syn._tcp_header.header_len_4_and_remain_4=0x80;
header_syn._tcp_header.remain_2_and_flags_6=2;
header_syn._tcp_header.windows_size=htons(8192);
header_syn._tcp_header.checksum=0;
header_syn._tcp_header.urgent_pointer=0;
byte tempdata[12]={0x02,0x04,0x05,0xb4,
0x01,0x03,0x03,0x02,0x01,0x01,0x04,0x02};
memcpy(header_syn._tcp_header.options,tempdata,12);
header_syn.psdTcp.sAddr=inet_addr(src_ip_addr);
header_syn.psdTcp.dAddr=inet_addr(dst_ip_addr);
header_syn.psdTcp.type=6;
header_syn.psdTcp.x=0;
header_syn.psdTcp.dataLength=htons(32);
UCHAR buf_tcp[100];
int psdSize=sizeof(header_syn.psdTcp);//12
memcpy(buf_tcp,&header_syn.psdTcp,psdSize);
memcpy(buf_tcp+psdSize,&header_syn._tcp_header,sizeof(header_syn._tcp_header));
psdSize+=sizeof(header_syn._tcp_header);
header_syn._tcp_header.checksum=Get_checksum((USHORT*)buf_tcp,psdSize);//計算TCP的校驗和
// intergret packet;
u_char buffer[100];
int len=0;
memcpy(buffer,&header_syn._eth_header,sizeof(header_syn._eth_header));
len+=sizeof(header_syn._eth_header);
memcpy(buffer+len,&header_syn._ip_header,sizeof(header_syn._ip_header));
len+=sizeof(header_syn._ip_header);
memcpy(buffer+len,&header_syn._tcp_header,sizeof(header_syn._tcp_header));
len+=sizeof(header_syn._tcp_header);
pcap_if_t * alldevs;
char err[100];
pcap_findalldevs(&alldevs,err);
char* name;
name=alldevs->name;
pcap_t *send_pcap,*rcv_pcap;
char err_send_pcap[100];
char err_rcv_pcap[100];
send_pcap=pcap_open(name,66,PCAP_OPENFLAG_PROMISCUOUS,40,NULL,err_send_pcap);
rcv_pcap=pcap_open_live(name,100,false,50,err_rcv_pcap);
pcap_sendpacket(send_pcap,buffer,len);
struct bpf_program fp;
char filter_exp[] = "port 44523";
bpf_u_int32 mask;
bpf_u_int32 net;
const u_char *packet;
pcap_lookupnet(name, &net, &mask,err_rcv_pcap);
pcap_compile(rcv_pcap, &fp, filter_exp,0, net);
pcap_setfilter(rcv_pcap, &fp);
struct pcap_pkthdr rcv_header;
packet= pcap_next(rcv_pcap, &rcv_header);
cout<<"this is your syn&ack packet you received !"<<endl;
for(int i=0;i<66;i++){
printf("%02X",packet[i]);
if((i+1)%1==0) cout<<" ";
if((i+1)%4==0) cout<<" ";
if((i+1)%8==0) cout<<" ";
if((i+1)%16==0)cout<<endl;
}
cout<<endl;
const eth_header *eth;
const ip_header *ip;
const tcp_header *tcp;
eth =(struct eth_header*)(packet);
ip=(struct ip_header*)(packet+14);
tcp=(struct tcp_header*)(packet+34);
header header_ack;
memcpy(header_ack._eth_header.dst_mac,dst_mac,6);
memcpy(header_ack._eth_header.src_mac,src_wlan_mac,6);
header_ack._eth_header.type=0x0008;
header_ack._ip_header.version_4_and_header_len_4=0x45;
header_ack._ip_header.tos=0;
header_ack._ip_header.total_len=htons(40);
header_ack._ip_header.id=htons(ntohs(ip->id)+1);
header_ack._ip_header.flags_3_and_frags_13=64;
header_ack._ip_header.ttl=0x80;
header_ack._ip_header.type=0x6;
header_ack._ip_header.header_checksum=0;
header_ack._ip_header.dst_ip_addr=inet_addr(dst_ip_addr);
header_ack._ip_header.src_ip_addr=inet_addr(src_ip_addr);
header_ack._ip_header.header_checksum=Get_checksum((USHORT*)&header_ack._ip_header,sizeof(header_ack._ip_header));
header_ack._tcp_header.dst_port=htons(80);
header_ack._tcp_header.src_port=htons(44523);
header_ack._tcp_header.seq_number=tcp->ack_number;
//header_syn._tcp_header.seq_number=0x1;
header_ack._tcp_header.ack_number=htonl(ntohl(tcp->seq_number)+1);
header_ack._tcp_header.header_len_4_and_remain_4=0x50;
header_ack._tcp_header.remain_2_and_flags_6=16;
header_ack._tcp_header.windows_size=htons(8192);
header_ack._tcp_header.checksum=0;
header_ack._tcp_header.urgent_pointer=0;
byte tempdata_[12]={0};
memcpy(header_ack._tcp_header.options,tempdata_,12);
header_ack.psdTcp.sAddr=inet_addr(src_ip_addr);
header_ack.psdTcp.dAddr=inet_addr(dst_ip_addr);
header_ack.psdTcp.type=6;
header_ack.psdTcp.x=0;
header_ack.psdTcp.dataLength=htons(20);
psdSize=sizeof(header_ack.psdTcp);//12
memcpy(buf_tcp,&header_ack.psdTcp,psdSize);
memcpy(buf_tcp+psdSize,&header_ack._tcp_header,sizeof(header_ack._tcp_header));
psdSize+=sizeof(header_ack._tcp_header);
header_ack._tcp_header.checksum=Get_checksum((USHORT*)buf_tcp,psdSize);
// intergret packet;
len=0;
memset(buffer,'\0',100);
memcpy(buffer,&header_ack._eth_header,sizeof(header_ack._eth_header));
len+=sizeof(header_ack._eth_header);
memcpy(buffer+len,&header_ack._ip_header,sizeof(header_ack._ip_header));
len+=sizeof(header_ack._ip_header);
memcpy(buffer+len,&header_ack._tcp_header,sizeof(header_ack._tcp_header)-12);
len+=sizeof(header_syn._tcp_header);
len=len-12;
pcap_sendpacket(send_pcap,buffer,len);
pcap_close(send_pcap);
pcap_close(rcv_pcap);
pcap_freealldevs(alldevs);
for(int i=0;i<54;i++){
printf("%02X",buffer[i]);
if((i+1)%1==0) cout<<" ";
if((i+1)%4==0) cout<<" ";
if((i+1)%8==0) cout<<" ";
if((i+1)%16==0)cout<<endl;
}
return 0;
}
uj5u.com熱心網友回復:
重新貼下。USHORT Get_checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
int U_char_strlen(const u_char *str ) {
int counter=0;
for (;str[counter]!='\0';counter++) ;
return counter;
}
struct eth_header {
BYTE dst_mac[6];
BYTE src_mac[6];
USHORT type; //point next lawyer type;
};
struct ip_header {
BYTE version_4_and_header_len_4;
BYTE tos;
USHORT total_len;
USHORT id;
USHORT flags_3_and_frags_13;
BYTE ttl;
BYTE type;
USHORT header_checksum;
ULONG src_ip_addr;
ULONG dst_ip_addr;
};
struct tcp_header {
USHORT src_port;
USHORT dst_port;
ULONG seq_number;
ULONG ack_number;
BYTE header_len_4_and_remain_4;
BYTE remain_2_and_flags_6;
USHORT windows_size;
USHORT checksum;
USHORT urgent_pointer;
BYTE options[12];
};
struct _psdTcp
{
ULONG sAddr;
ULONG dAddr;
BYTE x;
BYTE type;
USHORT dataLength;
};
struct header {
eth_header _eth_header;
ip_header _ip_header;
tcp_header _tcp_header;
_psdTcp psdTcp;
};
#include "stdafx.h"
#include <string>
#include <iostream>
#pragma comment (lib,"ws2_32.lib")
#include "winsock2.h"
#pragma comment (lib,"wpcap.lib")
#include "pcap.h"
#include "protocol_header_define.h"
//function defination;
USHORT Get_checksum(USHORT *buffer, int size);
//parameter define;
const char *src_ip_addr="192.168.1.101";
const char *dst_ip_addr="119.75.217.109";
BYTE dst_mac[6]={0xfc,0xd7,0x33,0x93,0x66,0x24}; //gateway mac addr;
BYTE src_wlan_mac[6]={0xd0,0x7e,0x35,0x92,0xb2,0xf6}; // host mac addr;
BYTE src_netcard_mac[6]={0x08,0x19,0xa6,0x9b,0xec,0x94};
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
/*
cout<<"please input src_ip "<<endl;
cin>>src_ip_addr;
cout<<"please input dst_ip "<<endl;
cin>>dst_ip_addr;
*/
header header_syn;
//frame input;
memcpy(header_syn._eth_header.dst_mac,dst_mac,6);
memcpy(header_syn._eth_header.src_mac,src_wlan_mac,6);
header_syn._eth_header.type=0x0008;
//ip input
header_syn._ip_header.version_4_and_header_len_4=0x45;
header_syn._ip_header.tos=0;
header_syn._ip_header.total_len=htons(52);
header_syn._ip_header.id=0xede6;
header_syn._ip_header.flags_3_and_frags_13=64;
header_syn._ip_header.ttl=0x80;
header_syn._ip_header.type=0x6;
header_syn._ip_header.header_checksum=0;
header_syn._ip_header.dst_ip_addr=inet_addr(dst_ip_addr);
header_syn._ip_header.src_ip_addr=inet_addr(src_ip_addr);
header_syn._ip_header.header_checksum=Get_checksum((USHORT*)&header_syn._ip_header,sizeof(header_syn._ip_header));
//tcp input;
header_syn._tcp_header.dst_port=htons(80);
header_syn._tcp_header.src_port=htons(44523);
header_syn._tcp_header.seq_number=0xa5dd24ee;
//header_syn._tcp_header.seq_number=0x1;
header_syn._tcp_header.ack_number=0;
header_syn._tcp_header.header_len_4_and_remain_4=0x80;
header_syn._tcp_header.remain_2_and_flags_6=2;
header_syn._tcp_header.windows_size=htons(8192);
header_syn._tcp_header.checksum=0;
header_syn._tcp_header.urgent_pointer=0;
byte tempdata[12]={0x02,0x04,0x05,0xb4,
0x01,0x03,0x03,0x02,0x01,0x01,0x04,0x02};
memcpy(header_syn._tcp_header.options,tempdata,12);
header_syn.psdTcp.sAddr=inet_addr(src_ip_addr);
header_syn.psdTcp.dAddr=inet_addr(dst_ip_addr);
header_syn.psdTcp.type=6;
header_syn.psdTcp.x=0;
header_syn.psdTcp.dataLength=htons(32);
UCHAR buf_tcp[100];
int psdSize=sizeof(header_syn.psdTcp);//12
memcpy(buf_tcp,&header_syn.psdTcp,psdSize);
memcpy(buf_tcp+psdSize,&header_syn._tcp_header,sizeof(header_syn._tcp_header));
psdSize+=sizeof(header_syn._tcp_header);
header_syn._tcp_header.checksum=Get_checksum((USHORT*)buf_tcp,psdSize);//計算TCP的校驗和
// intergret packet;
u_char buffer[100];
int len=0;
memcpy(buffer,&header_syn._eth_header,sizeof(header_syn._eth_header));
len+=sizeof(header_syn._eth_header);
memcpy(buffer+len,&header_syn._ip_header,sizeof(header_syn._ip_header));
len+=sizeof(header_syn._ip_header);
memcpy(buffer+len,&header_syn._tcp_header,sizeof(header_syn._tcp_header));
len+=sizeof(header_syn._tcp_header);
pcap_if_t * alldevs;
char err[100];
pcap_findalldevs(&alldevs,err);
char* name;
name=alldevs->name;
pcap_t *send_pcap,*rcv_pcap;
char err_send_pcap[100];
char err_rcv_pcap[100];
send_pcap=pcap_open(name,66,PCAP_OPENFLAG_PROMISCUOUS,40,NULL,err_send_pcap);
rcv_pcap=pcap_open_live(name,100,false,50,err_rcv_pcap);
pcap_sendpacket(send_pcap,buffer,len);
struct bpf_program fp;
char filter_exp[] = "port 44523";
bpf_u_int32 mask;
bpf_u_int32 net;
const u_char *packet;
pcap_lookupnet(name, &net, &mask,err_rcv_pcap);
pcap_compile(rcv_pcap, &fp, filter_exp,0, net);
pcap_setfilter(rcv_pcap, &fp);
struct pcap_pkthdr rcv_header;
packet= pcap_next(rcv_pcap, &rcv_header);
cout<<"this is your syn&ack packet you received !"<<endl;
for(int i=0;i<66;i++){
printf("%02X",packet[i]);
if((i+1)%1==0) cout<<" ";
if((i+1)%4==0) cout<<" ";
if((i+1)%8==0) cout<<" ";
if((i+1)%16==0)cout<<endl;
}
cout<<endl;
const eth_header *eth;
const ip_header *ip;
const tcp_header *tcp;
eth =(struct eth_header*)(packet);
ip=(struct ip_header*)(packet+14);
tcp=(struct tcp_header*)(packet+34);
header header_ack;
memcpy(header_ack._eth_header.dst_mac,dst_mac,6);
memcpy(header_ack._eth_header.src_mac,src_wlan_mac,6);
header_ack._eth_header.type=0x0008;
header_ack._ip_header.version_4_and_header_len_4=0x45;
header_ack._ip_header.tos=0;
header_ack._ip_header.total_len=htons(40);
header_ack._ip_header.id=htons(ntohs(ip->id)+1);
header_ack._ip_header.flags_3_and_frags_13=64;
header_ack._ip_header.ttl=0x80;
header_ack._ip_header.type=0x6;
header_ack._ip_header.header_checksum=0;
header_ack._ip_header.dst_ip_addr=inet_addr(dst_ip_addr);
header_ack._ip_header.src_ip_addr=inet_addr(src_ip_addr);
header_ack._ip_header.header_checksum=Get_checksum((USHORT*)&header_ack._ip_header,sizeof(header_ack._ip_header));
header_ack._tcp_header.dst_port=htons(80);
header_ack._tcp_header.src_port=htons(44523);
header_ack._tcp_header.seq_number=tcp->ack_number;
//header_syn._tcp_header.seq_number=0x1;
header_ack._tcp_header.ack_number=htonl(ntohl(tcp->seq_number)+1);
header_ack._tcp_header.header_len_4_and_remain_4=0x50;
header_ack._tcp_header.remain_2_and_flags_6=16;
header_ack._tcp_header.windows_size=htons(8192);
header_ack._tcp_header.checksum=0;
header_ack._tcp_header.urgent_pointer=0;
byte tempdata_[12]={0};
memcpy(header_ack._tcp_header.options,tempdata_,12);
header_ack.psdTcp.sAddr=inet_addr(src_ip_addr);
header_ack.psdTcp.dAddr=inet_addr(dst_ip_addr);
header_ack.psdTcp.type=6;
header_ack.psdTcp.x=0;
header_ack.psdTcp.dataLength=htons(20);
psdSize=sizeof(header_ack.psdTcp);//12
memcpy(buf_tcp,&header_ack.psdTcp,psdSize);
memcpy(buf_tcp+psdSize,&header_ack._tcp_header,sizeof(header_ack._tcp_header));
psdSize+=sizeof(header_ack._tcp_header);
header_ack._tcp_header.checksum=Get_checksum((USHORT*)buf_tcp,psdSize);
// intergret packet;
len=0;
memset(buffer,'\0',100);
memcpy(buffer,&header_ack._eth_header,sizeof(header_ack._eth_header));
len+=sizeof(header_ack._eth_header);
memcpy(buffer+len,&header_ack._ip_header,sizeof(header_ack._ip_header));
len+=sizeof(header_ack._ip_header);
memcpy(buffer+len,&header_ack._tcp_header,sizeof(header_ack._tcp_header)-12);
len+=sizeof(header_syn._tcp_header);
len=len-12;
pcap_sendpacket(send_pcap,buffer,len);
pcap_close(send_pcap);
pcap_close(rcv_pcap);
pcap_freealldevs(alldevs);
for(int i=0;i<54;i++){
printf("%02X",buffer[i]);
if((i+1)%1==0) cout<<" ";
if((i+1)%4==0) cout<<" ";
if((i+1)%8==0) cout<<" ";
if((i+1)%16==0)cout<<endl;
}
return 0;
}
uj5u.com熱心網友回復:
客戶端發syn 服務端發syn+ack 然后客戶端發RST,我遇到的是這種情況。uj5u.com熱心網友回復:
整篇代碼 完全沒有體現原始套接字 以及如何規避第二次握手后本地會快速發一個RST包的問題uj5u.com熱心網友回復:
期待大神回答uj5u.com熱心網友回復:
管理員憑什么說我是灌水?我現在本來就遇到了這個一樣的問題,搞了幾天沒有找到原因,搜索發現這里有類似的,所以問問。
uj5u.com熱心網友回復:
對方的synack包過來后被系統的協議堆疊直接rst掉了,你要虛擬一個本網段不存在的IP來發包這樣系統協議堆疊就不會rst了。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/38886.html
標籤:網絡通信
