本机发起TCP连接,发出一个SYN包,对方发回来一个SYN|ACK包,我把这个包DROP掉,尝试自己来构造这个三次握手的最后一个ACK包发出去。
 
linux下的程序,不过libnet在linux和windows都一样的吧
用libipq已经把对方发过来的SYN包传到用户空间,自己定义了个结构体 
struct packet 

  iphdr *iph; 
  tcphdr *tcph; 
  unsigned char *data; 
}; 
然后搞个struct packet *pkt指过去 
已经正确地把这里的IP头和TCP头指针指到对应的地方,然后ipq_set_verdict把它drop了,再开始构造TCP包(pkt就是对方发过来的被drop的SYN|ACK包 
,构造这个回应包,源和目的反过来,这没问题,pkt的ACK就是回应包的SEQ,pkt的SEQ+1就是回应包的ACK,SYN标志要占1个位,也没问题,其他参数也都没问题) 
printf("\nbuilding tcp src=%u dst=%u\n",ntohs(pkt->tcph->dest),ntohs(pkt->tcph->source)); 
if((tcp=libnet_build_tcp(ntohs(pkt->tcph->dest),ntohs(pkt->tcph->source),pkt->tcph->ack_seq,htonl(ntohl(pkt->tcph->seq)+1),TH_ACK,8760,0,0,LIBNET_TCP_H,NULL,0,plibnet_app,0))==-1) 

  printf("\ntcp building error\n"); 
…… 
下面继续构造IP包…… 
神奇的事发生了: 
程序中那句printf的输出是 
building tcp src=2284 dst=1647 
而tcpdump对应包的输出是 
IP 192.168.18.98.1024 > 192.168.18.2.1647: . ack 3386779883 win 8760 
上一句打印源端口还是正确的,传进去构造包,结果发出去源端口就成了1024。而目的端口和源IP目的IP都没问题…… 
怎么回事?