sniffer技术原理及应用,包括编程方法和工具使用
2007-08-25 12:46:07| 分类: 网络|字号 订阅
sniffer中文翻译过来就是嗅探器,在当前网络技术中使用得非常得广泛。sniffer既可以做为网络故
障的诊断工具,也可以作为黑客嗅探和监听的工具。最近两年,网络监听(sniffer)技术出现了新的
重要特征。传统的sniffer技术是被动地监听网络通信、用户名和口令。而新的sniffer技术出现了主
动地控制通信数据的特点,把sniffer技术扩展到了一个新的领域。Sniffer 技术除了目前在传统的
网络侦测管理外,也开始被应用在资讯保全的领域。可以这样说,sniffer技术是一把双刃剑,如何
更好的利用它,了解它的一些特性,将能使这项技术更好的为我们带来便利。 sniffer的编程方法比较通用的有以下几种,
1.winpcap 这是一个比较通用的库,相信做过抓包的工具大多数人都不会太陌生 2.raw socket 在2000以后的版本都支持此项功能,2000 server有个网络监视器就是基于raw socket
3.tdi,ndis,spi,hook socket技术,这种技术比较大的不同是可以将包截取而不是仅仅获得包的一份拷贝。总的说来,一般以前两者居多。
一)winpcap驱动简介
winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开
发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项
功能:
1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
3> 在网络上发送原始的数据报; 4> 收集网络通信过程中的统计信息。
winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。也就是说,winp
cap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。因此,它不能用于QoS调度程序或个人防火墙。
Raw Socket(原始套接字)实现Sniffer(嗅探) 一. 摘要
Raw Socket: 原始套接字
可以用它来发送和接收 IP 层以上的原始数据包, 如 ICMP, TCP, UDP... int sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); 这样我们就创建了一个 Raw Socket Sniffer: 嗅探器
关于嗅探器的原理我想大多数人可能都知道 1. 把网卡置于混杂模式; 2. 捕获数据包; 3. 分析数据包.
但具体的实现知道的人恐怕就不是那么多了. 好, 现在让我们用 Raw Socket 的做一个自已的 Sniffer.
二. 把网卡置于混杂模式
在正常的情况下,一个网络接口应该只响应两种数据帧: 一种是与自己硬件地址相匹配的数据帧 一种是发向所有机器的广播数据帧
如果要网卡接收所有通过它的数据, 而不管是不是发给它的, 那么必须把网卡置于混杂模式. 也就是说让它的思维混乱, 不按正常的方式工作. 用 Raw Socket 实现代码如下:
setsockopt(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 addrLocal;
dwValue 为输入输出参数, 为 1 时执行, 0 时取消: DWORD dwValue = 1; 没想到这么简单吧? 三. 捕获数据包
你的 sockRaw 现在已经在工作了, 可以在局域网内其它的电脑上用 Sniffer 检测工具检测一下, 看你的网卡是否处于混杂模式(比如 DigitalBrain 的 ARPKiller).
不能让他白白的浪费资源啊, 抓包!
recv(sockRaw, RecvBuf, BUFFER_SIZE, 0); //接受任意数据包 #define BUFFER_SIZE 65535 char RecvBuf[BUFFER_SIZE];
越来越发现 Sniffer 原来如此的简单了, 这么一个函数就已经完成抓取数据包的任务了.
四. 分析数据包
这回抓来的包和平常用 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 offset | |--------|--------|----------------|--------------------------------| | Time to live | Protocol | Header checksum | |--------|--------|----------------|--------------------------------| | Source address |
|--------|--------|----------------|--------------------------------| | Destination address |
|--------|--------|----------------|--------------------------------| | Option + Padding |
|--------|--------|----------------|--------------------------------| | Data |
|--------|--------|----------------|--------------------------------| TCP header structure: 16 32 bit
|--------------------------------|--------------------------------| | Source port | Destination port | |--------------------------------|--------------------------------| | Sequence number |
|--------------------------------|--------------------------------| | Acknowledgement number | |--------------------------------|--------------------------------| | Offset | Resrvd |U|A|P|R|S|F| Window | |--------------------------------|--------------------------------|
| Checksum | Urgent pointer | |--------------------------------|--------------------------------| | Option + Padding |
|--------------------------------|--------------------------------| | Data |
|--------------------------------|--------------------------------| 五. 实现 Sniffer OK!
现在都清楚了, 还等什么.
下面是我用 BCB6 写的一个 Simple Sniffer 的代码, 仅供参考. (需要在工程文件里加入WS2_32.LIB这个文件)
//*************************************************************************// //* CPP File: WMain.cpp //* Simple Sniffer by shadowstar //* http://shadowstar.126.com/
//*************************************************************************// #include
//--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource \
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库sniffer技术原理及应用,包括编程方法和工具使用在线全文阅读。
相关推荐: