基础知识
当前位置:首页 > 公文写作 > 基础知识 > 列表页

winpcap基础知识

小草范文网  发布于:2016-10-11  分类: 基础知识 手机版

篇一: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架构原理、相关环境搭建及快速编写核心代码。但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpcap开发库支持的编程语言,自己能动手实践编写一些例子。Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、python,好像连易语言都有。本系列文章将使用c语言来进行各种实验,有兴趣的读者可以将其转换成自己熟悉的语言来动手实践。

0×03 你能学到什么?

有关winpcap开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:

1.Winpcap获取网卡基本信息及收发数据包

2.存活主机探测

3.端口扫描

4.Arp欺骗

5.中间人攻击的简单实现

6. 流量统计与分析

0×04 知识补充

进行下面的介绍前,我们需要了解几个名词的关系。

winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。linux 平台下对应的开发包是libpcap。 Wireshark是基于winpcap处理网络驱动层。

Wpdpack是winpcap的开发包,提供开发相关程序的接口。

0×05 环境准备

首先根据你所选择的开发语言选择对应的编译器,笔者使用c语言,利用VS2012进行相关开发。

安装好编译器后,进行相关配置。下载wpdpack

点击这里

初学者可以选择里面的Examples进行编译,可以看到找不到头文件,及相关库。

这是因为wpdpack中的相关库还没有引入到编译环境中

将wpdpack包中的Include和lib文件夹中的文件添加到VS的相关目录下即可编译通过。将编译后的程序进行运行则出现以下错误。

这是由于运行时缺乏动态链接库导致,最简单的方法是直接下载并安装winpcap驱动程序 下载

如果你觉得这样子很麻烦,也可以采用简易方法。程序在运行时只需要winpcap在system32下面释放的wpcap.dll和packet.dll,还有driver下面的npf.sys,所以不需要完整安装winpcap,而选择只复制以上三个文件到对应目录中即可。

本节笔者将采用著名的Arpspoof源码进行相关讲解,源码下载地址/code/2287464_1/arpspoof.cpp.html

0×06 枚举可用网络适配器资源

在使用winpcap进行收发数据包时,需指定对应的网卡,所以有必要列出计算机上所有可用的网络适配资源。

列取网卡信息的核心代码:

篇二:WinPcap所涉及的Windows驱动基础知识(1)

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。

http://eslxf.blog.51cto.com/918801/196911

WinPcap所涉及的Windows驱动基础知识

<!--[if !supportLists]-->1.1<!--[e

ndif]-->Windows驱动的基础知识

本节主要描述在WinPcap的NPF中经常使用一些编写Windows驱动程序所需掌握的部分基础知识,以便于后面的理解。

<!--[if !supportLists]-->1.1.1 <!--[endif]-->驱动对象(DRIVER_OBJECT)

每个驱动程序都有唯一的驱动对象与之对应,该驱动对象在驱动程序被加载时由内核的对象管理程序所创建。

驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动程序的一个实例被内核加载,对一个驱动程序内核I/O管理器只加载一个实例。

驱动对象数据结构在wdm.h文件中的定义如下。

typedef struct _DRIVER_OBJECT {

CSHORT Type;

CSHORT Size;

/*

*DeviceObject为每个驱动程序所创建的一个或多个设备对象链表,

*Flags提供一个扩展的标识定位驱动对象

*/

PDEVICE_OBJECT DeviceObject;

ULONG Flags;

/*下列各成员字段描述驱动程序从哪儿被加载*/

PVOID DriverStart;

ULONG DriverSize;

PVOID DriverSection;

PDRIVER_EXTENSION DriverExtension;

/*

*DriverName成员被错误日志线程用来

*确定一个I/O请求越界的驱动名称

*/

UNICODE_STRING DriverName;

/*指向注册表中硬件信息的路径*/

PUNICODE_STRING HardwareDatabase;

/*

*如果驱动支持“fast I/O”,

*就指向一个“fast I/O”的派遣函数数组

*/

PFAST_IO_DISPATCH FastIoDispatch;

/*

*描述该特定驱动的入口点。

*主函数(major function)派遣函数表必须是对象最后的成员, *因此它仍然是可扩展的

*/

PDRIVER_INITIALIZE DriverInit;

PDRIVER_STARTIO DriverStartIo;

PDRIVER_UNLOAD DriverUnload;

PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];

} DRIVER_OBJECT;

typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;

下面分别描述驱动对象中驱动程序可访问的成员。

PDEVICE_OBJECT DeviceObject

每个驱动对象会有一个或多个设备对象。每个设备对象都有一个指针(NextDevice)指向下一个驱动对象,最后一个设备对象指向空。此处的DeviceObject指向驱动对象的第一个设备对象。该成员在成功调用IoCreateDevice后自动更新。一个驱动程序使用该程成员与设备对象(DEVICE_OBJECT)的NextDevice可遍历给驱动对象的所有设备对象。在驱动被卸载的时候,需要遍历每个设备对象,并将其删除。

PUNICODE_STRING HardwareDatabase

指向注册表中硬件配置信息的路径,用UNICODE字符串表示。该字符串一般为\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM。

PFAST_IO_DISPATCH FastIoDispatch

指向一个定义驱动快速 I/O结构体的入口点,该成员只用于文件系统驱动与网络传输驱动。

PDRIVER_INITIALIZE DriverInit

是DriverEntry例程的入口点,由I/O管理器设置。

PDRIVER_STARTIO DriverStartIo

是Startl0例程的的入口点,如果需要,由DriverEntry例程设置,否则为NULL。 PDRIVER_UNLOAD DriverUnload

指向驱动卸载时所用回调函数的入口点。

PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]

一个函数指针数组, 数组MajorFunction中的每个成员保存着一个指针,每一个指针指向一个处理对应IRP(IRP_MJ_XXX)的派遣函数(DispatchXxx)。

每个派遣函数(DispatchXxx)声明如下:

NTSTATUS (*PDRIVER_DISPATCH) (

IN PDEVICE_OBJECT DeviceObject,

IN PIRP Irp

);

<!--[if !supportLists]-->1.1.2 <!--[endif]-->设备对象(DEVICE_OBJECT)

设备对象保存设备特征和状态的信息。一个设备对象表示一个逻辑的、虚拟的或物理的设备,由一个驱动对象操控设备对象的I/O请求。每一个内核模式的驱动必须创建设备对象,通过调用IoCreateDevice一次或多次。

每个驱动程序会创建一个或多个设备对象,用DEVICE_OBJECT数据结构表示。每个设备对象有一个指针(NextDevice)指向下一个设备对象,从而形成一个设备链表。设备链表第一个设备是由驱动对象结构体中DeviceObject指明的。

设备对象数据结构在wdm.h文件中的定义如下。

typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {

CSHORT Type;

USHORT Size;

LONG ReferenceCount;

struct _DRIVER_OBJECT *DriverObject;

struct _DEVICE_OBJECT *NextDevice;

struct _DEVICE_OBJECT *AttachedDevice;

struct _IRP *CurrentIrp;

PIO_TIMER Timer;

ULONG Flags;

ULONG Characteristics;

__volatile PVPB Vpb;

PVOID DeviceExtension;

DEVICE_TYPE DeviceType;

CCHAR StackSize;

union {

LIST_ENTRY ListEntry;

WAIT_CONTEXT_BLOCK Wcb;

} Queue;

ULONG AlignmentRequirement;

KDEVICE_QUEUE DeviceQueue;

KDPC Dpc;

/*

*下列成员是为支持文件系统的互斥操作,

*为了对文件系统处理线程使用设备的计数保持跟踪

*/

ULONG ActiveThreadCount;

PSECURITY_DESCRIPTOR SecurityDescr

winpcap基础知识

iptor;

KEVENT DeviceLock;

USHORT SectorSize;

USHORT Spare1;

struct _DEVOBJ_EXTENSION *DeviceObjectExtension;

PVOID Reserved;

} DEVICE_OBJECT;

typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;

下面分别描述设备对象中驱动程序可访问的成员。

PDRIVER_OBJECT DriverObject

指向驱动程序中的驱动对象。同属于一个驱动程序的驱动对象指向的是同一个驱动对象。

PDEVICE_OBJECT NextDevice

指向下一个设备对象。这里的下一个设备对象是同一个驱动程序创建的若干设备对象。每个设备对象根据NextDevice域形成链表,从而可以遍历每个设备对象。在每次成功调用IoCreateDevice 后I/O管理器更新该链表。在驱动被卸载的时候,需要遍历该链表,删除每个设备对象。

PIRP CurrentIrp

如果驱动使用Startl0例程时,此成员指向当前IRP结构。否则为NULL。 ULONG Flags

此成员是一个32位昀无符号整型,每个位有不同的含义。通过位或操作为新创建的设备对象设置不同的特性。

ULONG Characteristics

篇三:深度剖析WinPcap

深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(1)

工欲善其事,必先利其器。为了有利于深入了解WinPcap的内部机制,我们需要对网络分析与嗅探、网络模型与硬件基础作必要了解。

1.1 什么是网络分析与嗅探

网络分析(Network analysis) (也称为网络流量分析、协议分析、嗅探、数据包分析、窃听,等等)就是通过捕获网络流量并深入检查,来决定网络中发生了什么情况的过程。一个网络分析器对通用协议的数据包进行解码,并以可读的格式显示网络流量的内容。嗅探器(sniffer)是一种监视网络上所传输数据的程序。未经授权的嗅探器对网络安全构成威胁,因为它们很难被发现并且可在任何地方被插入,这使得它们成为黑客最喜欢使用的一种工具。

网络分析器之间的差别,在于诸如支持能解码的协议数量、用户接口、图形化与统计能力等主要特性的不同。其它的差别还包括了推理能力(比如,专家分析特性)与数据包解码的质量。尽管几个不同的网络分析器针对同一个协议进行解码,但在实际环境中可能其中的一些会比另外一些工作得更好。

图2-1为Wireshark网络分析器的显示窗口。一个典型的网络分析器用三个窗格显示所捕获的网络流量:

图2-1 Wireshark网络分析器的显示窗口

概要 该窗格对所捕获的内容显示一行概要。包含日期、时间、源地址、目标地址、与最高层协议的名字与信息字段。

详情 该窗格提供所捕获数据包所包含的每层细节信息(采用树形结构)。

数据 该窗格用十六进制与文本格式显示原始的被捕获数据。

一个网络分析器是由硬件与软件共同组成。可以是一个带有特定软件的单独硬件设备,或者是安装在台式电脑或膝上电脑之上的一个软件。尽管每种产品之间具有差别,但都是由下列五个基本部分组成。

硬件 多数网络分析器是基于软件的,并工作于标准的操作系统与网卡之上。然而,一些硬件网络分析器提供额外的功能,诸如分析硬件故障(比如循环冗余纠错(CRC)错误、电压问题、网线问题、抖动、逾限(jabber)、协商错误等等)。一些网络分析器仅支持以太网或无线网适配器,而其它的可支持多重适配器,并允许用户定制它们的配置。依据实际情况,可能也需要一个集线器或一个网线探针(cable tap)连接已有的网线。

捕获驱动器 这是网络分析器中负责从网线上捕获原始网络流量的部分。它滤出了所需保持的流量,并把所捕的获数据保存在一个缓冲区中。这是网络分析器的核心——没有它就无法捕获数据。 缓冲区 该组件存储所捕获的数据。数据能够被存入一个缓冲区中只到该缓冲区被填满为止,或者采用循环缓冲的方式,那么最新的数据将会替换最旧的数据。采用磁盘或内存均可实现缓冲区。 实时分析 当数据一离开网线,该特性就可对数据执行分析。一些网络分析器利用该特性发现网络性能问题、同时网络入侵检测系统利用它寻找入侵活动。

解码(器) 该组件显示网络流量的内容(带有描述),所以是可读的 。解码是特定于每个协议的,因此网络分析器当前支持可解码的协议数目是变化的,网络分析器可能经常加入新的解码

1.2 谁需要使用网络分析?

系统管理员、网络工程师、安全工程师、系统操作员、与程序员都需要使用网络分析器,其对诊断与解决网络问题、系统配置问题、与应用程序的难点(或瓶颈)都是无价的工具。在历史上,网络分析器曾经专注于昂贵与难于使用的硬件设备。然而,新出现的先进技术允许基于软件进行网络分析器开发,其为有效解决网络问题提供了一种更为方便与廉价的工具,它也具备网络分析的能力。

网络分析的技术是一个双刃剑。当网络、系统、与安全的专业人员使用它处理网络故障与监视网络时,入侵者为了非法的目的正在使用网络分析器。网络分析器是一种工具,就像所有的工具一样,它可被用在好的与坏的目的之上。

网络分析器的用途为:

? 将在数据包中的二进值数据转换成易读的格式

? 处理网络故障

? 分析网络性能以发现瓶颈

? 网络入侵检测

? 为了辩护与证据记录网络流量

? 分析应用程序的操作

? 发现有问题的网卡

? 发现病毒爆发的源头或拒绝服务(DoS)的攻击

? 发现间谍软体

? 在开发阶段对网络编程进行调试

? 发现一部泄密的计算机

? 确认符合公司的政策

? 学习协议时作为学习的资源

? Reverse-engineering protocols to write clients and supporting programs(逆向工程协议去写客户与支持计划

1.2.1 入侵者如何使用嗅探器?

当被心怀恶意的人使用时,嗅探器能对网络安全构成重要威胁。网络入侵者使用嗅探的方式获取秘密的信息,嗅探和窃听在该应用中通常是相互关联的。然而,嗅探正成为一个非负面的术语;大多数人互换地使用嗅探和网络分析这两个术语。

以非法方式使用一个嗅探器被视为一个被动的攻击,因为它不直接与网络上任何其它系统相互作用或连接。一个嗅探器也能被安装在网络的一台计算机上,并作为一个主动攻击的泄密部分。嗅探器的被动特性使得很难被检测(用的检测方法稍后详细说明)。

入侵者在网络上使用嗅探器做下列事情:

? 取得明文的用户名和密码

? 发现一个网络上用户的使用模式(usage patterns)

? 泄密私有信息

? 捕获与回放VoIP电话通话

? 映射网络的部署

? 被动的操作系统指纹识别(Passive OS fingerprinting)

上述都是嗅探器的非法使用,除非你是一个渗透测试人员,找出并报告这些类型的弱点就是你的工作。为了嗅探,一个入侵者首先得获取所感兴趣系统的通信网线的访问权,这意谓着要在同一共享网段上或在通信路径之间的网线某处接入探针。

如果侵入者不是与目标系统或通信访问点(AP)物理接触,仍然有方法嗅探网络流量,包括: ? 闯入一部目标计算机而且安装远程嗅探器

? 闯入一个通信访问点(举例来说,一个因特网服务提供着[ISP]) 并安装嗅探软件。 ? 在已经装入嗅探软件的ISP上定位一个系统

? 使用社会的工程学(social engineering)得到一个ISP的物理访问,安装一个数据包嗅探器

? 在目标计算机组织或ISP内部有一个同谋者,并在那儿安装嗅探器。

? 重定向或复制通信(Redirecting or copying communications),使路径包含入侵者的计算机

嗅探程序大多数都包含了rootkits工具,该工具安装在泄密系统中是极具代表性的。Rootkits通过替换命令和使用、并清除日志条目,被用来掩盖入侵者的踪迹。

入侵者也安装其它的程序,像嗅探器,键盘记录器和后门软件。Windows嗅探可作为远程操控特洛伊(RAT)的一部分被实现,诸如SubSeven 或Back Orifice。

入侵者通常使用嗅探程序,并把嗅探程序配置成能检测特定事情(如密码)的状态, 然后把所嗅探的事情发送给入侵者(或者储存它们,由入侵者稍后取回)。易受该类活动攻击的协议包括Telnet、文件传送协议(FTP)、第3版邮局协议 (POP3) 、网际报文存取协议 (IMAP)、简单邮件传输协议(SMTP)、 超文本传输协议 (HTTP)、远程登录 (rlogin)和简单网络管理协议(SNMP)。

rootkit 的一个例子是在 Solaris 和 Linux 上工作的“T0rnKit”,和rootkit 包含在一起的嗅探器叫做“t0rns”,并被安装在隐藏目录/usr/srec/.puta中。rootkit的另一个例子是 Linux Rootkit 5(Lrk5)和linsniff嗅探器一起安装。

入侵者也可以使用嗅探程序控制后门(这一个实践不是相当“常见的” ,但并不是没听说过)。一个方法是将在一个监听特定信息的嗅探器安装在目标系统上,然后发送后门控制信息到一个邻近的系统。因为嗅探器固有的被动特性,该类型的后门控制很难被发现。 cd00r就是一个后门嗅探的例子,并在非混杂模态中操作,它很难被检测到。

1.2.2 被嗅探的数据看起来像什么?

最容易领会嗅探器概念的方法就是在实际应用中看一看具体实例。图2-2演示了从一台电脑连接到一个 Linux系统请求FTP服务器服务,并通过Wireshark嗅探传输的数据包。第一、二个数据包显示了采用数据包嗅探器,获得用户名与密码是多么容易的事情(也就是,从数据包直接可知用户名为lxf和密码为lxf)。

图2-2 嗅探一个连接

1.2.3 常见的网络分析器

本文已影响