Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300200
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: C/C++

2009-10-16 17:02:30

#include
#include
#include

#include
#include
#include
#include
#include
#include
#include
#include
#include

char buffer2[100];//=0x4500003cde0a400040065eaf7f0000017f000001c4d026068a9a7dd500000000a0028018f76d00000204400c0402080a00faa3df0000000001030306;



unsigned short check_sum(unsigned short *addr,int len)
{
register int nleft=len;
register int sum=0;
register short *w=addr;
   short answer=0;

while(nleft>1)
{
   sum+=*w++;   
   printf("nleft=  %d   sum = %x\n",nleft,sum);
   nleft-=2;

}
if(nleft==1)
{
   *(unsigned char *)(&answer)=*(unsigned char *)w;
   sum+=answer;
}
   printf("  sum = %x\n",sum);  
sum=(sum>>16)+(sum&0xffff);
   printf("  sum = %x\n",sum);  
sum+=(sum>>16);
   printf("  sum = %x\n",sum);  
answer=~sum;
  printf("  answer = %x\n",answer);  
return(answer);
}


void send_tcp(int sockfd,struct sockaddr_in *addr)
{
char buffer[100];   /**** 用来放置我们的数据包   ****/
struct ip *ip;
struct tcphdr *tcp;
int head_len;

/******* 我们的数据包实际上没有任何内容,所以长度就是两个结构的长度   ***/

head_len=sizeof(struct ip)+sizeof(struct tcphdr);
printf("head_len = %d   %d\n",head_len,sizeof(short));

bzero(buffer,100);

/********   填充IP数据包的头部,还记得IP的头格式吗?      ******/
ip=(struct ip *)buffer;
ip->ip_v=IPVERSION;              /** 版本一般的是 4       **/
ip->ip_hl=sizeof(struct ip)>>2; /** IP数据包的头部长度   **/
ip->ip_tos=0;                    /** 服务类型             **/
ip->ip_len=htons(head_len);      /** IP数据包的长度       **/
ip->ip_id=0;                     /** 让系统去填写吧       **/
ip->ip_off=0;                    /** 和上面一样,省点时间 **/        
ip->ip_ttl=MAXTTL;               /** 最长的时间    255     **/
ip->ip_p=IPPROTO_TCP;            /** 我们要发的是 TCP包   **/
ip->ip_sum=0;                    /** 校验和让系统去做     **/
ip->ip_dst=addr->sin_addr;       /** 我们攻击的对象       **/

/*******   开始填写TCP数据包                            *****/
tcp=(struct tcphdr *)(buffer +sizeof(struct ip));
tcp->source=htons(10000);
tcp->dest=addr->sin_port;            /** 目的端口     **/
tcp->seq=random();
tcp->ack_seq=0;
tcp->doff=5;
tcp->syn=1;                         /** 我要建立连接 **/
//tcp->ack=1;
tcp->check=0;
tcp->window=htons(32972) ;

tcp->check=htons(0x302c); //  93af

ip->ip_src.s_addr=inet_addr("192.168.0.1");

int i;
for(i=1;i<2;i++)
   {

     //ip->ip_src.s_addr=random();     
     //ip->ip_src.s_addr=inet_addr("192.168.0.1");
     //printf("ip src =  %s\n",inet_ntoa(ip->ip_src));

     //tcp->check=check_sum((unsigned short *)tcp,sizeof(struct tcphdr));
     //tcp->check=0x2e57;   
     sendto(sockfd,buffer,head_len,0,(struct sockaddr *)addr,sizeof(struct sockaddr_in));
     if(i%100==0)
     {
     tcp->source=htons(ntohs(tcp->source)+1);
     tcp->check=htons(ntohs(tcp->check)-1);
     }

     if(i==3000000)
     {
     tcp->source=htons(10000);
     tcp->check=htons(0x93af);
     }
     //sendto(sockfd,buffer2,60,0,(struct sockaddr *)addr,sizeof(struct sockaddr_in));
     //printf("new length = %d\n",strlen(buffer2));
   }
}





int main(int argc,char **argv)
{
int sockfd;
struct sockaddr_in addr;
struct hostent *host;
int on=1;

bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(25555);
addr.sin_addr.s_addr = inet_addr("192.168.0.4");
/*if(inet_aton(argv[1],&addr.sin_addr)==0)
{
         host=gethostbyname(argv[1]);
         if(host==NULL)
         {
                 //fprintf(stderr,"HostName Error:%s\n\a",hstrerror(h_errno));
                 exit(1);
         }
         addr.sin_addr=*(struct in_addr *)(host->h_addr_list[0]);
}*/

 

sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
if(sockfd<0)
{
         fprintf(stderr,"Socket Error:%s\n\a",strerror(errno));
         exit(1);
}

setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));

setuid(getpid());
send_tcp(sockfd,&addr);
}


 
阅读(1197) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~