sniffer技术原理及应用包括编程方法和工具使用Word格式文档下载.docx
《sniffer技术原理及应用包括编程方法和工具使用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《sniffer技术原理及应用包括编程方法和工具使用Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
传统的sniffer技术是被动地监听网络通信、用户名和口令。
而新的sniffer技术出现了主
动地控制通信数据的特点,把sniffer技术扩展到了一个新的领域。
Sniffer
技术除了目前在传统的
网络侦测管理外,也开始被应用在资讯保全的领域。
可以这样说,sniffer技术是一把双刃剑,如何
更好的利用它,了解它的一些特性,将能使这项技术更好的为我们带来便利。
sniffer的编程方法比较通用的有以下几种,
1.winpcap这是一个比较通用的库,相信做过抓包的工具大多数人都不会太陌生
2.rawsocket在2000以后的版本都支持此项功能,2000server有个网络监视器就是基于rawsocket
3.tdi,ndis,spi,hooksocket技术,这种技术比较大的不同是可以将包截取而不是仅仅获得包的一份拷贝。
总的说来,一般以前两者居多。
一)winpcap驱动简介
winpcap(windowspacketcapture)是windows平台下一个免费,公共的网络访问系统。
开
发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项
功能:
1>
捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
2>
在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
3>
在网络上发送原始的数据报;
4>
收集网络通信过程中的统计信息。
winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。
也就是说,winp
cap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。
因此,它不能用于QoS调度程序或个人防火墙。
RawSocket(原始套接字)实现Sniffer(嗅探)
一.摘要
RawSocket:
原始套接字
可以用它来发送和接收IP层以上的原始数据包,如ICMP,TCP,UDP...
intsockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
这样我们就创建了一个RawSocket
Sniffer:
嗅探器
关于嗅探器的原理我想大多数人可能都知道
1.把网卡置于混杂模式;
2.捕获数据包;
3.分析数据包.
但具体的实现知道的人恐怕就不是那么多了.好,现在让我们用RawSocket的做一个自已的Sniffer.
二.把网卡置于混杂模式
在正常的情况下,一个网络接口应该只响应两种数据帧:
一种是与自己硬件地址相匹配的数据帧
一种是发向所有机器的广播数据帧
如果要网卡接收所有通过它的数据,而不管是不是发给它的,那么必须把网卡置于混杂模式.也就是说让它的思维混乱,不按正常的方式工作.用RawSocket实现代码如下:
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头:
boolflag=ture;
addrLocal为本地地址:
SOCKADDR_INaddrLocal;
dwValue为输入输出参数,为1时执行,0时取消:
DWORDdwValue=1;
没想到这么简单吧?
三.捕获数据包
你的sockRaw现在已经在工作了,可以在局域网内其它的电脑上用Sniffer检测工具检测一下,看你的网卡是否处于混杂模式(比如DigitalBrain的ARPKiller).
不能让他白白的浪费资源啊,抓包!
recv(sockRaw,RecvBuf,BUFFER_SIZE,0);
//接受任意数据包
#defineBUFFER_SIZE65535
charRecvBuf[BUFFER_SIZE];
越来越发现Sniffer原来如此的简单了,这么一个函数就已经完成抓取数据包的任务了.
四.分析数据包
这回抓来的包和平常用Socket接受的包可就不是一回事儿了,里面包含IP,TCP等原始信息.要分析它首先得知道这些结构.
数据包的总体结构:
----------------------------------------------
|ipheader|tcpheader(orxheader)|data|
IPheaderstructure:
4
8
16
32bit
|--------|--------|----------------|--------------------------------|
|Ver
|IHL
|Typeofservice|
Totallength
|
|Identification|
Flags
|
Fragmentoffset
|Timetolive
Protocol
Headerchecksum
Sourceaddress
Destinationaddress
Option+Padding
Data
TCPheaderstructure:
|--------------------------------|--------------------------------|
Sourceport
Destinationport
Sequencenumber
Acknowledgementnumber
|Offset|Resrvd|U|A|P|R|S|F|
Window
Checksum
Urgentpointer
五.实现Sniffer
OK!
现在都清楚了,还等什么.
下面是我用BCB6写的一个SimpleSniffer的代码,仅供参考.
(需要在工程文件里加入WS2_32.LIB这个文件)
//*************************************************************************//
//*CPPFile:
WMain.cpp
//*SimpleSnifferbyshadowstar
//*
#include<
vcl.h>
#pragmahdrstop
winsock2.h>
ws2tcpip.h>
mstcpip.h>
netmon.h>
#include"
WMain.h"
//----------------------------------------------