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

首先,我今天来是做广告的哦:)
很久没有更新专栏了,关键是写不出什么好东西,也怕大家见笑!
虽然我还没被人骂过,但我见过别人被人骂,哎。不是说,这在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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值