0

疑似tcpヘッダー、tcpヘッダー、およびtcpデータを使用して適切なデータ構造を構築し、チェックサム関数に送信して検証しようとしています。コードで何が間違っているのか理解できません。次のコードは、データ構造を構築し、それを別の関数に送信してチェックする関数です。

void print_inner_ip_header(const u_char* pkt_data, struct ip_header* header)
{
   switch(header->protocol)
   {
      case(ICMP):
      {
         print_icmp_header((struct icmp_header*)(pkt_data+ETHERNET_HEADER_SIZE+sizeof(struct ip_header)));
         break;
      }
      case(TCP):
      {
         struct pseudo_tcp_header ps_tcp_header;
         ps_tcp_header.source = header->source;
         ps_tcp_header.protocol = 6;
         ps_tcp_header.dest = header->dest;
         ps_tcp_header.reserved = 0;
         ps_tcp_header.tcp_size = htons(sizeof(struct tcp_header) + header->total_length - (header->length & 0x0F)*4);

         int len = sizeof(struct pseudo_tcp_header) + ps_tcp_header.tcp_size;
         u_short ps_tcp[len];

         memcpy(ps_tcp, &ps_tcp_header, sizeof(struct pseudo_tcp_header));
         memcpy(ps_tcp+sizeof(struct pseudo_tcp_header), (pkt_data+ETHERNET_HEADER_SIZE+sizeof(struct ip_header)), ps_tcp_header.tcp_size);

         print_tcp_header(pkt_data, (struct tcp_header*)(pkt_data+ETHERNET_HEADER_SIZE+sizeof(struct ip_header)), ps_tcp, len);
         break;
      }
      case(UDP):
      {
         print_udp_header((struct udp_header*)(pkt_data+ETHERNET_HEADER_SIZE+sizeof(struct ip_header)));
         break;
      }
      default:
      {
         break;
      }
   }
}


void print_tcp_header(const u_char* pkt_data, const struct tcp_header* header, u_short* ps_tcp, int len)
{
   u_short checksum = header->checksum;
   int check = in_cksum((unsigned short *)ps_tcp, len);
   char* checksum_str = "Correct";

   printf("CHECK VALUE: %d", check);
   if(check)
   {
      checksum_str = "Incorrect";
   }

   printf("\n\tTCP Header");
   printf("\n\t\tSource Port: %d", ntohs(header->source_port));
   printf("\n\t\tDestination Port: %d", ntohs(header->dest_port));
   printf("\n\t\tSequence Number: %u", ntohl(header->seq_num));
   printf("\n\t\tACK Number: %u", ntohl(header->ack_num));
   print_tcp_header_flags(header->flags);
   printf("\n\t\tWindow Size: %d", ntohs(header->win_size));
    printf("\n\t\tChecksum: %s (%#x)\n", checksum_str, ntohs(checksum));
}

私は自分が間違っていることを理解しようと何時間も費やしてきたので、どんな助けもいただければ幸いです。

ありがとう、

編集:これが私の疑似ヘッダーです

struct pseudo_tcp_header
{
   struct in_addr source, dest;
   u_char reserved;
   u_char protocol;
   u_short tcp_size;
};
4

1 に答える 1

1

私が見ることができる最も基本的な問題は、次の組み合わせです。

     u_short ps_tcp[len];

     memcpy(ps_tcp+sizeof(struct pseudo_tcp_header), ...);

に追加すると、バイトではなく、ps_tcpの単位が追加されます。sizeof(u_short)

于 2010-10-02T13:57:11.243 に答える