Exemplo n.º 1
0
void sentArbitratyPacketToNetwork_UDP (struct ethhdr* ethernetHeader, struct iphdr* ipheader, struct udphdr *udpheader,char* interface, int totalPacket, int bufferSize, unsigned char *message) {
  /* Socket descriptor */
  int raw, pkt_len ;
  unsigned char *computeHeader;
//  unsigned char *data = message;
  /* Buffer to hold the packet */
  unsigned char *packet ;

  /* Create the raw socket */
  raw = rawSocket(ETH_P_ALL);

  /* Bind raw socket to interface */
  bindSocket_Interface (interface, raw, PROTOCOL_TO_FOLLOW) ;

  /* Create PseudoHeader and compute UDP Checksum  */
  computeHeader = CreatePseudoHeaderAndComputeUDPChecksum(udpheader, ipheader, message, bufferSize);

  /* Packet length = ETH + IP header + UDP header + Data*/
  pkt_len = sizeof(struct ethhdr) + ntohs(ipheader->tot_len);
  printf ( "\n\n%d \n\n",pkt_len ) ;

  printf ( "msg =%s" , message ) ;
  /* Allocate memory */
  packet = (unsigned char *)malloc(pkt_len);

  /* Copy the Ethernet header first */
  memcpy(packet, (unsigned char *)ethernetHeader, sizeof(struct ethhdr));

  /* Copy the IP header -- but after the ethernet header */
  memcpy((packet + sizeof(struct ethhdr)), (unsigned char *)ipheader, ipheader->ihl*4);

  /* Copy the TCP header after the IP header */
  memcpy((packet + sizeof(struct ethhdr) + ipheader->ihl*4),(unsigned char *)udpheader, ntohs(udpheader->len));
	
  /* Copy the Data after the UDP header */
  memcpy((packet + sizeof(struct ethhdr) + ipheader->ihl*4 + ntohs(udpheader->len)), message, bufferSize);

  /* Inject all the packet to the network */
  while ( totalPacket -- ) {

    /* Send the packet - Checks whether sending is successful or not */
    if ( ! injectPacket (raw, packet, pkt_len) ) 
      perror("Error sending packet");
    else  printf("Packet sent successfully\n");
  }

  free(ethernetHeader);
  free(ipheader);
  free(udpheader);
  free(message);
  free(packet);
  free (computeHeader);

  /* Close the socket */
  close(raw);
  return ;
}
Exemplo n.º 2
0
int main(int argc,char **argv)
{
    if(argc!=2)
    {
        perror("please echo like this:   ./mypack eth0\n");
        exit(1);
    }
 
    int sock;
    struct sockaddr_ll rcvaddr;
    char buf[6666];
    struct ifreq ifr;
    int len;

    sock=rawSocket();
    setPromisc(argv[1],&sock);
    len=sizeof(struct sockaddr);
    memset(buf,0,sizeof(buf));

	FILE *fi;
	fi=fopen("/tmp/a.cap","ab+");
	if(fi == NULL)
	{
		printf("open /tmp/a.cap failed!!\n");
	}

	//char head[] = "0xD4C3B2A1020004000000000000000000FFFF000001000000";
	//fprintf(fi,"D4C3B2A1020004000000000000000000FFFF000001000000");   //this is ascii,so wrong!!!

	/*******pcap header*******/
	struct pcap_file_header *fh;
	struct pcap_file_header p_f_h;
	p_f_h.magic = 0xA1B2C3D4;
	p_f_h.version_major = 0x0002;
	p_f_h.version_minor = 0x0004;
	p_f_h.thiszone = 0x00000000;
	p_f_h.sigfigs = 0x00000000;
	p_f_h.snaplen = 0x0000FFFF;
	p_f_h.linktype = 0X00000001;
	fh = &p_f_h;
//	memcpy(buf,fh,sizeof(p_f_h));
//	fprintf(fi,"%s",buf);     //buf is start in ethernet!!!  so  wrong!!!
	fwrite(fh,sizeof(p_f_h),1,fi);
	fclose(fi);

    while(1)
    {
	    int rval;      //the unit is byte!!!  so multiple 256
        rval=recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr*)&rcvaddr,&len);
        if(rval>0)
        {
//          printf("Get %d bytes\n",rval);
			FILE *f;
			f=fopen("/tmp/a.cap","ab+");
			if(f==NULL)
			{
				printf("open /tmp/a.cap failed!!!\n");
			}

   			/*************packet header*********/
			#if 0   //this is manual write time code
   	 	    int time[2]={0x500E4204,0x0000D1EF};
   		    int (*tim)[2];
   			tim=&time;
            fwrite(tim,8,1,f);
			#endif

			#if 1
//			struct pcap_pkthdr *pCap;
//			int now_sec;
//			int time_change = 0;
//			int last_sec = 0;

			struct timeval tv;
//			struct timezone tz;   //usually dont need tz
			gettimeofday(&tv,NULL);
			fwrite(&(tv.tv_sec),4,1,f);
			fwrite(&(tv.tv_usec),4,1,f);

//			printf("%x\n",tv.tv_usec);

/*			//may be wrong in data type,cant assignment
			printf("%d\n",tv.tv_sec);
			pCap->ts.tv_sec = tv.tv_sec;
			pCap->ts.tv_usec = tv.tv_usec;
			printf("%d\n",tv.tv_sec);
			printf("%d\n",tv.tv_usec);
			fwrite(pCap,8,1,f);
*/
			#endif

		    int b,c,d;
			int *bp;	
			b = rval*256;           //cause rval is the bytes of recvfrom()
//			printf("%x\n",b);
			/****switch the position*****/
			if(b<0x00010000)
			{
				#if 0
				c = (b>>16)&Mask;
				d = (b<<16)&(~Mask);
				b = c|d;
				#endif
	
				#if 1
				c = (b&FTWO)>>8;
				d = (b&FONE)<<8;
				b = c|d;
				#endif
			}
			else
			{