首页
社区
课程
招聘
[求助][已解决]诡异--raw socket抓不到发出去的数据包
发表于: 2012-5-29 14:26 16977

[求助][已解决]诡异--raw socket抓不到发出去的数据包

2012-5-29 14:26
16977
使用rawsocket的抓包功能,分析TCP数据包,使用的代码如下:

	sckRaw = ::socket(AF_INET, SOCK_RAW,  htons(IPPROTO_IP)); 
	if(INVALID_SOCKET == sckRaw) 
	{ 
		PrintToDebugView(LOG_INFO,"socket error(%d)",GetLastError());
		return FALSE;
	} 

	SOCKADDR_IN sa;
	sa.sin_family = AF_INET; 
	memcpy( &sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length); 
	sa.sin_port = htons(0); 

	nRet = ::bind(sckRaw,(PSOCKADDR)&sa, sizeof(sa)); 
	if(SOCKET_ERROR == nRet) 
	{ 
		PrintToDebugView(LOG_INFO,"bind error(%d)",GetLastError()); 
		closesocket(sckRaw);
		return FALSE; 
	}

	DWORD dwValue = 1;  //dwValue=1 启动
	nRet = ioctlsocket(sckRaw,SIO_RCVALL,&dwValue);  //dwValue=1 启动
	if(SOCKET_ERROR == nRet) 
	{ 
		PrintToDebugView(LOG_INFO,"ioctlsocket error(%d)",GetLastError()); 
		closesocket(sckRaw);
		return FALSE;
	}

	m_hRevThread = (HANDLE)_beginthreadex(NULL, 0, threadRevCallBack, NULL, 0, NULL);


在很多机器上测试都没问题,能抓到发送和接收的数据包。



但是唯独一台机器上只有接收到的数据包,自己发送的数据包一个没有。。。


百度了下发现很多人遇到过这个情况但是都没有一个很好的回答,看各位有什么检验之谈给点建议。

微软的解释是跟系统防火墙等有关,个人理解是rawsocket属于IP层微软自己的东西,所以跟网卡的类型或者模式关系不大(我不做局域网sniffer,只是抓自己的包),郁闷,发帖,求助,感激不尽。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 63
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你看看是不是开了防火墙了,防火墙会影响Raw Socket的收发包,关了防火墙或添加规则放行试试
2012-5-29 14:36
0
雪    币: 98
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
查完MSDN的资料之后第一时间检查过防火墙,关闭了没有启动。

谢谢您的建议。
2012-5-29 14:38
0
雪    币: 185
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
http://msdn.microsoft.com/en-us/library/windows/desktop/ee309610%28v=vs.85%29.aspx

On Windows Server 2008 and earlier, the SIO_RCVALL IOCTL setting would not capture local packets sent out of a network interface. This included packets received on another interface and forwarded out the network interface specified for the SIO_RCVALL IOCTL.

On Windows 7 and Windows Server 2008 R2 , this was changed so that local packets sent out of a network interface are also captured. This includes packets received on another interface and then forwarded out the network interface bound to the socket with SIO_RCVALL IOCTL.
2012-5-29 15:14
0
雪    币: 98
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不知道这个MSDN的这个解释是什么意思。。。你看我的帖子,发送与接收的数据包都是可以抓到的。不过还是感谢你的建议。

刚才一朋友告诉我了,可能是因为TCP包的校验和的问题,一会测试下就知道了。

链接:http://blog.csdn.net/wzsy/article/details/4801822
2012-5-29 15:31
0
雪    币: 364
活跃值: (91)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
是不是你的XP版本问题   版本高了 是不支持rawsocket的
2012-5-29 18:02
0
雪    币: 364
活跃值: (91)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
XPsp2 禁用了rawsocket
2012-5-29 18:04
0
雪    币: 98
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢坛子里热心朋友的支持,这个问题在朋友帮助下成功解决了。

首先是那台出问题的机器,XP+SP3,跟其他正常的机器在同一网络里。
我远程连接过去的,我的IP:192.168.0.150,问题机器IP:192.168.0.105,IP差不多可能看起来不明显,望各位看官见谅。机器只能截取到接收到的数据,发送的数据一条没有。


首先给大家看一个图:

本地连接-属性-配置-高级里的,大家应该都见过这里,默认是Rx & Tx开启。

后来看到帖子http://blog.csdn.net/wzsy/article/details/4801822,用wireshark抓包看了下,如图:


红色的是有问题的数据包,看下面的问题原因,各位看官明了了,是校验和。

根据我的理解解释为:网卡本身具有Tx(发送)和Rx(接收)自动设置校验和的功能,默认为开启,这样子系统可以把这一部分的运算直接交给网卡处理来节省系统资源,而rawsocket属于socket的一种,发送的数据包由于系统偷懒没有计算校验和所以没有被socket承认为合法的数据包抛弃了,然后我们这里的代码就没有处理到这些包;而接受到的包是远程机器发来,经过本地网卡处理后的数据包,只要是正常的包肯定校验和是正确的,所以被我们的代码截取到了。

到这里一切都明了了,我把网卡的硬件校验和模式改成Rx(接收,括号里的内容为LZ的注释)开启,就是说关闭了Tx(发送),系统被逼着自己去计算填充校验和,于是在socket层这一层面(原谅LZ不是网络专业的,不知道这层的真正名字)发送的数据包合法了,于是我们的代码成功截取到了。如图:


到此问题已经完美解决,感谢看雪论坛,感谢国家,感谢人民和支持我的同学们。
上传的附件:
2012-5-29 20:13
0
雪    币: 98
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
出了问题不要相信流言,要自己测试实验才知道结果。  MSDN上误导群众的地方太多了。。。
2012-5-29 20:17
0
雪    币: 538
活跃值: (259)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
楼主 要先感谢国家~~~
2012-5-30 14:01
0
游客
登录 | 注册 方可回帖
返回
//