WINPCAP用法

WINPCAP用法
WINPCAP用法

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

https://www.360docs.net/doc/569578565.html, 2005-8-3 来源:warton

很久没有更新专栏了,关键是写不出什么好东西,也怕大家见笑!

虽然我还没被人骂过,但我见过别人被人骂,哎。不是说,这在csdn好像很正常哈!

今天把这个贴子整理一下,这本是专题开发版的一个专题讨论贴:

https://www.360docs.net/doc/569578565.html,/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首页的两篇文章,大家可以看看,里面好像还有几篇,暂时找不到了

https://www.360docs.net/doc/569578565.html,/develop/article/21/21363.shtm

https://www.360docs.net/doc/569578565.html,/develop/article/21/21352.shtm

https://www.360docs.net/doc/569578565.html,/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网络上

以上两个软件都可在小凤居上下载到:https://www.360docs.net/doc/569578565.html,/

warton:

libpcap的最新版本是0.7.2,下载很多(基于linux/unix)

winpcap的最新版本是3.0

这里有winpcap的源代码:https://www.360docs.net/doc/569578565.html,/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是个基本的原型:

https://www.360docs.net/doc/569578565.html,/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_RCV ALL,以便接收所有的IP包

DWORD dwBufferLen[10] ;

DWORD dwBufferInLen = 1 ;

DWORD dwBytesReturned = 0 ;

iErrorCode=WSAIoctl(SockRaw, SIO_RCV ALL,&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():

上次找了一些资料整理了一下,不过人气不旺,而且最近比较忙,暂时还没继续下去。

https://www.360docs.net/doc/569578565.html,/Expert/topic/2299/2299615.xml?temp=.2761499

WINDOWS网络包过滤技术

(原文:https://www.360docs.net/doc/569578565.html,/papers/winpktfilter.htm)

一、user-mode网络包过滤

1、winsock分层service provider

参照Microsoft Platform SDK上有关文档和例子

(https://www.360docs.net/doc/569578565.html,/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,V olume 11, Number 10。

WIN2000提供了一个较好对TCPIP的可编程控制,其中包括包过滤。不幸的是,有关这个新

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

进行阻塞的编程。

链接:https://www.360docs.net/doc/569578565.html,

上面这个例子的下载:ftp://https://www.360docs.net/doc/569578565.html,/pub/webzip/1110/plooy.zip

Hollis 的解决方案:

HTS W2K IpHook例子演示了IP过滤和它的HOOK API,包含原文件,而且是免费的,

需要HtsCpp运行时库(免费),下载地址:https://www.360docs.net/doc/569578565.html,/

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:https://www.360docs.net/doc/569578565.html,/resources/ndisimfaq.htm

3、WIN2000FILTER-HOOK

请参照有关DDK文档,系统中只能有一个活动的Filter-Hook存在,这点使这种技术的使用有

严重的限制。(平时所见的drvipflt就是用的这个)

4、WIN2000FIREW ALL-HOOK

Firewall-Hook Driver函数在文档里介绍得很少,而且在有些win2000版本中不可用。请参

照微软有关文档:https://www.360docs.net/doc/569578565.html,/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)。地址:https://www.360docs.net/doc/569578565.html,/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.

https://www.360docs.net/doc/569578565.html,/patft/index.html

https://www.360docs.net/doc/569578565.html,

============================================

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 =

STA TUS_INV ALID_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_STA TUS_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

KeInitializeEvent(&event, NotificationEvent, FALSE);

//这个就是最重要的注册回调函数过程。DDK中具体讲述是这样的

//IOCTL_PF_SET_EXTENSION_POINTER registers filter-hook callback functions to

the IP filter driver

//to inform the IP filter driver to call those filter hook callbacks for every IP packet

//that is received or transmitted. Also, IOCTL_PF_SET_EXTENSION_POINTER

clears filter-hook

//callback functions from the IP filter driver. (看到了吧,最后一句话,注册新的回调函

数,就将原先的清除掉了,

//所以说系统中只存在一个这样的驱动有用。)

//we build the irp needed to establish fitler function这个地方仅

仅是生成这样的IRP,并没有注册

irp =

IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,

ipDeviceObject,

(PVOID) &filterData,

sizeof(PF_SET_EXTENSION_HOOK_INFO), NULL,

0,

FALSE,

&event,

&ioStatus);

if(irp != NULL)

{

// we send the IRP

//这个地方才是真正的注册呀。

status = IoCallDriver(ipDeviceObject, irp);

//and finally, we wait for "acknowledge" of

IpDriverFilter

if (status == STATUS_PENDING)

{

waitStatus = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);

if (waitStatus != STA TUS_SUCCESS )

{}

}

status = ioStatus.Status;

if(!NT_SUCCESS(status)){}

}

else

{

//if we cant allocate the space, we return the

corresponding code error

status = STATUS_INSUFFICIENT_RESOURCES;

}

if(ipFileObject != NULL)

ObDereferenceObject(ipFileObject);

ipFileObject = NULL;

ipDeviceObject = NULL;

}

else

return status;

}

//真正的过滤函数是这个,在最早的IRPdispatch里面传递的这个函数。

//这个函数就是系统传递了一个包头和包内容和包长度之类的东西,你可以在里面进行一些处理,//假如你想让这个包通过的话,就返回PF_FORW ARD,或者你不想让包通过的话,就返回PF_D

ROP就拦住了。是不是

//听起来很简单,

PF_FORWARD_ACTION cbFilterFunction(IN unsigned char *PacketHeader,IN

unsigned char *Packet, IN unsigned int PacketLength, IN unsigned int

RecvInterfaceIndex, IN unsigned int SendInterfaceIndex, IN unsigned long

RecvLinkNextHop, IN unsigned long SendLinkNextHop)

{

IPPacket *ipp;

TCPHeader *tcph;

UDPHeader *udph;

int countRule=0;

struct filterList *aux = first;

//we "extract" the ip Header

ipp=(IPPacket *)PacketHeader;

// dprintf("Source: %x\nDestination: %x\nProtocol: %d", ipp->ipSource, ipp->ipDestination, ipp->ipProtocol);

//TCP -> protocol = 6

//we accept all packets of established connections

if(ipp->ipProtocol == 6)

{

tcph=(TCPHeader *)Packet;

// dprintf("FLAGS: %x\n", tcph->flags);

//if we havent the bit SYN activate, we pass the packets

if(!(tcph->flags & 0x02))

return PF_FORWARD;

}

//otherwise, we compare the packet with our rules

while(aux != NULL)

{

// dprintf("Comparing with Rule %d", countRule);

//if protocol is the same....

if(aux->ipf.protocol == 0 || ipp->ipProtocol ==

aux->ipf.protocol)

{

//we look in source Address

if(aux->ipf.sourceIp != 0 && (ipp->ipSource &

aux->ipf.sourceMask) != aux->ipf.sourceIp)

{

aux=aux->next;

countRule++;

continue;

}

// we look in destination address

if(aux->ipf.destinationIp != 0 && (ipp->ipDestination

& aux->ipf.destinationMask) != aux->ipf.destinationIp)

{

aux=aux->next;

countRule++;

continue;

}

//if we have a tcp packet, we look in ports

//tcp, protocol = 6

if(ipp->ipProtocol == 6)

{

if(aux->ipf.sourcePort == 0 ||

tcph->sourcePort == aux->ipf.sourcePort)

{

if(aux->ipf.destinationPort == 0

|| tcph->destinationPort == aux->ipf.destinationPort) //puerto tcp destino {

//now we decided what

to do with the packet

if(aux->ipf.drop)

return PF_DROP;

else

return PF_FORWARD;

}

}

}

//udp, protocol = 17

else if(ipp->ipProtocol == 17)

{

udph=(UDPHeader *)Packet;

if(aux->ipf.sourcePort == 0 ||

udph->sourcePort == aux->ipf.sourcePort)

{

if(aux->ipf.destinationPort == 0

|| udph->destinationPort == aux->ipf.destinationPort) {

//now we decided what

to do with the packet

if(aux->ipf.drop)

return

PF_DROP;

else

return

PF_FORWARD;

}

}

}

else

{

//for other packet we dont look more and

....

//now we decided what to do with the

packet

if(aux->ipf.drop)

return PF_DROP;

else

return PF_FORWARD;

}

}

//compare with the next rule

countRule++;

aux=aux->next;

}

//we accept all not registered

return PF_FORWARD;

}

winpcap也是用的NDIS,将自己注册为一个协议处理驱动。(在原代码的driverentry里面能看到)

又:上面这个drvipflt这个代码的过滤部分不知道大家是不是看起来很熟悉,是的,是抄的那个nu

mege的驱动开发包里面的一个包过滤程序里的,看来老外也是喜欢到处抄的。

ruike:

读研的时候专门搞过nids,因此对winpcap可以说是情有独钟,这个东东确实好用,但也确实很烦

人,它有一个致命的缺陷就是只适用于共享式以太网络,对于交换式网络下的数据则无能为力,我

专门做过测试,在使用交换机连接的局域网下,只能监听到本网段内的数据,而对于来自其他网段

的数据则无法监听,除非你把probe接到交换机之前或者接到交换机的console口上,不过那样的

弊端是显而易见的。

所以,winpcap的应用还是很有局限性的!

kingzai:

实现交换网络的嗅探也有不少方法的

1.将你的抓包程序放在网关或代理服务器上,这样抓到整个局域网的包。

2.对交换机实行端口映射,将该端口的数据包全部映射到某个监控机器上。

3.在交换机和路由器之间连接一个HUB,这样数据将以广播的方式发送。

4.实行ARP欺骗,即在你的机器上实现整个包的转发,不过会降低整个局域网的效率。

warton:

嗅探对策:

光说嗅探了,我说说反嗅探吧:)

1.检查网内的主机上是否将网卡设置为混合模式(有很多工具可以做到,AntiSniff,Promiscan,S

entinel等)

2.对EtterCap这样的交换网络嗅探器(进行ARP欺骗),可以采用防止ARP欺骗的方法来对待

3.SSH加密通道

4.SSL

5.VPN

6.PGP等

目前这用利用网卡混合模式来进行sniffer的软件看来作用不太大了,所以应该多考虑交换网络的可

行办法:

MAC Flooding,MAC Duplicating,ARP欺骗等等

这些方法实现起来就不怎么容易了,欢迎有兴趣的朋友提供相关的资料,呵呵!

netsys:

难道没人用过RAW SOCKET 吗?

虽然WINPCP功能很大,但RAW SOCKET可以让你直接了SOCKET的原生机制。

实际上我提的那两个问题是很容易解决的。。

netsys2:

对于一些混合模式的SNIFFER,大多采用发送特殊ARP包的方式,正确的网卡不会响应,而处于

混合模式的网卡则会响应。

当然,ARP与IP处于同层,因此你不能用RAW SOCKET完成,你需WinPcap支持工作。

下面是部分代码

AnsiString msgStatus;

extern TArpFuncParam wParams;

int BuildARPPacket(PArpPacket ArpPacket, unsigned char *dst_etheraddr,

unsigned char *src_etheraddr, int ar_op, unsigned

char *ar_sha,

unsigned char *ar_sip, unsigned char *ar_tha,

unsigned char *ar_tip,unsigned short int ar_hw)

{

memcpy(&(ArpPacket->eth_dst_addr), dst_etheraddr, ETH_ADD_LEN);

memcpy(&(ArpPacket->eth_src_addr), src_etheraddr, ETH_ADD_LEN);

ArpPacket->eth_type = htons(ETH_TYPE_ARP);

ArpPacket->ar_hrd = htons(ar_hw);

ArpPacket->ar_pro = htons(ARP_PRO_IP);

ArpPacket->ar_hln = ARP_ETH_ADD_SPACE;

ArpPacket->ar_pln = ARP_IP_ADD_SPACE;

ArpPacket->ar_op = htons(ar_op);

memcpy(&(ArpPacket->ar_sha), ar_sha, ARP_ETH_ADD_SPACE);

memcpy(&(ArpPacket->ar_spa), ar_sip, ARP_IP_ADD_SPACE);

memcpy(&(ArpPacket->ar_tha), ar_tha, ARP_ETH_ADD_SPACE);

memcpy(&(ArpPacket->ar_tpa), ar_tip, ARP_IP_ADD_SPACE);

memset(ArpPacket->eth_pad, 32, ETH_PADDING_ARP);

return(EXIT_SUCCESS);

}

int OpenAdapter(LPADAPTER *lpAdapter)

{

*lpAdapter =

PacketOpenAdapter(wParams.AdapterList[wParams.SelectedAdapter]);

if(!(*lpAdapter) || ((*lpAdapter)->hFile == INV ALID_HANDLE_VALUE))

{

msgStatus = "Error : unable to open the driver.";

SHOWSTAT(msgStatus);

return(EXIT_FAILURE);

}

return(EXIT_SUCCESS);

}

void CloseAdapter(LPADAPTER lpAdapter)

{

PacketCloseAdapter(lpAdapter);

}

void GetLocalMAC(LPADAPTER lpAdapter, unsigned char *ether_addr)

{

ULONG IoCtlBufferLength = (sizeof(PACKET_OID_DA TA) + sizeof(ULONG) - 1); PPACKET_OID_DATA OidData;

OidData = (struct _PACKET_OID_DATA *)malloc(IoCtlBufferLength);

OidData->Oid = OID_802_3_CURRENT_ADDRESS;

OidData->Length = 6;

if(PacketRequest(lpAdapter, FALSE, OidData) == FALSE)

memcpy(ether_addr, 0, 6);

else

memcpy(ether_addr, OidData->Data, 6);

free(OidData);

}

int GetARPReply(LPPACKET lpPacket, unsigned char *iptarget, unsigned char

*result)

{

基于winpcap的嗅探器设计与实现

基于winpcap的嗅探器设计与实现

计算机与信息学院 《计算机网络系统实践》报告 设计题目:嗅探器的设计与实现 学生姓名:*** 学号:2010**** 专业班级:信息安全****

2013 年9 月25 一、设计要求 1.不限平台,可以使用Libpcap、WinPcap 或 Linux的原始套接字; 2.实现一个功能比较简单的、具有图形界面的Sniffer,主线程响应用户界 面操作,工作线程完成抓包等工作; 3.能够解析出IP层和传输层的协议头,能够过滤TCP、UDP等数据包; 4.能够输出文本方式传送的数据包的内容; 5.能够进行简单的流量统计。 二、开发环境与工具

操作系统:windows7 开发工具:visual studio 开发语言:C++ 附加库:Winpcap 三、设计原理 网络嗅探器是一种常用的监听网络的工具。所谓嗅探器( Sniffer) ,是一种利用计算机网络接口截获网络数据的软件或硬件,可用于网络管理、网络协议分析以及网络安全等众多方面。嗅探器不同于一般的键捕获工具,后者只能捕获当地终端控制台上的按键内容,而嗅探器所“嗅”到的是动态的以信息包形式( 如IP 数据包或者以太网包) 封装的信息流。其中可能携带了重要数据或敏感信息。可以将这些捕获到的信息包存档,以利用相应工具可以作进一步分析。 计算机网络的设计为嗅探器的使用创造了最基本的条件。在目前的网络环境中,所有计算机节点都是共享传输介质,任意节点发出或发往任意节点的数据帧必将经过网内每一个节点的网络接口,此时只需对嗅探节点的网络接口( 网卡) 进行适当的设置便可为实现嗅探的做好准备工作。在计算机网络系统中,网卡是用来接收网络上其他节点发来的数据帧,其内嵌的单片处理程序会检测数据帧来源的MAC 地址,并根据网卡所设置的接收方式来是否接收处理数据,如果认为应该处理,则网卡就会产生中断信号通知中央处理器,接收该数据帧并传输给操作系统处理。否则就简单丢弃,所对应节点的网卡就截断,计算机的中央处理器并不参与。 网卡是网络中节点主机的关键硬件设备。对数据的接收一般有四种设置模式: 广播模式: 接收在网络中进行广播数据信息。组播模式: 接收组播数据信息。单播模式: 只有匹配的目的网卡才能接收数据信息。混杂模式: 网卡能够可以接收一切通过它的数据信息。 四、系统功能描述及软件模块划分 系统功能设计 本系统的基本功能为实现网络数据包的捕获, 并将其数据内容解析显示。网络数据包捕获功能主要负责从网络中捕获和过滤数据,这可以通过调

Excel中常用函数应用举例

Excel中常用函数应用举例 1.求和函数SUM 求和 SUM(number1,number2,...)。 使用求和函数SUM,操作步骤如下: (1)打开“员工业绩表”工作簿,选择D10单元格,如图所示。 (2)单击“插入函数”按钮,在弹出的“插入函数”对话框中选择SUM函数,单击“确定”按钮,如图所示。

(3)在打开的“函数参数”对话框中,“Number1”文本框中默认引用D3:D9单元格区域,单击“确定”按钮,如图所示。 (4)求出的和值即可显示在D10单元格中,如图所示。

2.平均值函数A VERAGE 平均值函数的原理是将所选单元格区域中的数据相加,然后除以单元格个数,返回作为结果的算术平均值,其语法结构为:A VERAGE(number1,number2,...)。 使用平均值函数A VERAGE,操作步骤如下: (1)打开“员工业绩表”工作簿,选择D11单元格,如图所示。

(2)单击“插入函数”按钮,在弹出的“插入函数”对话框中选择A VERAGE函数,单击“确定”按钮,如图所示。 (3)在打开的“函数参数”对话框中,在“Number1”文本框中输入D3:D9,设定计算平均值的单元格区域,单击“确定”按钮,如图所示。

(4)求出的平均值即显示在D11单元格中,如图所示。 3.条件函数IF 条件函数可以实现真假值的判断,它根据逻辑计算的真假值返回两种结果。该函数的语法结构为:IF(logical_test,value_if_true,value_if_false)。其中,logical_test表示计算结果为true或false的任意值或表达式;value_if_true表示当logical_test为true时返回的值;value_if_false表示当logical_test为false时返回的值。

使用Winpcap示例程序的时候解疑

使用Winpcap示例程序的时候,会出现很多错误(转) WINPCAP编程环境设置 2008-05-19 12:41 一、WINPCAP编程环境设置 在正式WinPcap编程之前,要配置运行环境。 1、运行环境设置 Win32 平台下WinPcap应用程序需要以下四个动态链接库才能正常运行:wpcap.dll Packet.dll WanPacket.dll pthreadVC.dll 这四个动态链接库在WinPcap驱动程序里。 如果没有这个驱动程序,需要到WinPcap官方网站上下载,下载地址为:https://www.360docs.net/doc/569578565.html, 如果应用程序出现一下提示,那就是没有安装驱动程序的原因了。 也可以不安装WinPcap驱动程序。但是需要把上面提到的四个动态链接库文件拷贝到系统分区/WINDOWS/system32目录下。(似乎有些问题) 2、配置编程环境。 1> 从https://www.360docs.net/doc/569578565.html,上下载WINPCAP SDK -WpdPack,WinPcap SDk里面包含库文件,头文件,文档文件和一些例子。解压到一个指定的目录。解压缩后把Include目录添加到IDE的包含文件中(VC6.0 Tools->Option->Directory; VS 2003/2005 工具->选项->项目和解决方案/项目->VC++目录); lib目录添加为新的库文件目录(VC6.0 Tools->Option->Directory; VS 2003/2005 工具->选项->项目和解决方案/项目->VC++目录)如下图所示。

2> 如果一个源文件使用了WinPcap提供的库函数,那么就需要在该文件开始的位置添加pcap.h包含文件(或者在引用的文件中),即#include “pcap.h” 也许会出现下面的错误: fatal error C1083: 无法打开包括文件:“pcap.h”: No such file or directory 这个错误表明找不到pcap.h文件,这个头文件在驱动程序安装完成后也是没有的,它是开发包里面的一个头文件,所以,如果要运行程序还需要到官方网站上去下载WinPcap SDK,并按步骤1添加到项目中。 3> 在程序中添加wpcap.lib。如果出现下面错误 error LNK2019: 无法解析的外部符号_pcap_findalldevs_ex,该符号在函数XXX 中被引用,如果发生上面的错误就表明缺少库文件,需要添加wpcap.lib到工程中(VC6.0 Project->Settings->Link->Object/library modules; VS 2003/2005 项目->添加现有项->所有文件)如下图所示:

WinPcap开发-零基础知识入门基础

WinPcap开发(一):零基础入门 *原创作者:追影人 0×00 前言 网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题。而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具。 0×01 winpcap是什么? winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看到winpcap驱动程序的安装过程。 有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了。需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。所以它只能“嗅探”到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目。 0×02 你需要准备些什么?

本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计及网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解。在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建及快速编写核心代码。但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpc ap开发库支持的编程语言,自己能动手实践编写一些例子。Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、python,好像连易语言都有。本系列文章将使用c语言来进行各种实验,有兴趣的读者可以将其转换成自己熟悉的语言来动手实践。 0×03 你能学到什么? 有关winpcap开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:

工作中最常用的excel函数公式大全

工作中最常用的e x c e l函 数公式大全 -标准化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

工作中最常用的excel函数公式大全,帮你整理齐了,拿来即用 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","")

说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 2、统计不重复的总人数 公式:C2 =SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8))

说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。 四、求和公式 1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式 2、单条件求和 公式:F2

=SUMIF(A:A,E2,C:C) 说明:SUM IF函数的基本用法 3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 4、多条件模糊求和 公式:C11

WinPcap编程

WinPcap编程 WinPcap是一个开源的、运行于Win32平台下的体系结构,它的主要功能是进行数据包捕获和网络分析。它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核级别的数据包过滤、网络静态引擎和支持远程数据包捕获等有用的功能。 WinPcap由两部分组成: 1. 驱动程序: 扩展操作系统功能提供低层次的网络访问 2. 动态链接库:运行在Win32平台上的应用程序可以非常方便地访问网络低层次的数据。Ethereal是大名鼎鼎的捕获数据包专业软件,它的运行是在WinPcap的支持之下的,如果没有安装WinPcap,Ethereal也无法正常捕获数据包。 在正式WinPcap编程之前,要配置运行环境。 Win32 平台下WinPcap应用程序需要以下四个动态链接库才能正常运行: 这四个动态链接库在WinPcap驱动程序里。 如果应用程序出现一下提示,那就是没有安装驱动程序的原因了。 被过滤广告 也可以不安装WinPcap驱动程序。但是需要把上面提到的四个动态链接库文件拷贝到系统分区/WINDOWS/system32目录下 或者 接下来配置编程环境。 如果一个源文件使用了WinPcap提供的库函数,那么就需要在该文件开始的位置添加包含文件(或者在引用的文件中),即#include “” 也许会出现下面的错误: fatal error C1083: 无法打开包括文件:“”: No such file or directory 这个错误表明找不到文件 这个头文件在驱动程序安装完成后也是没有的,它是开发包里面的一个头文件 所以,如果要运行程序还需要到官方网站上去下载WinPcap SDK―WpdPack WinPcap SDk里面包含库文件,头文件,文档文件和一些例子。 解压缩后把Include目录添加到IDE的包含文件中( Tools->Option->Directory; VS 2003/2005 工具->选项->项目和解决方案/项目->VC++目录) error LNK2019: 无法解析的外部符号_pcap_findalldevs_ex,该符号在函数XXX 中被引用 如果发生上面的错误就表明缺少库文件,需要添加到工程中Project->Settings->Link->Object/library modules; VS 2003/2005 项目->添加现有项->所有文件) error C2065: “PCAP_SRC_IF_STRING”: 未声明的标识符 error C3861: “pcap_findalldevs_ex”: 找不到标识符 error C2065: “PCAP_OPENFLAG_PROMISCUOUS”: 未声明的标识符 error C3861: “pcap_open”: 找不到标识符 新的版本里WinPcap支持远程数据包获取,发生上面的错误很有可能是新的版本导致不兼容的问题,所以还应当添加一个头文件,即

工作中最常用的excel函数公式大全

工作中最常用的excel函数公式大全,帮你整理齐了,拿来即用 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","")

说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 2、统计不重复的总人数 公式:C2

=SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。 四、求和公式 1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式 2、单条件求和

公式:F2 =SUMIF(A:A,E2,C:C) 说明:SUM IF函数的基本用法 3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。

4、多条件模糊求和 公式:C11 =SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符* 5、多表相同位置求和 公式:b2 =SUM(Sheet1:Sheet19!B2) 说明:在表中间删除或添加表后,公式结果会自动更新。 6、按日期和产品求和 公式:F2

WinpCap 编写抓包程序

利用WinpCap 编写抓包程序 网友:yeahilly 发布于:2008.05.20 11:12(共有条评论) 查看评论| 我要评论 WinpCap是一个公开的免费的抓包驱动加开发包,利用它,可以大大缩短我们的开发周期。 首先,先枚举系统中的所有网卡: /* 获取设备列表*/ if (pcap_findalldevs(&alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); exit(1); } /* 数据列表*/ for(d=alldevs; d; d=d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } 然后选择网卡,然后设备。 if ( (adhandle= pcap_open_live(d->name, //设备名 65536, // 捕捉完整的数据包 1 , // 混在模式 1, // 读入超时

errbuf // 错误缓冲 ) ) == NULL) { printf("Unable to open the adapter"); pcap_freealldevs(alldevs); return; } 打开设备之后,我们就可以利用adhandle句柄来正式抓包了,先新建一个回调函数,形如 void packet_handler(u_char* packets,const struct pcap_pkthdr *header,const u_char *data) { } 然 后调用pcap_loop(adhandle, 0, packet_handler, NULL);pcap_loop的最后一个参数和packet_handler的packets参数是对应的,用于在函数间传递数据。WinpCap每收 到一个包就自动调用packet_handler函数,将包的内容作为data参数,我们对data作强制类型转化就可以得到数据包各部分的内容。 事实上,WinpCap开发包除了可以用回调函数抓包外,还可以用非回调的方法。在得到adhandle后不调用pcap_loop,而用下面的方法:while(1) { res = pcap_next_ex(adhandle,&header,&data); if(res==0) { Sleep(100); continue; } } 用pcap_next_ex读取数据包内容,至于if(res==0)这一段是为了防止没数据包到达时重复循环。

winpcap环境部署(VC6.0出现找不到“pcap.h_'”文件解决方法)

Winpcap 环境部署 (VC6.0出现“pcap.h': No such file or directory”问题解决方法)Winpcap简介及Winpcap安装包和开发包下载地址: Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器;获取指定适配器信息(比如名称和描述信息);捕获指定网卡的数据封包;发送数据封包;过滤捕获的包以获取特定包等。 首先到https://www.360docs.net/doc/569578565.html,/install/default.htm下载安装winpcap 驱动和DLL组件。 注意下图被红线圈起来的地方,即使下载地址,点击进入 然后到https://www.360docs.net/doc/569578565.html,/devel.htm.下载winpcap开发包,解压到指定目录,这里我解压到C:\WpdPack_4_0_2\WpdPack,可以看到里面包含了:Lib,Include,文档

和示例程序。 把安装包和开发包下载下来后,执行安装包,这样你的机子就能运行winpcap程序了,解压开发包里面有 具体解决方法: 这里的include和lib文件夹里的东西因为vc6.0里没有,所以编译一些程序时我们要手动添加。如果出现fatal error C1083: Cannot open include file: 'pcap.h': No such file or directory这个问题,就需要添加了。 下面是具体添加步骤: 第一步:

点菜单栏上的“工具”,再点击下拉菜单中的“选项”弹出“选项”对话框 点“目录”在“目录【S】”的下面选择include files然后按底下的添加符号,把你写的winpcap 开发包解压到的具体路径添加进去,如上图我的路径是

工作中最常用的excel函数公式大全

工作中最常用的excel函数公式大全 一、数字处理 1、取绝对值=ABS(数字) 2、取整=INT(数字) 3、四舍五入=ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2=IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 2、IF多条件判断返回值公式: C2=IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数。

1、统计两个表格重复的内容 公式:B2=COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 2、统计不重复的总人数 公式:C2=SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。

1、隔列求和 公式:H3=SUMIF($A$2:$G$2,H$2,A3:G3) 或=SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式 2、单条件求和 公式:F2=SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法

3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 4、多条件模糊求和 公式:C11=SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符*

EXCEL中常用函数及使用方法

EXCEL中常用函数及使用方法 Excel函数一共有11类:数据库函数、日期与时间函数、工程函数、财务函数、信息函数、逻辑函数、查询和引用函数、数学和三角函数、统计函数、文本函数以及用户自定义函数。 1.数据库函数 当需要分析数据清单中的数值是否符合特定条件时,可以使用数据库工作表函数。例如,在一个包含销售信息的数据清单中,可以计算出所有销售数值大于1,000 且小于2,500 的行或记录的总数。Microsoft Excel 共有12 个工作表函数用于对存储在数据清单或数据库中的数据进行分析,这些函数的统一名称为Dfunctions,也称为D 函数,每个函数均有三个相同的参数:database、field 和criteria。这些参数指向数据库函数所使用的工作表区域。其中参数database 为工作表上包含数据清单的区域。参数field 为需要汇总的列的标志。参数criteria 为工作表上包含指定条件的区域。 2.日期与时间函数 通过日期与时间函数,可以在公式中分析和处理日期值和时间值。 3.工程函数 工程工作表函数用于工程分析。这类函数中的大多数可分为三种类型:对复数进行处理的函数、在不同的数字系统(如十进制系统、十六进制系统、八进制系统和二进制系统)间进行数值转换的函数、在不同的度量系统中进行数值转换的函数。 4.财务函数 财务函数可以进行一般的财务计算,如确定贷款的支付额、投资的未来值或净现值,以及债券或息票的价值。财务函数中常见的参数: 未来值(fv)--在所有付款发生后的投资或贷款的价值。 期间数(nper)--投资的总支付期间数。 付款(pmt)--对于一项投资或贷款的定期支付数额。 现值(pv)--在投资期初的投资或贷款的价值。例如,贷款的现值为所借入的本金数额。 利率(rate)--投资或贷款的利率或贴现率。 类型(type)--付款期间内进行支付的间隔,如在月初或月末。 5.信息函数 可以使用信息工作表函数确定存储在单元格中的数据的类型。信息函数包含一组称为IS 的工作表函数,在单元格满足条件时返回TRUE。例如,如果单元格包含一个偶数值,ISEVEN 工作表函数返回TRUE。如果需要确定某个单元格区域中是否存在空白单元格,可以使用COUNTBLANK 工作表函数对单元格区域中的空白单元格进行计数,或者使用ISBLANK 工作表函数确定区域中的某个单元格是否为空。 6.逻辑函数 使用逻辑函数可以进行真假值判断,或者进行复合检验。例如,可以使用IF 函数确定条件为真还是假,并由此返回不同的数值。

基于WinPcap的网络数据包捕获与分析

基于WinPcap的网络数据包捕获与分析 一、WinPcap介绍 1.WinPcap简介 WinPcap是一个在Windows操作系统下的免费、公开的用于直接访问网络的开发工具包(编程API)。大多数Windows网络应用程序都是通过Winsock API(Windows套接口)这类高级编程接口访问网络的。这种方法允许在网络上进行简单的数据传送,因为操作系统的TCP/IP协议栈实现软件会处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。 然而,有时候“简便方法”并不能满足实际需要。有些程序希望绕过TCP/IP协议栈,直接处理底层网络中的通信数据,它们需要对网络进行底层进行直接访问,即在没有类似协议栈(TCP/IP协议栈)的实体介入条件下对网络进行原始访问。 基于Winsock API编程,应用程序是通过调用操作系统提供的编程接口访问TCP/IP协议栈实现网络通信的。基于WinPcap编程,网络程序实际上是绕开操作系统的TCP/IP协议栈直接通过底层网络发送数据,因此,网络程序可以实现一些更低级、更灵活的功能。 2.WinPcap的组成与结构 如图 1.1,WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet.dll)和一个高层的不依赖于操作系统的静态库(wpcap.dll)共三个部分构成。这里,NPF在操作系统的内核级,packet.dll、wpcap.dll在用户级。 1)数据包监听设备驱动程序Array技术实现上,为了实现抓包,系统必须绕过操作系统 的协议栈来访问在网络上传输的原始数据包(raw packet)。这就要求WinPcap的一部分运行在操作系统核心 内部,直接与网络接口驱动交互。由于这个部分是系统依 赖(system dependent)的,在Winpcap的解决方案中它被 视为是一个设备驱动,称作NPF(Netgroup Packet Filter)。 图1.1 WinPcap的组成和结构

EXCEL常用函数大全

EXCEL常用函数大全(做表不求人!) 2013-12-03 00:00 我们在使用Excel制作表格整理数据的时候,常常要用到它的函数功能来自动统计处理表格中的数据。这里整理了Excel中使用频率最高的函数的功能、使用方法,以及这些函数在实际应用中的实例剖析,并配有详细的介绍。 1、ABS函数 函数名称:ABS 主要功能:求出相应数字的绝对值。 使用格式:ABS(number) 参数说明:number代表需要求绝对值的数值或引用的单元格。 应用举例:如果在B2单元格中输入公式:=ABS(A2),则在A2单元格中无论输入正数(如100)还是负数(如-100),B2中均显示出正数(如100)。 特别提醒:如果number参数不是数值,而是一些字符(如A等),则B2中返回错误值“#VALUE!”。

2、AND函数 函数名称:AND 主要功能:返回逻辑值:如果所有参数值均为逻辑“真(TRUE)”,则返回逻辑“真(TRUE)”,反之返回逻辑“假(FALSE)”。 使用格式:AND(logical1,logical2, ...) 参数说明:Logical1,Logical2,Logical3……:表示待测试的条件值或表达式,最多这30个。 应用举例:在C5单元格输入公式:=AND(A5>=60,B5>=60),确认。如果C5中返回TRUE,说明A5和B5中的数值均大于等于60,如果返回FALSE,说明A5和B5中的数值至少有一个小于60。 国美提醒:如果指定的逻辑条件参数中包含非逻辑值时,则函数返回错误值“#VALUE!”或“#NAME”。 3、AVERAGE函数 函数名称:AVERAGE 主要功能:求出所有参数的算术平均值。

基于WinPcap的网络分析研究与实现

基于WinPcap的网络分析研究与实现 摘要近几年,我国经济发展迅速,各个领域的事业都趋于完善。在网络信息技术的不断发展下,通过对WinPcap的应用,真正实现了Windows下网络数据包的捕获技术,下文将详细阐述IP、Tcp等等协议的解析过程。网络数据的储存通过msspl来实现,进而建立系统硬件运行环境。对局域网,通过测试实现了全局监控。 关键词信息技术;网络分析;分析与研究;运行环境;数据包;源代码 1 应用环境 网络监控系统承载介质中,硬件与软件监控系统共同构成网络监控。网络监控系统标准功能是对局域网中的违规行为进行记录与监控。在国外一些发达国家,有两款软件Ethereal与Sniffer,后者主要任务就是给网管及时提供网络监视情况与数据包捕以及故障分析等内容,这样能方便网管对现场进行迅速的故障处理以及诊断能力。与此同时,还能使用户得到更好的网络管理以及故障分析功能。前者作为一种可以捕获数据包,并且将这个数据包的信息显示出来,这样的一款网络数据包分析软件,在通用许可证的保障范围内,其数据包分析软件用户能免费得到。除此之外,还可以得到其源代码,并且也能够根据自身的需要来将其源代码进行修改。现阶段,Wireshark是全球应用最多的一种网络数据包分析软件[1]。 2 Win Pcap研究 抓包的过程,是通过用户级的程序接口来完成的。在这些接口中,用户程序能够利用内核驱动提供的高级特性。作为WinPcap所提供的2个库,PACKET 提供一个底层api,应用这个库能够访问驱动的函数。这些函数能够实现来抓包时,网络硬件与操作系统独立。NDIS作为一种管理网络适配器的驱动程序和协议驱动之间的规范。其还是一个可以让协议驱动发生与接收数据包并且不用看特定的适配器或者特定的Win32操作系统的封装。捕获数据包是通过NPF来实现的。在进行数据包的捕获时,数据包的监控任务是一个网络接口,进而应用程序才能够完整抹除这部分数据包。Bpf是一种虚拟的处理器,其能够编写一个用户过滤程序,过滤系统的基础就是这里。 2.1 NDIS驱动器接口标准 在传输层还有网络层以及数据链路层之间,是NDIS。其规范了网卡驱动与应用层协议驱动的通信接口。这与物理层没有关联。这样一来,就使上层协议驱动程序与底层任意类型的网卡进行通信。在进行网络驱动开发时,就不用研究操作系统的内核以及其他的驱动程序接口的相关事宜。将NDIS函数调用起来就可以,如此一来使操作系统的烦琐通信分离在网络驱动程序中,变得更加容易编写起来。除此之外,通过对NDIS的应用,使其封装性能够只应用在一层驱动的设

EXCEL电子表格中四个常用函数的用法

EXCEL电子表格中四个常用函数的用法 (2010-01-16 09:59:27) 转载▼ 分类:Excel学习 标签: 杂谈 EXCEL电子表格中四个常用函数的用 法 现在介绍四个常用函数的用法:COUNT(用于计算单元格区域中数字值的个数)、COUNTA(用于计算单元格区域中非空白单元格的个数)、COUNTBLANK(用于计算单元格区域中空白单元格的个数)、COUNTIF(用于计算符合一定条件的COUNTBLANK单元格个数)。 结合例子将具体介绍:如何利用函数COUNTA统计本班应考人数(总人数)、利用函数COUNT统计实际参加考试人数、利用函数COUNTBLANK统计各科缺考人数、利用函数COUNTIF统计各科各分数段的人数。首先,在上期最后形成的表格的最后添加一些字段名和合并一些单元格,见图1。 一、利用函数COUNTA统计本班的应考人数(总人数) 因为函数COUNTA可以计算出非空单元格的个数,所以我们在利用此函数时,选取本班学生名字所在单元格区域(B3~B12)作为统计对象,就可计算出本班的应考人数(总人数)。 1.选取存放本班总人数的单元格,此单元格是一个经过合并后的大单元格(C18~G18); 2.选取函数;单击菜单“插入/函数”或工具栏中的函数按钮f*,打开“粘贴函数”对话框,在“函数分类”列表中选择函数类别“统计”,然后在“函数名”列表中选择需要的函数“COUNTA”,按“确定”按钮退出“粘贴函数”对话框。 3.选取需要统计的单元格区域;在打开的“函数向导”对话框中,选取需要计算的单元格区域B3~B13,按下回车键以确认选取;“函数向导”对话框图再次出现在屏幕上,按下“确定”按钮,就可以看到计算出来本班的应考人数(总人数)了。

深度剖析WinPcap之(二)

深度剖析WinPcap之(二)——网络分析与嗅探的基础知识 工欲善其事,必先利其器。为了有利于深入了解WinPcap的内部机制,我们需要对网络分析与嗅探、网络模型与硬件基础作必要了解。 1.1 什么是网络分析与嗅探 网络分析(Network analysis) (也称为网络流量分析、协议分析、嗅探、数据包分析、窃听,等等)就是通过捕获网络流量并深入检查,来决定网络中发生了什么情况的过程。一个网络分析器对通用协议的数据包进行解码,并以可读的格式显示网络流量的内容。嗅探器(sniffer)是一种监视网络上所传输数据的程序。未经授权的嗅探器对网络安全构成威胁,因为它们很难被发现并且可在任何地方被插入,这使得它们成为黑客最喜欢使用的一种工具。 网络分析器之间的差别,在于诸如支持能解码的协议数量、用户接口、图形化与统计能力等主要特性的不同。其它的差别还包括了推理能力(比如,专家分析特性)与数据包解码的质量。尽管几个不同的网络分析器针对同一个协议进行解码,但在实际环境中可能其中的一些会比另外一些工作得更好。 图2-1为Wireshark网络分析器的显示窗口。一个典型的网络分析器用三个窗格显示所捕获的网络流量:

图2-1 Wireshark网络分析器的显示窗口 概要该窗格对所捕获的内容显示一行概要。包含日期、时间、源地址、目标地址、与最高层协议的名字与信息字段。 详情该窗格提供所捕获数据包所包含的每层细节信息(采用树形结构)。 数据该窗格用十六进制与文本格式显示原始的被捕获数据。 一个网络分析器是由硬件与软件共同组成。可以是一个带有特定软件的单独硬件设备,或者是安装在台式电脑或膝上电脑之上的一个软件。尽管每种产品之间具有差别,但都是由下列五个基本部分组成。 硬件多数网络分析器是基于软件的,并工作于标准的操作系统与网卡之上。然而,一些硬件网络分析器提供额外的功能,诸如分析硬件故障(比如循环冗余纠错(CRC)错误、电压问题、网线问题、抖动、逾限(jabber)、协商错误等等)。一些网络分析器仅支持以太网或无线网适配器,而其它的可支持多重适配器,并允许用户定制它们的配置。依据实际情况,可能也需要一个集线器或一个网线探针(cable tap)连接已有的网线。

WINPCAP编程环境设置

因为项目需要,而且以前从没用过Winpcap,所以不得不从头学起。以前虽然看过winsocket,但是,Winpcap的第一个程序,我花了很长时间才编译通过。对于初学者来说,不太好做的可能是编译程序之前应该做什么事。我就大体说一下我的过程。 首先先大体介绍下Winpcap。 winpcap(windows packet capture)windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能: 1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包; 2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉; 3> 在网络上发送原始的数据包; 4> 收集网络通信过程中的统计信息。 具体介绍参见https://www.360docs.net/doc/569578565.html,/view/696423.htm这里有Winpcap的详细介绍。 下面说一下你在编译Winpcap之前要做的事情。 1 下载Winpcap安装包,地址https://www.360docs.net/doc/569578565.html,/install/default.htm。 2 然后到https://www.360docs.net/doc/569578565.html,/devel.htm下载WinPcap developer's pack包,解压,里面有配置好的例子和include library。 3 在VC6.0菜单中,点Tolls->Options->Directories中的include files 和library files中添加包里面的include和library。 然后我们就来编写一个最简单的Winpcap程序——获取已连接的网络适配器列表。 首先新建一个工程,选择Win32 Console Application,工程名我们设为winpcap.然后这这个工程中新建一个C++源文件,名字winpcap。在里面填写如下代码: #include main( )

工作中最常用的excel函数公式大全(0001)

工作中最常用的excel函数公式大全

工作中最常用的excel函数公式大全 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。

2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。

2、统计不重复的总人数 公式:C2 =SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。 四、求和公式

1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3)说明:如果标题行没有规则用第2个公式 2、单条件求和 公式:F2 =SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法

3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。

利用Winpcap捕获发送数据包

利用winpcap捕获数据包、发送数据包 在上一章里面,我们学会了如何获取适配器的相关配置信息,在这一章里面,我们将继续更有意义的内容,就是捕获和发送数据包。 3.1 winpcap捕获数据包流程与相关函数 计算机是通过网卡和网络中其他的主机进行通信的,网卡相当于数据包进出的大门,我们平时讲的数据包的捕获相当于大门的门卫在检查进出的行人一样。在网络基础我们学习过,数据包的发送是一个封装的过程,而数据包的接收则是解封装的过程,但是封装和解封装都是在OS内核来完成的,一般的应用程序没办法获取数据包原始的内容,而Winpcap却能提供这样的功能,在数据链路层捕获数据包,提供最原始的信息。其中Winpcap捕获数据的原理在第一章已经介绍过了,大家可以回顾下。 另外,数据捕获只能捕获通过本主机网卡的数据,没法捕获其他主机上网卡的数据。 下面先看看Winpcap捕获数据时的工作流程。 数据捕获的流程 1. 发现网络设备的函数(find_dev_ex)以前已经介绍过了。 2.打开网卡的函数 打开设备的函数是pcap_open()。下面是参数snaplen, flags 和to_ms 的解释说明 pcap_t* pcap_open ( const char * source, // 指定的网卡的名称 int snaplen, // 帧的长度 int flags, // 网卡捕获的模式 int read_timeout, // 超时 struct pcap_rmtauth * auth, // 是否要求认证 char * errbuf // 错误信息存储 ) snaplen 制定要捕获数据包中的哪些部分。在一些操作系统中(比如xBSD 和Win32),驱动可以被配置成只捕获数据包的初始化部分:这样可以减少应用程序间复制数据的量,从而提高捕获效率。本例中,我们将值定为65535,它比我们能遇到的最大的MTU还要大。因此,我们确信我们总能收到完整的数据包。 flags: 最最重要的flag是用来指示适配器是否要被设置成混杂模式。一般情况下,适配器只接收发给它自己的数据包,而那些在其他机器之间通讯的数据包,将会被丢弃。相反,如果适配器是混杂模式,那么不管这个数据包是不是发给我的,我都会去捕获。也就是说,

开发基于winPcap的嗅探器.

网络安全课程设计报告(2015-2016 第一学期) 题目开发基于winPcap的嗅探器 专业 学号姓名 指导教师 日期

评 分分 细 评分项优秀良好中等差遵守机房规章制度 实验原理分析与设计 课题功能实现情况 设计验收与答辩 课程设计报告书写 简 短 评 语 教师签名: 年月日评 分 等 级 备 注

开发基于winPcap的嗅探器 一、实验目的 开发一个winpcap的嗅探器,用它来捕获所有流经网卡的数据包,并进行分析。二、实验环境 操作系统:Windows 2000/XP 编程环境:Visual c++6.0 附加库:Winpcap 三、实验内容和要求 内容:所开发的程序可以输出本机所有网卡的信息和捕获流经网卡的数据包并能够过滤出IP、TCP、UDP、ICM P等数据包 要求:掌握基于WinPcap的网络编程模式。 理解并能应用WinPcap设计并实现网络数据包的捕获与解析。 四、实验原理和步骤 原理:我们所要做的嗅探器是一种常用的网络数据收集软件,它是在广播式网络环境下利用计算机网络接口截获目的地为其它计算机的数据报文的一种工具。 在以太网中,信息是以明文的形式在网络上传输 ,当将网络适配器设置为混杂模式时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3标准的以太网采用的是持续CSMA的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截我们所要的信息,这是捕获数据包的物理基础。 首先,抓包系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包,这就要求一部分运行在操作系统核心内部,直接与网络接口驱动交互。这个部分是系统依赖的,在Winpcap的解决方案里它被认为是一个设备驱动,称作NPF(Netgroup PacketFilter)。 Winpcap提供了两个不同的库:Packet.dll和Wpcap.dll。Wpcap.dll提供了更加友好、功能更加强大的函数调用。WinPcap的优势在于提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来,便于开

相关文档
最新文档