一个小型的嗅探器,它使用 WSA 套接字(Windows 套接字)






4.82/5 (16投票s)
2007年11月5日
3分钟阅读

123206

6704
演示如何通过将套接字置于混杂模式来拦截网络流量(IP 数据包)

引言
许多人曾经使用过嗅探器。 什么是嗅探器? 嗅探器是一种应用程序,可以捕获来自或发送到连接到网络的计算机的所有网络流量。 基本上,嗅探器真正做的是通过将网络接口置于混杂模式状态来关注所有流量。 混杂模式将选定的网络接口设置为侦听通过它的所有数据包。
本文演示了应用程序如何配置套接字连接以关注所有网络数据包,而不仅仅是那些寻址到它的数据包。 它展示了如何抓取由 IP(互联网协议:网络层协议)封装的协议,特别是 TCP 和 ICMP。 IP 最多封装 100 种不同的协议。 我建议您查看 RFC 1700,其中包含 IP 封装的所有协议的完整列表。
让我们开始嗅探
演示项目包含一个名为 lsniff.exe 的单个可执行文件,这是一个控制台应用程序。 语法是
lsniff [TCP|ICMP]

图 1:lsniff 仅抓取 ICMP 数据包的示例
您还可以将输出重定向到文件:lsniff icmp >output.txt
理解源代码
lsniff
是一个使用 Visual Studio 2005 编写的 C/C++ 应用程序。 它也可以在较旧的编译器中编译。 它非常简单。 实际上,困难的部分是分析数据包,因为您必须知道取决于协议的数据包结构。 Windows Socket API (WSA) 提供了创建简单嗅探器的工具(函数)。
值得一提的是,只有以管理员权限登录时,lsniff
才能运行。 通过阅读 lsniff_main.cpp,我们将看到在混杂模式状态下开始工作的 4 个必要步骤
-
初始化 Windows Sockets (第 107 行)。
-
获取一个 RAW 套接字 (第 111 行)。 RAW 是一种特殊的套接字,它允许您访问数据包头,而不仅仅是数据。
sniff_socket = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
-
将套接字绑定到您要嗅探的接口 (第 119-127 行)。
-
将套接字设置为混杂模式 (第 135 行)。
if ( WSAIoctl( sniff_socket, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwLen, NULL, NULL ) == SOCKET_ERROR ) { printf( "Error: WSAIoctl = %ld\n", WSAGetLastError() ); exit(-3); }
在成功执行所有这 4 个步骤之后,就可以开始读取数据包了。 请注意,您应该提供一个足够大的缓冲区 (LS_MAX_PACKET_SIZE
) 给 recv
函数。 读取数据包后进行的第一个检查是 IP 版本 (第 161 行)
if ( LS_HI_PART(ip_header->ver_ihl) != 4 )
continue;
lsniff
仅解析 IPv4 数据包,而不解析 IPv6。 此外,解析 IP 标头以了解封装了什么协议。 请注意,lsniff
不关心数据包数据,只关心数据包头。 代码的其余部分取决于您对要解析的协议的了解。 当然,您可以通过添加更多协议解析例程来扩展 lsniff
。 最好使用专业的嗅探器(如 Ethereal)来帮助您解析数据包

图 2:解析数据包
享受。 希望这有帮助。
历史
- 2007 年 11 月 5 日:第一个版本