Ejemplo n.º 1
0
int AnalyzeIpv6(u_char *data,int size)
{
u_char	*ptr;
int	lest;
struct ip6_hdr	*ip6;
int	len;

	ptr=data;
	lest=size;

	if(lest<sizeof(struct ip6_hdr)){
		fprintf(stderr,"lest(%d)<sizeof(struct ip6_hdr)\n",lest);
		return(-1);
	}
	ip6=(struct ip6_hdr *)ptr;
	ptr+=sizeof(struct ip6_hdr);
	lest-=sizeof(struct ip6_hdr);

	if(fil[5] == 1){	
	PrintIp6Header(ip6,stdout);
	}

	if(ip6->ip6_nxt==IPPROTO_ICMPV6){
		len=ntohs(ip6->ip6_plen);
		if(checkIP6DATAchecksum(ip6,ptr,len)==0){
			fprintf(stderr,"bad icmp6 checksum\n");
			return(-1);
		}
		AnalyzeIcmp6(ptr,lest);
	}
	else if(ip6->ip6_nxt==IPPROTO_TCP){
		len=ntohs(ip6->ip6_plen);
		if(checkIP6DATAchecksum(ip6,ptr,len)==0){
			fprintf(stderr,"bad tcp6 checksum\n");
			return(-1);
		}
		AnalyzeTcp(ptr,lest);
	}
	else if(ip6->ip6_nxt==IPPROTO_UDP){
		len=ntohs(ip6->ip6_plen);
		if(checkIP6DATAchecksum(ip6,ptr,len)==0){
			fprintf(stderr,"bad udp6 checksum\n");
			return(-1);
		}
		AnalyzeUdp(ptr,lest);
	}

	return(0);
}
Ejemplo n.º 2
0
int AnalyzeIpv6(u_char *data, int size) {
  u_char *ptr = NULL;
  int lest = 0;
  struct ip6_hdr *ip6 = NULL;
  int len = 0;

  ptr = data;
  lest = size;

  if (lest < sizeof(struct ip6_hdr)) {
    ExitWithTooLittleLengthError("ip6_hdr", lest);
  }

  ip6 = (struct ip6_hdr *) ptr;
  ptr += sizeof(struct ip6_hdr);
  lest += sizeof(struct ip6_hdr);

  PrintIp6Header(ip6, stdout);

  if (ip6->ip6_nxt == IPPROTO_ICMPV6) {
    len = ntohs(ip6->ip6_plen);
    if (checkIP6DATAchecksum(ip6, ptr, len) == 0) {
      ExitWithBadChecksumError("icmp6");
    }
    AnalyzeIcmp6(ptr, lest);
  }
  else if (ip6->ip6_nxt == IPPROTO_TCP) {   // next header
    len =ntohs(ip6->ip6_plen);              // payload length
    if (checkIPDATAchecksum(ip6, ptr, len) == 0) {
      ExitWithBadChecksumError("tcp6");
    }
    AnalyzeTcp(ptr, lest);
  }
  else if (ip6->ip6_nxt == IPPROTO_UDP) {
    len = ntohs(ip6->ip6_plen);
    if (checkIP6DATAchecksum(ip6, ptr, len) == 0) {
      ExitWithBadChecksumError("udp6");
    }
    AnalyzeUdp(ptr, lest);
  }

  return 0;
}
Ejemplo n.º 3
0
int AnalyzeIp(u_char *data, int size) {
  u_char *ptr = NULL;
  int lest = 0;
  struct iphdr *iphdr = NULL;   // IPヘッダ
  u_char *option = NULL;        // ヘッダオプション
  int optionLen = 0;            // ヘッダオプションサイズ
  int len = 0;
  unsigned short sum = 0;

  ptr = data;    // IPヘッダの先頭ポインタ
  lest = size;

  if (lest < sizeof(struct iphdr)) {
    ExitWithTooLittleLengthError("iphdr", lest);
  }

  iphdr = (struct iphdr *) ptr;   // IPヘッダの先頭ポインタ
  ptr += sizeof(struct iphdr);    // IPヘッダオプションの先頭ポインタ
  lest -= sizeof(struct iphdr);

  // ヘッダオプションサイズを求める(パディングを含む)
  optionLen = iphdr->ihl * 4 - sizeof(struct iphdr);

  if (optionLen > 0) {
    if (optionLen >= 1500) {
      fprintf(stderr, "IP optionLen(%d):too big\n", optionLen);
    }
    option = ptr;        // IPヘッダオプションの先頭ポインタ
    ptr += optionLen;    // ペイロードの先頭ポインタ
    lest -= optionLen;
  }

  if (checkIPchecksum(iphdr, option, optionLen) == 0) {
    ExitWithBadChecksumError("ip");
  }

  PrintIpHeader(iphdr, option, optionLen, stdout);

  if (iphdr->protocol == IPPROTO_ICMP) {
    // ペイロードサイズを取得する
    // tot_lenはペイロードを含めたIPヘッダのサイズ
    len = ntohs(iphdr->tot_len) - iphdr->ihl * 4;
    sum = checksum(ptr, len);   // ペイロードのチェックサムを取得する
    if (sum != 0 && sum != 0xFFFF) {
      ExitWithBadChecksumError("icmp");
    }
    AnalyzeIcmp(ptr, lest);
  }
  else if (iphdr->protocol == IPPROTO_TCP) {
    // ペイロードサイズを取得する
    len = ntohs(iphdr->tot_len) - iphdr->ihl * 4;
    if (checkIPDATAchecksum(iphdr, ptr, len) == 0) {
      ExitWithBadChecksumError("tcp");
    }
    AnalyzeTcp(ptr, lest);
  }
  else if (iphdr->protocol == IPPROTO_UDP) {
    struct udphdr *udphdr;
    udphdr = (struct udphdr *) ptr;
    len = ntohs(iphdr->tot_len) - iphdr->ihl * 4;
    if (udphdr->check != 0 && checkIPDATAchecksum(iphdr, ptr, len) == 0) {
      ExitWithBadChecksumError("udp");
    }
    AnalyzeUdp(ptr, lest);
  }

  return 0;
}
Ejemplo n.º 4
0
int AnalyzeIp(u_char *data,int size)
{
u_char	*ptr;
int	lest;
struct iphdr	*iphdr;
u_char	*option;
int	optionLen,len;
unsigned short  sum;

	ptr=data;
	lest=size;

	if(lest<sizeof(struct iphdr)){
		if(fil[2] == 1 || fil[3] == 1 || fil[4] == 1 || fil [6] == 1){
		fprintf(stderr,"lest(%d)<sizeof(struct iphdr)\n",lest);
		}
		return(-1);
	}
	iphdr=(struct iphdr *)ptr;
	ptr+=sizeof(struct iphdr);
	lest-=sizeof(struct iphdr);

	optionLen=iphdr->ihl*4-sizeof(struct iphdr);
	if(optionLen>0){
		if(optionLen>=1500){
			if(fil[2] == 1 || fil[3] == 1 || fil[4] == 1 || fil[6] == 1){
			fprintf(stderr,"IP optionLen(%d):too big\n",optionLen);
			}
			return(-1);
		}
		option=ptr;
		ptr+=optionLen;
		lest-=optionLen;
	}

	if(checkIPchecksum(iphdr,option,optionLen)==0){
		fprintf(stderr,"bad ip checksum\n");
		return(-1);
	}

	if(fil[6] == 1){
	PrintIpHeader(iphdr,option,optionLen,stdout);
	}

	if(iphdr->protocol==IPPROTO_ICMP){
		len=ntohs(iphdr->tot_len)-iphdr->ihl*4;
		sum=checksum(ptr,len);
		if(sum!=0&&sum!=0xFFFF){
			fprintf(stderr,"bad icmp checksum\n");
			return(-1);
		}
		AnalyzeIcmp(ptr,lest);
	}
	else if(iphdr->protocol==IPPROTO_TCP){
		len=ntohs(iphdr->tot_len)-iphdr->ihl*4;
		if(checkIPDATAchecksum(iphdr,ptr,len)==0){
			fprintf(stderr,"bad tcp checksum\n");
			return(-1);
		}
		AnalyzeTcp(ptr,lest);
	}
	else if(iphdr->protocol==IPPROTO_UDP){
		struct udphdr	*udphdr;
		udphdr=(struct udphdr *)ptr;
		len=ntohs(iphdr->tot_len)-iphdr->ihl*4;
		if(udphdr->check!=0&&checkIPDATAchecksum(iphdr,ptr,len)==0){
			fprintf(stderr,"bad udp checksum\n");
			return(-1);
		}
		AnalyzeUdp(ptr,lest);
	}

	return(0);
}