关于Sniffer抓包 显示的问题
诸位高手们 我基础不好 研究了2天了 想不出来啊 就来请教一下。
最近在用VC++6.0做一个sniffer 目的是抓出HTTP包中的referer属性的值(或者说网站的地址?) 用的是winpcap包
现在进度在 可以正常抓包,能够编译通过。但是在分析包时 加入读入或者显示数据包内容的代码时 编译通过 运行的时候提示“XXX.EXE遇到问题需要关闭…………” 相关代码如下:
//定义的tcp头部分
typedef struct tcp_header{
u_short sport; //TCP源端口号(16位)
u_short dport; //TCP目的端口号(16位)
u_int seriesno; //序列号(32位)
u_int comfirmno; //确认号(32位)
u_short hl_retain; //首部长度(4位) 保留位(6位)+URG ACK PSH RST SYN FIN
u_short winsize; //窗口大小(16位)
u_short effect; //效验和(16位)
u_short urg; //紧急指针(16位)
u_char data[1500]; //数据包内容
}tcp_header;
main()
{
//捕捉网卡
//打开网卡
…………
//开始获取数据
pcap_loop(adhandle, 0, packet_handler, NULL);
return 0;
}
/* 对每一个到来的数据包调用该函数 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
……
/* 获得IP数据包头部的位置 */
ih = (ip_header *) (pkt_data +14); //以太网头部长度
ip_len = (ih->ver_ihl & 0xf) * 4;
th=(tcp_header *) ((u_char*)ih+ip_len); //tcp包头位置
u_int changdu=header->len;
for(int i=0;i<changdu;i++)
{
printf("%s ",th->data[i]);
}
}
后来试了下 发现只要输出的是%S型的就一定程序错误需要关闭 如果是%d%C%X都可以正常输出~~ 搞不懂了……
想不显示 用strstr()直接找到referer属性 也和输出%s型的时候一样出现程序错误 需要关闭…………
谁来指点一下啊 感激不尽