关于Sniffer抓包 显示的问题

imlaohe 2008-04-12 08:53:36
诸位高手们 我基础不好 研究了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型的时候一样出现程序错误 需要关闭…………

谁来指点一下啊 感激不尽
...全文
219 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gameloader 2008-04-14
  • 打赏
  • 举报
回复
第一、header->len,header是tcp head么?
因为tcp数据段的长度可以通过ip头中的总长度减去tcp 头的长度获取,也可以通过tcp头里面的长度取得。
问这个的意思就是说你首先别把长度计算错了。
第二、strstr函数的执行前提是你的数据为一个字符串,而字符串的结束标志是'\0',如果你的th->data不是字符串你怎么办?所以这样做是不行的。
第三、th->data[i]是字符,不是字符串,所以用%s是不对的,%d,%c,%x才可以。
imlaohe 2008-04-14
  • 打赏
  • 举报
回复
已经发给你了 麻烦了
gameloader 2008-04-14
  • 打赏
  • 举报
回复
不需要申请控件,pcap返回的数据已经申请过空间了,你只需按照结构体的定义强制转换一下就可以,就是说你的做法是没有错的。
但是即使你把data的定义变为const,如果想输出一个字符串,也不应该放在一个for循环里面啊。

如果你需要把收到的数据打印出来,那么用%x应该好理解啊,一个字节一个字节的看就是了,就像著名的sniffer工具都是这样的。

如果实在不行,你把工程发给我,我调调看,gameloader@126.com
imlaohe 2008-04-14
  • 打赏
  • 举报
回复
还有1点 有点想不通


/* 对每一个到来的数据包调用该函数 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{

struct tm *ltime;
……

这个回调函数上的const u_char *pkt_data本应是存放捕获包的内容的 现在里面竟然是空的…………
imlaohe 2008-04-14
  • 打赏
  • 举报
回复
想了下 貌似应该是 只是声明了一个结构体,没有申请空间,只有在实例化对象后才获得空间造成的问题???

解决办法…………
imlaohe 2008-04-14
  • 打赏
  • 举报
回复
总算有人回了 哈哈
header->len是IP head 不是tcp head 也就是这个包的总长

th->data[i]是字符 定义的是u_char data[1500]; //数据包内容

但是我把它换成CString data 也是不行的 还有其他的办法定义这个字符串么?

如果我在u_char data[1500] 前面加上const 成为const u_char data[1500]的话是可以用%s输出的

希望有更多的人来帮下忙~~

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧