我用“端口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
时,它也是一团糟。
为什么呢?以及如何解决?
谢谢!