1、传统的sniffer技术是被动地监听网络通信、用户名和口令。而新的sniffer技术出现了主动地控制通信数据的特点,把sniffer技术扩展到了一个新的领域。Sniffer技术除了目前在传统的网络侦测管理外,也开始被应用在资讯保全的领域。可以这样说,sniffer技术是一把双刃剑,如何更好的利用它,了解它的一些特性,将能使这项技术更好的为我们带来便利。sniffer的编程方法比较通用的有以下几种,1.winpcap 这是一个比较通用的库,相信做过抓包的工具大多数人都不会太陌生2.raw socket 在2000以后的版本都支持此项功能,2000 server有个网络监视器就是基于raw soc
2、ket3.tdi,ndis,spi,hook socket技术,这种技术比较大的不同是可以将包截取而不是仅仅获得包的一份拷贝。总的说来,一般以前两者居多。一)winpcap驱动简介 winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能: 1 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报; 2 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉; 3 在网络上发送原始的数据报; 4 收集网
3、络通信过程中的统计信息。winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。因此,它不能用于QoS调度程序或个人防火墙。Raw Socket(原始套接字)实现Sniffer(嗅探)一. 摘要 Raw Socket: 原始套接字 可以用它来发送和接收 IP 层以上的原始数据包, 如 ICMP, TCP, UDP. int sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); 这样我们就创建了一个 Raw Sock
4、et Sniffer: 嗅探器 关于嗅探器的原理我想大多数人可能都知道 1. 把网卡置于混杂模式; 2. 捕获数据包; 3. 分析数据包. 但具体的实现知道的人恐怕就不是那么多了. 好, 现在让我们用 Raw Socket 的做一个自已的 Sniffer.二. 把网卡置于混杂模式 在正常的情况下,一个网络接口应该只响应两种数据帧: 一种是与自己硬件地址相匹配的数据帧 一种是发向所有机器的广播数据帧 如果要网卡接收所有通过它的数据, 而不管是不是发给它的, 那么必须把网卡置于混杂模式. 也就是说让它的思维混乱, 不按正常的方式工作. 用 Raw Socket 实现代码如下: setsockopt
5、(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag); /设置 IP 头操作选项 bind(sockRaw, (PSOCKADDR)&addrLocal, sizeof(addrLocal); /把 sockRaw 绑定到本地网卡上 ioctlsocket(sockRaw, SIO_RCVALL, &dwValue); /让 sockRaw 接受所有的数据 flag 标志是用来设置 IP 头操作的, 也就是说要亲自处理 IP 头: bool flag = ture; addrLocal 为本地地址: SOCKADDR_IN addr
6、Local; dwValue 为输入输出参数, 为 1 时执行, 0 时取消: DWORD dwValue = 1; 没想到这么简单吧?三. 捕获数据包 你的 sockRaw 现在已经在工作了, 可以在局域网内其它的电脑上用 Sniffer 检测工具检测一下, 看你的网卡是否处于混杂模式(比如 DigitalBrain 的 ARPKiller). 不能让他白白的浪费资源啊, 抓包! recv(sockRaw, RecvBuf, BUFFER_SIZE, 0); /接受任意数据包 #define BUFFER_SIZE 65535 char RecvBufBUFFER_SIZE; 越来越发现 S
7、niffer 原来如此的简单了, 这么一个函数就已经完成抓取数据包的任务了.四. 分析数据包 这回抓来的包和平常用 Socket 接受的包可就不是一回事儿了, 里面包含 IP, TCP 等原始信息. 要分析它首先得知道这些结构. 数据包的总体结构: - | ip header | tcp header(or x header) | data | IP header structure: 4 8 16 32 bit |-|-|-|-| | Ver | IHL |Type of service | Total length | | Identification | Flags | Fragment
8、 offset | Time to live Protocol Header checksum Source address Destination address Option + Padding Data TCP header structure: |-|-| Source port Destination port Sequence number Acknowledgement number | Offset | Resrvd |U|A|P|R|S|F| Window Checksum Urgent pointer五. 实现 Sniffer OK! 现在都清楚了, 还等什么. 下面是我用 BCB6 写的一个 Simple Sniffer 的代码, 仅供参考. (需要在工程文件里加入WS2_32.LIB这个文件)/*/* CPP File: WMain.cpp/* Simple Sniffer by shadowstar/*#include #pragma hdrstopwinsock2.hws2tcpip.hmstcpip.hnetmon.h#include WMain.h/-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1