现在的位置: 首页 > 综合 > 正文

sniff网络嗅探器原理

2013年04月08日 ⁄ 综合 ⁄ 共 2273字 ⁄ 字号 评论关闭

 该文章部分内容参考自:http://topic.csdn.net/t/20011113/19/369064.html 和 MSDN。

 

[简介]
SNIFF,就是嗅探器,窃听器,它工作在网络的底层,在网络上监听数据包来获取敏感信息。
从原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,网卡内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式:

a)广播方式:该模式下的网卡能够接收网络中的广播信息。
b)组播方式:设置在该模式下的网卡能够接收组播数据。
c)直接方式:在这种模式下,只有目的网卡才能接收该数据。
d)混杂模式:在这种模式下的网卡能够接收一切通过它的数据,而不管该数据是否是传给它的。    
总结一下,首先,在以太网中是基于广播方式传送数据的,也就是说,所有的物理信号都要经过我的机器。其次,网卡可以置于一种模式叫混杂模式(promiscuous),在这种模式下工作的网卡能够接收到一切通过它的数据,而不管实际上数据的目的地址是不是他。
这就是SNIFF工作的基本原理:让网卡接收一切他所能接收的数据。    
   
[API支持]
1)int WSAIoctl(
  __in    SOCKET s,
  __in    DWORD dwIoControlCode,
  __in    LPVOID lpvInBuffer,
  __in    DWORD cbInBuffer,
  __out   LPVOID lpvOutBuffer,
  __in    DWORD cbOutBuffer,
  __out   LPDWORD lpcbBytesReturned,
  __in    LPWSAOVERLAPPED lpOverlapped,
  __in    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
它是对ioctlsocket()函数的封装,来控制socket的模式。(但是使用ioctlsocket()如何达到这个目的的具体代码,还不太会写。)

使用:

2)把WSAIoctl的参数设置为SIO_RCVALL模式,就为接收所有的网络数据包做好了第一步准备;
SIO_RCVALL (opcode setting: I, T==3)
Enables a socket to receive all IPv4 or IPv6 packets on the network.

3)socket对象的创建
An IPv4 socket that was created with the address family set to AF_INET, the socket type set to SOCK_RAW, and the protocol set to IPPROTO_IP.
The socket also must be bound to an explicit local IPv4 or IPv6 interface, which means that you cannot bind to INADDR_ANY.
就是说,socket对象的参数应该是(AF_INET, SOCK_RAW, IPPROTO_IP),然后bind到一个地址,这个地址可以随便指定端口号,但是就不能设为INADDR_ANY,这为接收所有的网络数据包做好了第二步准备。

4)要求
由于设置IOCTL以raw形式接收所有的数据需要在管理员的权限下面进行调试或者运行,所以在VC环境下调试需要一小下周折:VC启动的时候以管理员的身份启动,或者以管理员的身份运行执行程序的debug版本,然后抓进程调试。到此为止,准备步骤介绍。

 

[应用]
典型的调用过程如下:

 

[数据解析]
recv()得到buf的结构,IPv4收到的packet里面包括IP包的有效载荷(payload), 上一级协议的header和IP的header. 也就是说,recv()得到的数据包是:IP HEADER + TCP(或者UDP等IP的上层) header + data(就是一个buffer,内容无法确定)。

 

抱歉!评论已关闭.