All pastes #925746 Raw Edit

icmp_sock.c

public c v1 · immutable
·published 2008-03-03 07:02 UTC
rendered paste body
#include <stdio.h>#include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/ip_icmp.h>#include <netinet/ip.h>unsigned short csum (unsigned short *buf, int nwords){	unsigned long sum;	for (sum = 0; nwords > 0; nwords--)		sum += *buf++;	sum = (sum >> 16) + (sum & 0xffff);	sum += (sum >> 16);	return ~sum;}int main(int argc,char *argv[]){	int sockfd;	char datagram[400];	struct sockaddr_in dest;	struct ip *iphdr=(struct ip *) datagram;	struct icmphdr *icmphdr=(struct icmphdr *)(iphdr +1);	char *buff=(icmphdr +1);	if((sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))<0)	{		perror("socket");		exit(1);	}		memset(datagram,0,400);	strcpy(buff,"entzwei");	dest.sin_family=AF_INET;	dest.sin_addr.s_addr=inet_addr("69.55.233.87");		iphdr->ip_v=4;	iphdr->ip_hl=5;	iphdr->ip_len=sizeof(datagram);	iphdr->ip_id=htonl(54321);	iphdr->ip_off=0;	iphdr->ip_ttl=225;	iphdr->ip_p=1;	iphdr->ip_sum=0;	iphdr->ip_tos=0;	iphdr->ip_src.s_addr=inet_addr("204.2.177.42");	iphdr->ip_dst.s_addr=dest.sin_addr.s_addr;	iphdr->ip_sum=csum((unsigned short *)datagram,iphdr->ip_len >> 1);		icmphdr->type=130;	icmphdr->code=0;	icmphdr->checksum=htons(0xc3b0);	icmphdr->un.echo.sequence=0;	icmphdr->un.echo.id=0;			int one=1;		int *val=&one;		if(setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,val,sizeof(one))<0)			printf("cannot set HDRINCL!\n");		if(sendto(sockfd,datagram,35,0,(struct sockaddr *)&dest,sizeof(dest))<0)	{		perror("sendto");		exit(1);	}		return(0);}