From e5524d9edf39873a21e38ef368b7dd8e30b4aa9c Mon Sep 17 00:00:00 2001 From: wangyu- Date: Thu, 14 Jun 2018 09:54:33 -0500 Subject: [PATCH] fix iphdr tcphdr udphdr --- common.h | 7 ++-- network.cpp | 56 +++++++++++++------------- network.h | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 31 deletions(-) diff --git a/common.h b/common.h index 39967cf..50b281f 100644 --- a/common.h +++ b/common.h @@ -25,9 +25,9 @@ #include //for exit(0); #include //For errno - the error number #include // for gethostbyname() -#include //Provides declarations for tcp header -#include -#include //Provides declarations for ip header +//#include //Provides declarations for tcp header +//#include +//#include //Provides declarations for ip header #include #include #include @@ -135,6 +135,7 @@ struct queue_t } }; + u64_t get_current_time(); u64_t pack_u64(u32_t a,u32_t b); diff --git a/network.cpp b/network.cpp index 481b4a9..9af3f30 100644 --- a/network.cpp +++ b/network.cpp @@ -720,10 +720,10 @@ int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen) return 0; } - struct iphdr *iph = (struct iphdr *) send_raw_ip_buf; - memset(iph,0,sizeof(iphdr)); + struct my_iphdr *iph = (struct my_iphdr *) send_raw_ip_buf; + memset(iph,0,sizeof(my_iphdr)); - iph->ihl = sizeof(iphdr)/4; //we dont use ip options,so the length is just sizeof(iphdr) + iph->ihl = sizeof(my_iphdr)/4; //we dont use ip options,so the length is just sizeof(iphdr) iph->version = 4; iph->tos = 0; @@ -744,12 +744,12 @@ int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen) iph->saddr = send_info.src_ip; //Spoof the source ip address iph->daddr = send_info.dst_ip; - uint16_t ip_tot_len=sizeof (struct iphdr)+payloadlen; + uint16_t ip_tot_len=sizeof (struct my_iphdr)+payloadlen; /* if(lower_level)iph->tot_len = htons(ip_tot_len); //this is not necessary ,kernel will always auto fill this //http://man7.org/linux/man-pages/man7/raw.7.html else*/ iph->tot_len = 0; - memcpy(send_raw_ip_buf+sizeof(iphdr) , payload, payloadlen); + memcpy(send_raw_ip_buf+sizeof(my_iphdr) , payload, payloadlen); /*if(lower_level) iph->check = csum ((unsigned short *) send_raw_ip_buf, iph->ihl*4); //this is not necessary ,kernel will always auto fill this @@ -807,11 +807,11 @@ int peek_raw(packet_info_t &peek_info) struct sockaddr saddr={0}; socklen_t saddr_size=sizeof(saddr); int recv_len = recvfrom(raw_recv_fd, peek_raw_buf,max_data_len, MSG_PEEK ,&saddr , &saddr_size);//change max_data_len to something smaller,we only need header here - iphdr * iph = (struct iphdr *) (ip_begin); + my_iphdr * iph = (struct my_iphdr *) (ip_begin); //mylog(log_info,"recv_len %d\n",recv_len); - if(recv_lenprotocol!=IPPROTO_UDP) return -1; - struct udphdr *udph=(udphdr *)payload; - if(recv_lensource); break; @@ -868,7 +868,7 @@ int recv_raw_ip(raw_info_t &raw_info,char * &payload,int &payloadlen) //static char recv_raw_ip_buf[buf_len]; - iphdr * iph; + my_iphdr * iph; /*struct sockaddr_ll saddr={0}; socklen_t saddr_size = sizeof(saddr);*/ int flag=0; @@ -905,7 +905,7 @@ int recv_raw_ip(raw_info_t &raw_info,char * &payload,int &payloadlen) char *ip_begin=recv_raw_ip_buf+link_level_header_len; //14 is eth net header - iph = (struct iphdr *) (ip_begin); + iph = (struct my_iphdr *) (ip_begin); recv_info.src_ip=iph->saddr; recv_info.dst_ip=iph->daddr; @@ -1009,16 +1009,16 @@ int send_raw_udp(raw_info_t &raw_info, const char * payload, int payloadlen) char send_raw_udp_buf[buf_len]; - udphdr *udph=(struct udphdr *) (send_raw_udp_buf + my_udphdr *udph=(struct my_udphdr *) (send_raw_udp_buf + sizeof(struct pseudo_header)); - memset(udph,0,sizeof(udphdr)); + memset(udph,0,sizeof(my_udphdr)); struct pseudo_header *psh = (struct pseudo_header *) (send_raw_udp_buf); udph->source = htons(send_info.src_port); udph->dest = htons(send_info.dst_port); - int udp_tot_len=payloadlen+sizeof(udphdr); + int udp_tot_len=payloadlen+sizeof(my_udphdr); if(udp_tot_len>65535) { @@ -1028,7 +1028,7 @@ int send_raw_udp(raw_info_t &raw_info, const char * payload, int payloadlen) mylog(log_trace,"udp_len:%d %d\n",udp_tot_len,udph->len); udph->len=htons(uint16_t(udp_tot_len)); - memcpy(send_raw_udp_buf+sizeof(struct pseudo_header)+sizeof(udphdr),payload,payloadlen); + memcpy(send_raw_udp_buf+sizeof(struct pseudo_header)+sizeof(my_udphdr),payload,payloadlen); psh->source_address = send_info.src_ip; psh->dest_address = send_info.dst_ip; @@ -1058,11 +1058,11 @@ int send_raw_tcp(raw_info_t &raw_info,const char * payload, int payloadlen) { char send_raw_tcp_buf[buf_len]; //char *send_raw_tcp_buf=send_raw_tcp_buf0; - struct tcphdr *tcph = (struct tcphdr *) (send_raw_tcp_buf + struct my_tcphdr *tcph = (struct my_tcphdr *) (send_raw_tcp_buf + sizeof(struct pseudo_header)); - memset(tcph,0,sizeof(tcphdr)); + memset(tcph,0,sizeof(my_tcphdr)); struct pseudo_header *psh = (struct pseudo_header *) (send_raw_tcp_buf); @@ -1081,7 +1081,7 @@ int send_raw_tcp(raw_info_t &raw_info,const char * payload, int payloadlen) { if (tcph->syn == 1) { tcph->doff = 10; //tcp header size - int i = sizeof(pseudo_header)+sizeof(tcphdr); + int i = sizeof(pseudo_header)+sizeof(my_tcphdr); send_raw_tcp_buf[i++] = 0x02; //mss send_raw_tcp_buf[i++] = 0x04; send_raw_tcp_buf[i++] = 0x05; @@ -1117,7 +1117,7 @@ int send_raw_tcp(raw_info_t &raw_info,const char * payload, int payloadlen) { send_raw_tcp_buf[i++] = wscale; } else { tcph->doff = 8; - int i = sizeof(pseudo_header)+sizeof(tcphdr); + int i = sizeof(pseudo_header)+sizeof(my_tcphdr); send_raw_tcp_buf[i++] = 0x01; send_raw_tcp_buf[i++] = 0x01; @@ -1431,12 +1431,12 @@ int recv_raw_udp(raw_info_t &raw_info, char *&payload, int &payloadlen) //printf("not udp protocol\n"); return -1; } - if(ip_payloadlenlen))!=ip_payloadlen) { @@ -1477,9 +1477,9 @@ int recv_raw_udp(raw_info_t &raw_info, char *&payload, int &payloadlen) recv_info.src_port=ntohs(udph->source); recv_info.dst_port=ntohs(udph->dest); - payloadlen = ip_payloadlen-sizeof(udphdr); + payloadlen = ip_payloadlen-sizeof(my_udphdr); - payload=udp_begin+sizeof(udphdr); + payload=udp_begin+sizeof(my_udphdr); return 0; } @@ -1508,7 +1508,7 @@ int recv_raw_tcp(raw_info_t &raw_info,char * &payload,int &payloadlen) } - tcphdr * tcph=(struct tcphdr*)ip_payload; + my_tcphdr * tcph=(struct my_tcphdr*)ip_payload; unsigned short tcphdrlen = tcph->doff*4; @@ -1547,7 +1547,7 @@ int recv_raw_tcp(raw_info_t &raw_info,char * &payload,int &payloadlen) char *tcp_begin=recv_raw_tcp_buf+sizeof(struct pseudo_header); //ip packet's data part - char *tcp_option=recv_raw_tcp_buf+sizeof(struct pseudo_header)+sizeof(tcphdr); + char *tcp_option=recv_raw_tcp_buf+sizeof(struct pseudo_header)+sizeof(my_tcphdr); recv_info.has_ts=0; recv_info.ts=0; diff --git a/network.h b/network.h index 2fd220f..1cae436 100644 --- a/network.h +++ b/network.h @@ -48,6 +48,119 @@ struct icmphdr uint16_t seq; }; +struct my_iphdr + { +//#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int ihl:4; + unsigned int version:4; +//#elif __BYTE_ORDER == __BIG_ENDIAN +// unsigned int version:4; +// unsigned int ihl:4; +//#else +//# error "Please fix " +//#endif + u_int8_t tos; + u_int16_t tot_len; + u_int16_t id; + u_int16_t frag_off; + u_int8_t ttl; + u_int8_t protocol; + u_int16_t check; + u_int32_t saddr; + u_int32_t daddr; + /*The options start here. */ + }; + + +struct my_udphdr +{ + __extension__ union + { + struct + { + u_int16_t uh_sport; /* source port */ + u_int16_t uh_dport; /* destination port */ + u_int16_t uh_ulen; /* udp length */ + u_int16_t uh_sum; /* udp checksum */ + }; + struct + { + u_int16_t source; + u_int16_t dest; + u_int16_t len; + u_int16_t check; + }; + }; +}; + + +struct my_tcphdr + { + __extension__ union + { + struct + { + u_int16_t th_sport; /* source port */ + u_int16_t th_dport; /* destination port */ + u_int32_t th_seq; /* sequence number */ + u_int32_t th_ack; /* acknowledgement number */ +//# if __BYTE_ORDER == __LITTLE_ENDIAN + u_int8_t th_x2:4; /* (unused) */ + u_int8_t th_off:4; /* data offset */ +//# endif +//# if __BYTE_ORDER == __BIG_ENDIAN +// u_int8_t th_off:4; /* data offset */ +// u_int8_t th_x2:4; /* (unused) */ +//# endif + u_int8_t th_flags; +# define TH_FIN 0x01 +# define TH_SYN 0x02 +# define TH_RST 0x04 +# define TH_PUSH 0x08 +# define TH_ACK 0x10 +# define TH_URG 0x20 + u_int16_t th_win; /* window */ + u_int16_t th_sum; /* checksum */ + u_int16_t th_urp; /* urgent pointer */ + }; + struct + { + u_int16_t source; + u_int16_t dest; + u_int32_t seq; + u_int32_t ack_seq; +//# if __BYTE_ORDER == __LITTLE_ENDIAN + u_int16_t res1:4; + u_int16_t doff:4; + u_int16_t fin:1; + u_int16_t syn:1; + u_int16_t rst:1; + u_int16_t psh:1; + u_int16_t ack:1; + u_int16_t urg:1; + u_int16_t res2:2; +//# elif __BYTE_ORDER == __BIG_ENDIAN +// u_int16_t doff:4; +// u_int16_t res1:4; +// u_int16_t res2:2; +// u_int16_t urg:1; +// u_int16_t ack:1; +// u_int16_t psh:1; +// u_int16_t rst:1; +// u_int16_t syn:1; +// u_int16_t fin:1; +//# else +//# error "Adjust your defines" +//# endif + u_int16_t window; + u_int16_t check; + u_int16_t urg_ptr; + }; + }; +}; + + + struct pseudo_header { u_int32_t source_address; u_int32_t dest_address;