⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ip.c

📁 该程序类似于tcpdump软件
💻 C
字号:
/**************************************************************************** 
** File: ip.c
**
** Author: Mike Borella
**
** Comments: Dump IP header information
**
*****************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "config.h"
#include "ip.h"
#include "esp.h"
#include "ah.h"
#include "icmp.h"
#include "tcp.h"
#include "udp.h"

extern struct arg_t *my_args;

/*----------------------------------------------------------------------------
**
** in_cksum.c
**
** Do IP checksum
**
**----------------------------------------------------------------------------
*/

u_int16_t in_cksum(u_int16_t *addr, int len) 
{ 
  int nleft = len; 
  u_int16_t *w = addr; 
  u_int32_t sum = 0; 
  u_int16_t answer = 0; 
     
  /* 
   * Our algorithm is simple, using a 32 bit accumulator (sum), we add 
   * sequential 16 bit words to it, and at the end, fold back all the 
   * carry bits from the top 16 bits into the lower 16 bits. 
   */ 
  while (nleft > 1)  
    { 
      sum += *w++; 
      nleft -= 2; 
    } 
     
  /* 
   * mop up an odd byte, if necessary 
   */ 
   
  if (nleft == 1) 
    { 
      *(u_int8_t *)(&answer) = *(u_int8_t *)w ; 
      sum += answer; 
    } 
     
    /* 
     * add back carry outs from top 16 bits to low 16 bits 
     */ 
   
  sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ 
  sum += (sum >> 16);         /* add carry */ 
  answer = ~sum;              /* truncate to 16 bits */ 
  return(answer); 
} 

/*----------------------------------------------------------------------------
**
** dump_ip()
**
** Parse IP header and dump fields
**
**----------------------------------------------------------------------------
*/

void dump_ip(const u_char *bp, int length)
{
  IPHdr *ip, ip2;
  u_int hlen, len, off;
  u_char *cp = NULL;
  u_int frag_off;
  u_char tos;
  u_int16_t csum;
  u_int16_t my_csum;

  /*
   * Dump header announcement
   */

  printf("-----------------------------------------------------------------\n");
  printf("                        IP Header\n");
  printf("-----------------------------------------------------------------\n");

  /*
   * View the packet as an IP header
   */

  ip = (IPHdr *) bp;

  /*
   * Check for truncated header and truncated packet
   */
  
  if (length < sizeof(IPHdr))
    {
      printf("Truncated header, length = %d bytes\n", length);
      return;
    }

  len = ntohs(ip->ip_len);
  if (length < len)
    {
      printf("Truncated packet: length field = %d, actual length = %d\n", 
	     len, length);
      return;
    }

  /*
   * Dump header fields
   */
  
  csum = ntohs(ip->ip_csum);
  hlen = ip->ip_hl*4;

  if (!my_args->n)
    {
      /* Don't print anything except src and dst addresses in minmal mode */
      if (!my_args->m)
	{
	  printf("Version:                %d\n", ip->ip_v);
	  printf("Header length:          %d\n", hlen);
	  
	  tos = ip->ip_tos;
	  printf("Type of service:        %d", tos);
	  printf(" (precedence=%d, D=%d, T=%d, R=%d, U=%d)\n",
		 tos >> 5, (tos & 0x10) >> 4, (tos & 0x08) >> 3,
		 (tos & 0x04) >> 2, tos & 0x03);
	  
	  printf("Total length:           %d\n", ntohs(ip->ip_len));
	  printf("Identification #:       %d\n", ntohs(ip->ip_id));
	  
	  frag_off = ntohs(ip->ip_off);
	  printf("Fragmentation offset:   %d", (frag_off & 0x1fff) * 8);
	  frag_off &= 0xe000;
	  printf(" (U=%d, DF=%d, MF=%d)\n", (frag_off & 0x8000) >> 15, 
		 (frag_off & 0x4000) >> 14, (frag_off & 0x2000) >> 13);
	  
	  printf("Time to live:           %d\n", ip->ip_ttl);
	  printf("Protocol:               %d\n", ip->ip_p);
	  
	  printf("Header checksum:        %d ", csum);
	  memcpy((void *) &ip2, (void *) ip, sizeof(IPHdr));
	  ip2.ip_csum = 0;
	  my_csum = ntohs(in_cksum((u_int16_t *) &ip2, sizeof(IPHdr)));
	  if (my_csum != csum) printf("(error: should be %d)", my_csum);
	  printf("\n");
	}
      
      printf("Source address          %s\n", inet_ntoa(ip->ip_src));
      printf("Destination address     %s\n", inet_ntoa(ip->ip_dst));
    }


  /*
   * If this is fragment zero, hand it to the next higher
   * level protocol.
   */

  len -= hlen;
  off = ntohs(ip->ip_off);
  if ((off & 0x1fff) == 0) 
    {
      cp = (u_char *) ip + hlen;
      switch (ip->ip_p) 
	{
	case TCP_NEXT_HEADER:
	  dump_tcp(cp, len);
	  break;
       
	case UDP_NEXT_HEADER:
	  dump_udp(cp, len);
	  break;
	  
	case ICMP_NEXT_HEADER:
	  dump_icmp(cp);
	  break; 
	
	case IP_NEXT_HEADER:
	  dump_ip(cp, len);
	  break; 
	  
	case ESP_NEXT_HEADER:
	  dump_esp(cp, len);
	  break;

	case AH_NEXT_HEADER:
	  dump_ah(cp, len);
	  break;

	default:
	  break;
	}
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -