Permalink![Calculation Calculation](/uploads/1/2/6/3/126367646/598105372.JPG)
A normal kill or Ctrl-C will successfully terminate the hung program (kill -9 not required). UDP Checksum!. Checksumming optional for senders. Set to 0x0000. To ensure data integrity, it's wise to frequently calculate file checksums. The C program in Listing 1 calculates the checksum of a file using a 16-bit CRC (cyclic redundancy check). The program assumes an 8-bit byte size. The routine reads the file as binary and processes one byte at a time.
Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Sign up Find file Copy path
seifzadehinit project, add filesfca77caFeb 7, 2016
0 contributors
/* |
Raw UDP sockets |
Silver Moon ([email protected]) |
*/ |
#include<stdio.h> //for printf |
#include<string.h> //memset |
#include<sys/socket.h> //for socket ofcourse |
#include<stdlib.h> //for exit(0); |
#include<errno.h> //For errno - the error number |
#include<netinet/udp.h> //Provides declarations for udp header |
#include<netinet/ip.h> //Provides declarations for ip header |
/* |
96 bit (12 bytes) pseudo header needed for udp header checksum calculation |
*/ |
struct pseudo_header |
{ |
u_int32_t source_address; |
u_int32_t dest_address; |
u_int8_t placeholder; |
u_int8_t protocol; |
u_int16_t udp_length; |
}; |
/* |
Generic checksum calculation function |
*/ |
unsigned short csum(unsigned short *ptr,int nbytes) |
{ |
register long sum; |
unsigned short oddbyte; |
register short answer; |
sum=0; |
while(nbytes>1) { |
sum+=*ptr++; |
nbytes-=2; |
} |
if(nbytes1) { |
oddbyte=0; |
*((u_char*)&oddbyte)=*(u_char*)ptr; |
sum+=oddbyte; |
} |
sum = (sum>>16)+(sum & 0xffff); |
sum = sum + (sum>>16); |
answer=(short)~sum; |
return(answer); |
} |
int main (void) |
{ |
//Create a raw socket of type IPPROTO |
int s = socket (AF_INET, SOCK_RAW, IPPROTO_RAW); |
if(s -1) |
{ |
//socket creation failed, may be because of non-root privileges |
perror('Failed to create raw socket'); |
exit(1); |
} |
//Datagram to represent the packet |
char datagram[4096] , source_ip[32] , *data , *pseudogram; |
//zero out the packet buffer |
memset (datagram, 0, 4096); |
//IP header |
struct iphdr *iph = (struct iphdr *) datagram; |
//UDP header |
struct udphdr *udph = (struct udphdr *) (datagram + sizeof (struct ip)); |
struct sockaddr_in sin; |
struct pseudo_header psh; |
//Data part |
data = datagram + sizeof(struct iphdr) + sizeof(struct udphdr); |
strcpy(data , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'); |
//some address resolution |
strcpy(source_ip , '192.168.1.2'); |
sin.sin_family = AF_INET; |
sin.sin_port = htons(80); |
sin.sin_addr.s_addr = inet_addr ('192.168.1.1'); |
//Fill in the IP Header |
iph->ihl = 5; |
iph->version = 4; |
iph->tos = 0; |
iph->tot_len = sizeof (struct iphdr) + sizeof (struct udphdr) + strlen(data); |
iph->id = htonl (54321); //Id of this packet |
iph->frag_off = 0; |
iph->ttl = 255; |
iph->protocol = IPPROTO_UDP; |
iph->check = 0; //Set to 0 before calculating checksum |
iph->saddr = inet_addr ( source_ip ); //Spoof the source ip address |
iph->daddr = sin.sin_addr.s_addr; |
//Ip checksum |
iph->check = csum ((unsigned short *) datagram, iph->tot_len); |
//UDP header |
udph->source = htons (6666); |
udph->dest = htons (8622); |
udph->len = htons(8 + strlen(data)); //tcp header size |
udph->check = 0; //leave checksum 0 now, filled later by pseudo header |
//Now the UDP checksum using the pseudo header |
psh.source_address = inet_addr( source_ip ); |
psh.dest_address = sin.sin_addr.s_addr; |
psh.placeholder = 0; |
psh.protocol = IPPROTO_UDP; |
psh.udp_length = htons(sizeof(struct udphdr) + strlen(data) ); |
int psize = sizeof(struct pseudo_header) + sizeof(struct udphdr) + strlen(data); |
pseudogram = malloc(psize); |
memcpy(pseudogram , (char*) &psh , sizeof (struct pseudo_header)); |
memcpy(pseudogram + sizeof(struct pseudo_header) , udph , sizeof(struct udphdr) + strlen(data)); |
udph->check = csum( (unsigned short*) pseudogram , psize); |
//loop if you want to flood :) |
//while (1) |
{ |
//Send the packet |
if (sendto (s, datagram, iph->tot_len , 0, (struct sockaddr *) &sin, sizeof (sin)) < 0) |
{ |
perror('sendto failed'); |
} |
//Data send successfully |
else |
{ |
printf ('Packet Send. Length : %d n' , iph->tot_len); |
} |
} |
return 0; |
} |
//Complete |
Copy lines Copy permalink