sniffer技术原理及应用,包括编程方法和工具使用

本文介绍了sniffer技术的原理和广泛应用,包括在网络故障诊断和黑客攻击中的角色。探讨了sniffer的编程方法,如winpcap、raw socket和TDI、SPI等技术。同时,列举了多个常用嗅探工具,如Sniffer Pro、Wireshark和tcpdump。文章还分享了网络包过滤和驱动层面的实现方法,如NDIS中间层、Hook技术等,以及Windows 2000之后的新特性和挑战。最后,提到了安全对策和防范措施,强调了正确使用sniffer技术的重要性。
摘要由CSDN通过智能技术生成

首先,我今天来是做广告的哦:)
很久没有更新专栏了,关键是写不出什么好东西,也怕大家见笑!
虽然我还没被人骂过,但我见过别人被人骂,哎。不是说,这在csdn好像很正常哈!
今天把这个贴子整理一下,这本是专题开发版的一个专题讨论贴:http://expert.csdn.net/Expert/topic/2333/2333459.xml?temp=.3382532,其实这个贴子也没有挖出更深入的东西,关键是专题版目前人气不太好吧。我发这个贴是希望更多的人能到专题版,参与和组织讨论,但结果并不是太理想。

kingzai:
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技术,这种技术比较大的不同是

,可以将包截取而不是仅仅获得包的一份拷贝
。总的说来,一般以前两者居多。
  我这里提的都还比较片面,更多的需要大家来补充。我办这个专题的目的是希望大家共同来了解

,讨论sniffer技术,让更多的人参与进来,让大家知道,这个板块能够给大家带来真正想要的东西


warton:
libpcap是个好东西,linux,windows下都能用,很多入侵检测之类的安全系统都是以这为核心。不

过我一直没用过它,不知道它的跨平台性如何?
要用spi的话,看看xfilter的代码和书,特别是那本书上讲得不错,可惜一直没用它做出什么东西来


raw socket写的sniffer比较多,网上代码也很多!
昨天见csdn首页有几篇关于sniffer的文章,保存了,还没来得及看...
俺明天来说说目前常用的sniffer类工具和它们的技术实现!

csdn首页的两篇文章,大家可以看看,里面好像还有几篇,暂时找不到了
http://www.csdn.net/develop/article/21/21363.shtm
http://www.csdn.net/develop/article/21/21352.shtm
http://www.csdn.net/develop/article/15/15919.shtm

netsys2:
 
一)winpcap驱动简介
    winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开

发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项

功能:
    1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
    2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
    3> 在网络上发送原始的数据报;
    4> 收集网络通信过程中的统计信息。

   

winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。也就是说,winp

cap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报

。因此,它不能用于QoS调度程序或个人防火墙。

    目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的

用户中只有一小部分是仅使用windows 95/98/Me,并且M$也已经放弃了对win9x的开发。因

此本文相关的程序T-ARP也是面向NT/2000/XP用户的。其实winpcap中的面向9x系统的概念和

NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持ANSI编码,而NT系统则提倡使

用Unicode编码。

 zzhong2:
有个软件叫sniffer pro.可以作网管软件用,有很多功能,可监视网络运行情况,每台网内机器的数据

流量,实时反映每台机器所访问IP以及它们之间的数据流通情况,可以抓包,可对过滤器进行设置,以便

只抓取想要的包,比如POP3包,smtp包,ftp包等,并可从中找到邮箱用户名和密码,还有ftp用户名和

密码.它还可以在使用交换机的网络上监听,不过要在交换机上装它的一个软件.
还有一个简单的监听软件叫 Passwordsniffer,可截获邮箱用户名和密码,还有ftp用户名和密码,它

只能用在用HUB网络上
以上两个软件都可在小凤居上下载到:http://www.chinesehack.org/


warton:
libpcap的最新版本是0.7.2,下载很多(基于linux/unix)
winpcap的最新版本是3.0
这里有winpcap的源代码:http://download.pchome.net/php/dl.php?sid=11474
著名软件tcpdump及ids snort都是基于libpcap编写的,此外Nmap扫描器也是基于libpcap来捕

获目标主机返回的数据包的。
winpcap提供给用户两个不同级别的编程接口:一个基于libpcap的wpcap.dl,另一个是较底层的

packet.dll。对于一般的要与unix平台上libpcap兼容的开发来说,使用pacap.dll是当然的选择


下面几个库是与lipcap相关的:
libnet1.0.2:数据包的发送个构造过程
libnids:实现了ids的一些 框架
libicmp:icmp数据包处理

 


一些著名的嗅探器:
tcpdump/windump:支持多种unix,后者支持windows。基于libpcap
Sniffit:unix,windows,libpcap
Ngrep:libpcap,unixwindows.可以用规则表达式,识别PPP,SLIP及FDDI数据包
Sniffer pro/NetXray:专业的协议分析工具,是NAI提供的网络分析方案中的一部分
其它:
Iris
LanExplorer
NetMOnitor
CommView

单一用途的噢探器
口令嗅:winsniffer,典型的黑客工具,嗅探并解析ftp,pop3,http,icq,smtp,telnet,IMAP,NNTP

等口令
password sniffer for NetHackerIII

专用 嗅探器:
SMB嗅探器:L0phtcrack,SMPRelay
TCP连接会话嗅探器:CommView ,Iris,Juggernaut
SSL嗅探器:SSLDump--sslv3/tls网络协议分析工具
RIDIUS嗅控器:一个基于udp的论证记账协议,Radiusniff是其代表
PPTP嗅 控器:Anger,PPTP-sniff(solaris)
SNMP嗅探器:Snmpsniff

交换网络嗅探器:Ettercap
综合:Dsniff
其它交换网络嗅探器:
snarp,parasite

嗅探对策.........

netsys2:

网络上流传的GUNIFFER是个基本的原型:

http://asp.6to23.com/nowcan/code/guniffer.zip

void main(int argc, char ** argv)

{

int iErrorCode;

char RecvBuf[MAX_PACK_LEN] = {0};

usage();

if(GetCmdLine(argc, argv)==CMD_PARAM_HELP) exit(0);

//初始化SOCKET

WSADATA wsaData;

iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData);

CheckSockError(iErrorCode, "WSAStartup");

SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);

CheckSockError(SockRaw, "socket");

//获取本机IP地址

char FAR name[MAX_HOSTNAME_LAN];

iErrorCode = gethostname(name, MAX_HOSTNAME_LAN);

CheckSockError(iErrorCode, "gethostname");

struct hostent FAR * pHostent; //注意下面这三句,这里先对pHostent分配了一块

pHostent = (struct hostent * )malloc(sizeof(struct hostent));

//内存,然后有让它等于gethostbyname函数的返回

pHostent = gethostbyname(name); //值,但gethostbyname函数是自己在函数内部分配内

存的,因此上一句根本就是多余,把上一句删除后一切正常。但此程序用VC6编译运行都没有问题

,不知为何?也许是VC6的编译器优化在起作用。

SOCKADDR_IN sa;

sa.sin_family = AF_INET;

sa.sin_port = htons(6000);

memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);

free(pHostent); //由于前面分配内存的语句已经删除,所以这一句也要去掉,否则出错。感谢网

友 Heyuming 发现这个问题。

iErrorCode = bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa));

CheckSockError(iErrorCode, "bind");

//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包

DWORD dwBufferLen[10] ;

DWORD dwBufferInLen = 1 ;

DWORD dwBytesReturned = 0 ;

iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL,&dwBufferInLen,

sizeof(dwBufferInLen),

&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );

CheckSockError(iErrorCode, "Ioctl");

//侦听IP报文

while(1)

{

memset(RecvBuf, 0, sizeof(RecvBuf));

iErrorCode = recv(SockRaw, RecvBuf, sizeof(RecvBuf), 0);

CheckSockError(iErrorCode, "recv");

iErrorCode = DecodeIpPack(RecvBuf, iErrorCode);

CheckSockError(iErrorCode, "Decode");

}

}

它有2个不方便之处:
1)不能选择网卡
2)采用死循环方式读数据,改编到WINDOWS窗口模式下时有死机的感觉。

sevencat():
上次找了一些资料整理了一下,不过人气不旺,而且最近比较忙,暂时还没继续下去。
http://expert.csdn.net/Expert/topic/2299/2299615.xml?temp=.2761499
WINDOWS网络包过滤技术
                              (原文:http://www.ndis.com/papers/winpktfilter.htm
一、user-mode网络包过滤
1、winsock分层service provider
参照Microsoft Platform SDK上有关文档和例子
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
这里有好几个microsoft lsp 例子,最新(可能最bug-free)的经常在这里能找到。需要知道的是

可以通过TDI调用核心TCPIP驱动,而且可以完全绕开WINSOCK,在大多数情况下这不是一个问

题。例如:QOS的实现可以在WINSOCK LSP上。
然而,这样做的话,程序必须察看和操作每个包,而不能依靠WINSOCK LSP,他们要以一种接

近核心态的方法来实现。
2、win2000包过滤接口
  WIN2000包过滤接口提供了一种机制,这种机制允许用户态程序或者服务指定一系列的"过滤

原则",这些过滤原则会被低层的TCPIP实现用来过滤包。这种过滤工主要是对IP原地址、目标地址

、端口号(或者端口号范围)进行pass或者drop操作。
Windows Developer's Journal
《用iphlpapi.dll进行包过滤》作者:Ton plooy,October,2000,Volume 11, Number 10。
  WIN2000提供了一个较好对TCPIP的可编程控制,其中包括包过滤。不幸的是,有关这个新

的API的文档并不是很容易能找到。这篇文章向你演示了怎样对特定IP地址或者特定TCP端口的包

进行阻塞的编程。
链接:www.wdj.com
上面这个例子的下载:ftp://ftp.wdj.com/pub/webzip/1110/plooy.zip
Hollis 的解决方案:
  HTS W2K IpHook例子演示了IP过滤和它的HOOK API,包含原文件,而且是免费的,

需要HtsCpp运行时库(免费),下载地址:http://www.hollistech.com/
3、winsock替代DLL
  在使用WINSOCK LSP之前,唯一的办法是用自己的DLL取代微软的WINSOCK DLL,假

如实现顺利的话,自己的DLL会接收用户的WINSOCK调用请求,然后还可以调用原来的WINSOC

K DLL来处理。
  不过这样的实现是比较费力的,其中有个困难就是微软的WINSOCK DLL里面经常有一些未

公开的内部使用的函数,一个WINSOCK代替DLL至少要处理其中的一些未公开函数。
  随着WINDOWS系统结构的变化,有些方面得到了加强,比如系统文件保护,这使得这种技术

变得不太可行。总的说来,使用WINSOCK DLL替换不是一个坏主意。(Xfilter就是用的这种技

术,原代码可能在网上有流传,我以前看到过的)
二、kernel-mode网络包过滤
1、Transport Data Interface (TDI)
  这主要是一个直接在核心TCPIP驱动上面的一层过滤驱动。在WINXP上TDI驱动是一种传统的

NT风格的驱动,使用了基于IRP的API,这里有两种方法来实现。
A、使用核心模式服务的IoAttachDeviceXYZ函数族在TDI上实现一个过滤。
B、对TDI驱动IRP DISPATCH表进行过滤。
  IoAttachDeviceXYZ函数在许多WINNT驱动开发的书上提到。这两种技术都需要对WINNT驱

动开发编程技术十分了解,对TDI函数也要相当的了解。
2、NDIS中间层(IM)
具体请看NDIS IM FAQ:http://www.pcausa.com/resources/ndisimfaq.htm
3、WIN2000 FILTER-HOOK
  请参照有关DDK文档,系统中只能有一个活动的Filter-Hook存在,这点使这种技术的使用有

严重的限制。(平时所见的drvipflt就是用的这个)
4、WIN2000 FIREWALL-HOOK 
  Firewall-Hook Driver函数在文档里介绍得很少,而且在有些win2000版本中不可用。请参

照微软有关文档:http://msdn.microsoft.com/library/default.asp?url=/library/en-us

/network/hh/network/firewall_3wfb.asp
5、NDIS-HOOKING  (费尔防火墙就是用的这种技术吧,据我所知,虽然我没看过原码。)
NDIS-Hooking驱动拦截或者叫"HOOK"一些由NDIS封装程序导出的函数。虽然从实现手段上来

说有些不正规,但一个有系统的NDIS-Hooking过滤会非常有效。
另外:NDIS-Hooking过滤驱动有下面的好处:
A、容易安装(可以动态装卸,不过有时候会出问题,里面有些情况现在还未知。)
B、支持拨号-ppp适配器。
  Ndis-Hooking技术在98和ME系统下非常有效和实用。在这些平台上,DDK文档和provide

d services都能很有用的帮你HOOK由Ndis wrapper导出的函数。
  Ndis-Hooking技术在NT,2000和XP上同样有效和实用。这种技术很像核心模式的调试器。

文档支持较少,而且基本上不会被WHQL认证。
PCAUSA提供了一套NDIS PIM驱动例子,这些例子能在现有的WIN平台上运行成功(从95到X

P)。地址:http://www.pcausa.com/ndispim/Default.htm

其他:
Network操作和进程信息:
  有许多人想知道网络上的操作和WIN进程(就是应用程序啦)之间怎样联系起来,举例来说,

可能会想知道是哪个进程在一个特定的IP端口上发送或接收数据。
  先不考虑这种技术是否有用,或者是否可靠,我们认为核心模式TCPIP驱动上层的过滤程序可

以处理这个问题。而TCPIP驱动下层的过滤程序根本看不到进程信息。特别要注意的是有些网络服

务操作生成一个新的进程attach到系统进程上的。在这种情况下进程信息并不能告诉我们原先是哪

个进程生成的。特别是单独在核心模式下的WIN服务(TDI客户)
  最后,有必要看看下面的资料United States Patent 5,987,611; "System and

methodology for managing internet access on a per application basis for client

computers connected to the internet "
  我们并不知道这项专利的价值,也不知道他是否能用在包过滤上。详情请参阅:http://www.

uspto.gov/patft/index.html
www.pcausa.com

============================================
drvipflt具体解析,就是上面所提到的吧(2-3就是说的这东东)。
假定大家对驱动框架已经有了一定的理解。IRP分配程序如下:
NTSTATUS DrvDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
...
   switch (irpStack->MajorFunction)
    {
...
    case IRP_MJ_DEVICE_CONTROL:
        ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;

        switch (ioControlCode)
        {
   // ioctl code to start filtering
   //这里可以从用户模式程序发送这样的请求。
   //直接用DeviceIoControl这个函数,就像下面这样调用就可

以了吧,我想。
   

//DeviceIoControl(drivehandle,START_IP_HOOK,NULL,0,NULL,0,&bytereturned,NU

LL)
   case START_IP_HOOK:
   {
   //这个应该是最主要的函数了。
             SetFilterFunction(cbFilterFunction);

    break;
   }

   // ioctl to stop filtering
   case STOP_IP_HOOK:
   {
    SetFilterFunction(NULL);
            
    break;
   }

            // ioctl to add a filter rule
   case ADD_FILTER:
   {
    if(inputBufferLength == sizeof(IPFilter))
    {
     IPFilter *nf;

     nf = (IPFilter *)ioBuffer;
     
     AddFilterToList(nf);
    }

    break;
   }

   // ioctl to free filter rule list
   case CLEAR_FILTER:
   {
    ClearFilterList();

    break;
   }

   default:
    Irp->IoStatus.Status =

STATUS_INVALID_PARAMETER;


    break;
        }

        break;
...
}
SetFilterFunction(cbFilterFunction)可能是最重要的一个程序了。具体如下:
实际上这个做法相当在系统中注册了一个回调函数。
NTSTATUS SetFilterFunction(PacketFilterExtensionPtr filterFunction)
{
 NTSTATUS status = STATUS_SUCCESS, waitStatus=STATUS_SUCCESS;
 UNICODE_STRING filterName;
 PDEVICE_OBJECT ipDeviceObject=NULL;
 PFILE_OBJECT ipFileObject=NULL;

 PF_SET_EXTENSION_HOOK_INFO filterData;

 KEVENT event;
 IO_STATUS_BLOCK ioStatus;
 PIRP irp;

 //首先获得一个设备指针。
 //first of all, we have to get a pointer to IpFilterDriver Device
 RtlInitUnicodeString(&filterName, DD_IPFLTRDRVR_DEVICE_NAME);
 status = IoGetDeviceObjectPointer(&filterName,STANDARD_RIGHTS_ALL,

&ipFileObject, &ipDeviceObject);
 if(NT_SUCCESS(status))
 {
 //一些初始化工作,填充filterData。
  //initialize the struct with functions parameters
  filterData.ExtensionPointer = filterFunction;

  //we need initialize the event used later by the IpFilterDriver to

signal us
  //when it finished its work

PCAUSA Test TCP (PCATTCP) Release Notes Printing Communications Associates, Inc. 4201 Brunswick Court Smyrna, GA 30080 USA TEL: (770) 432-4580 FAX: (770) 436-7246 E-Mail: tdivine@pcausa.com ====================================================================== Component Part No.: N/A Component Name : PCAUSA Test TCP (PCATTCP) ====================================================================== Component Version : 2.01.01.11 Release Date : February 4, 2010 1.) Now flush stderr/stdout for all exit paths. ====================================================================== Component Version : 2.01.01.10 Release Date : November 3, 2009 1.) Added new -a option to specifiy local host IP address. 2.) Now built using Visual Studio 2008 (for better or worse...). ====================================================================== Component Version : 2.01.01.07 Release Date : November 23, 2003 1.) Incorporated fix identified by Clarkson University that reduces hangs when ending the UDP transmitter test. See additional comments in TTCP_TransmitUDP module. ====================================================================== Component Version : 2.01.01.06 Release Date : April 5, 2003 1.) Fixed minor bug in TTCP transmitter. PCAUSA PCATTCP preamble was not inserted correctly when building transmit buffer. ====================================================================== Component Version : 2.01.01.05 Release Date : May 31, 2002 1.) Modification to allow SO_RVCBUF and SO_SNDBUF values of zero(0) to be handled. Original implementation did not set these options if their value was zero. 2.) Added -w write delay option. ====================================================================== Component Version : 2.01.01.04 Release Date : May 30, 2002 1.) Minor fix to test exit routines. ====================================================================== Component Version : 2.01.01.03 Release Date : May 29, 2002 Externally Visible Differences ------------------------------ 1.) Added -c "continuous" option: -c -t: send continuously -r: accept multiple connections sequentially 1.) Added -R multi-threaded concurrent TCP/UDP receiver option. 2.) Fixed error codes. Now fetch using WSAGetLastError instead of perror. The latter did not handle socket errors. 3.) Revised test output messages. 4.) New PCATTCP.chm HtmlHelp documentation. Implementation Differences -------------------------- Extensive rework to suit author's style. ====================================================================== Component Version : 1.00.00.02 Release Date : January, 2000 Fix setting of setsockopt call for TCP_NODELAY. ====================================================================== Component Version : 1.00.00.01 Release Date : April, 1999 Initial release of PCAUSA's port of TTCP to Windows.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值