嗅探http数据并使用pcap存储它们时出现乱码

时间:2014-04-16 08:16:48

标签: c http tcp libpcap

我用“端口80”过滤它并开始使用pcap_loop(phandle,-1,pcap_callback,NULL);

捕获
the pcap_callback function

void pcap_callback(u_char* user,const struct pcap_pkthdr* header, const u_char* pkt_data){

   FILE *fp=fopen("1.html","a"); 

   ether_header * eheader=(ether_header*)pkt_data;

   if(eheader->ether_type==htons(ETHERTYPE_IP)){
     ip_header* ih=(ip_header*)(pkt_data+14);

    if(ih->proto==htons(TCP_PROTOCAL)){
      int ip_len=ntohs(ih->tlen);     
      int find_http=false;
      char* ip_pkt_data=(char*)ih;
      int n=0;
      char buffer[BUFFER_MAX_LENGTH];
      int bufsize=0;

      for(;n<ip_len;n++)
   {
     /* http get or post request */
     if(!find_http && ((n+3<ip_len && strncmp(ip_pkt_data+n,"GET",strlen("GET")) ==0 )
            || (n+4<ip_len && strncmp(ip_pkt_data+n,"POST",strlen("POST")) == 0)) )
      find_http = true;

    /* http response */
     if(!find_http && n+8<ip_len && strncmp(ip_pkt_data+n,"HTTP/1.1",strlen("HTTP/1.1"))==0)
      find_http = true;

  /* if http is found */
    if(find_http)
      {
        buffer[bufsize] = ip_pkt_data[n]; /* copy http data to buffer */
        bufsize ++;
      }
   }
     /* print http content */
     if(find_http) {
   buffer[bufsize] = '\0';
   printf("%s\n", buffer);
   printf("\n**********************************************\n\n");
   int i=0;
   char c;
   for(i=0;i<bufsize;i++)
    {
      c=buffer[i];
      fputc(c,fp);
    }
   fclose(fp);
      }
    }
  }
 }  

我运行它,然后访问Google.com

它只能在屏幕上打印请求/响应标题,有时会有一个或两个有线字符(四个数字(1或0)内的一个小框)。所以,我把它们存储到一个html文件中,但它仍然是一团糟。如果cat 1.html位于shell,则响应标题后的数据将是多行,其中一些显示在白色背景中并粘在一起。

如果在Emacs中打开它,它将显示类似^@^@^S\234\252的内容。如果我将它们粘贴在这里,它们会显示出差异。 我想也许它是图片或其他文件,如gif或其他课程的问题,因为我有时响应标题显示Content-Type: image/png
但是当它是Content-Type: text/html; charset=UTF-8时,它也是一团糟。

为什么呢?以及如何解决?

谢谢!

0 个答案:

没有答案