logo资料库

数据链路层监听实现winpcap.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
(贵州大学计算机软件与理论研究所)
基于数据链路层的网络监听的应用研究 蔡 超 李 祥 (贵州大学计算机软件与理论研究所) 引言 网络技术的发展,彻底改变了信息的处理和访问模式,网络技术已覆盖了社会生活的 方方面面,构成了信息社会的核心,但随之而来的非法入侵也一直威胁着计算机网络系统的 安全。由于信息设施的很多脆弱性在入侵者间广为人知,而且在 Internet 上很容易获得针对 这些脆弱性的攻击工具,任何攻击者只需要在设备上投入极少的资金、掌握中级水平的技术 能力、拥有一套容易组装的工具以及了解一些可以从网上或其他开放资源处获悉的系统脆弱 性和攻击技术,就可以轻松达到其攻击目的获取重要信息。 计算机犯罪活动一直使各大公司遭受着巨大的经济损失。信用卡公司、电话公司以及 金融机构都在这样一个计算机犯罪猛增的大环境下进行经营,连微软、IBM 等这样的世界 级巨头都无法幸免。在世界范围内,有组织的计算机犯罪集团已经成了执法机关的关注对象。 这些犯罪集团借助于高科技,其目的多种多样,不只为获取经济利益和竞争优势,还试图获 取警务计算机和网络中保存的敏感性执法信息,从而为破案增加了难度。 网络安全日益受到各界的关注,各种网络安全措施应运而生,防火墙,入侵检测,入 侵取证等技术迅猛发展。 监听与网络攻击与防护 网络监听技术是实现网络监测,入侵检测,入侵取证的系统的基石。使用网络监听技 术可以发现入侵并对入侵者进行追踪定位,在对网络犯罪进行侦查取证时获取有关犯罪行为 的重要信息,成为打击网络犯罪的有力手段。 另一方面,网络监听程序通常被一些黑客用作网络攻击的辅助手段,网络监听工作在 网络环境的底层,捕获网络上传送的数据,经过处理后可以分析出数据包的内容,进而分析 所处的网络状态和整体布局。通过解析数据包的内容黑客可以轻易的窃取明文传送的口令、 金融帐号等重要信息,通过取得低级协议信息可以进行 IP 欺骗等攻击活动。 网络监听的基本原理 以太网数据传输是通过广播实现的,将要发送的数据包发往连接在一起的所有主机, 包中包含着应该接收数据包主机的正确地址,只有与数据包中目标地址一致的那台主机才能 接收。但是,当主机工作监听模式下,无论数据包中的目标地址是什么,只要经过自己网络 接口,主机都将接收。
图:数据包接受过程 当网络中的两台主机通信的时候,源主机将写有目的的主机地址的数据包发向目的主 机。TCP/IP 协议中数据包从 IP 层交给数据链路层,而网络接口是不会识别 IP 地址的,因此 在网络接口数据包又增加了一部分以太帧头的信息。在帧头中有两个域,分别为只有网络接 口才能识别的源主机和目的主机的物理地址,这是一个与 IP 地址相对应的 48 位的 MAC 地 址。当数据帧到达一台主机的网络接口时,正常情况下,网络接口读入数据帧,如果数据帧 中携带的物理地址是自己的或者是广播地址,则将数据帧交给上层协议软件,也就是 IP 层, 否则就将这个帧丢弃。对于每一个到达网络接口的数据帧,都要进行这个过程。然而,当主 机 工 作 在 监 听 模 式 下 , 所 有 的 数 据 帧 都 将 被 交 给 上 层 协 议 软 件 处 理 。
图中清楚地表示了 TCP/IP 协议栈及以太网中的数据传送的层次关系。 常用的以太网卡支持以下工作模式:广播模式、多播模式、直接模式和混杂模式。 网卡在设置为广播模式时,它将会接收所有目的地址为广播地址的数据包,一般所有 的网卡都会设置为这个模式。 网卡在设置为多播模式时,当数据包的目的地址为多播地址,而且网卡地址是属于那 个多播地址所代表的多播组时,网卡将接纳此数据包,即使一个网卡并不是一个多播组的成 员,程序也可以将网卡设置为多播模式而接收那些多播的数据包。 网卡在设置为直接模式时,只有当数据包的目的地址为网卡自己的地址时,网卡才接 收它。 网卡在设置为混杂模式时,它将接收所有经过的数据包,这个特性是编写网络监听程 序的关键。 监听的实施 1. 广播式以太网 使用共享介质的以太网,实施监听仅需在监听主机的直接运行监听程序即可。 2.交换式以太网 由于交换式以太网采用了交换机,以太网中的数据帧并不经过每台主机,所以无法直 接实施监听,但可采用以下方案: a. MAC 地址溢出:迫使交换机接受大量含有错误的 MAC 地址的数据帧,造成其溢 出。这样交换机就会退化工作在 HUB 的广播方式。 b. MAC 伪装:通过伪装成其他主机的 MAC 地址,从而获取发往其他主机的数据包 实现数据分组的捕获 在捕获 IP 层分组时常使用 RAW SOCKET 编程实现,Socket 最初是由 U.C. Berkeley 大学为 UNIX 操作系统开发的网络通信接口。Microsoft 基于此实现了 Windows Sockets 规 范,即 windows 网络编程接口。Socket 定义了一组标准例行函数,应用程序通过调用这些 函 数 可 以 和 不 同 网 络 应 用 程 序 进 行 通 讯 而 不 必 考 虑 不 同 的 网 络 协 议 。 原 始 套 接 字 (SOCKET_RAW)允许对较底层的协议,如 IP,ICMP 直接访问,由此来实现网络监听。 (注:Linux 的特殊套接字 SocKPacket 可获取数据链路层的数据帧)。 数据链路层是网络中基本数据分组――数据帧的传输层,对以太网数据帧的捕获,为 入侵分析提供了更为详实的数据源。在某些情况下可以直观的检测到 IP 欺骗,MAC flooding 等常见网络攻击。因此,捕获数据帧的监听比捕获 IP 数据包的监听,通常要有效得多。 操作系统所提供的分组捕获机制主要有三种:BPF(Berkeley Packet Filiter),DLPI(Data Link Provide Interface),即 SOCK_PACKET 型特殊套接字。基于 BSD 的系统使用 BPF,基于 SVR4 的 系 统 使 DLPI , Linux 可 使 用 SOCK_PACKET 。 从 性 能 上 看 BPF 比 DLPI 更 好 , 而 SCOCK_PACKET 最弱。SCO OpenServer 虽然本身没有内置 BPF 模块,但有作为可压入内 核的 STREAMS 模块 BPF。 WIN32 平 台 不 提 供 直 接 的 网 络 底 层 访 问 接 口 , 必 须 通 过 虚 拟 设 备 驱 动 程 序 (VxD,Virtual Device Driver)实现网络监听的功能,VxD 驱动程序提供外部程序和网卡 NIC 之间的接口,其工作原理示意图如下:
Libpcap(其 Windows 版本为 Winpcap)是一种与系统无关,采用分组捕获机制的分组 捕获函数库,用于访问数据链路层。Libcap 在不同的平台上采用统一的编程接口,使用 libcap 编写的程序可自由的跨平台使用。 Windows 并未提供内置的分组捕获机制,这一功能由应用系统提供,Winpcap 使用 BPF 虚拟机(NPF)补充了这一机制。NPF 在 Windows 95/98/ME 中以 VXD 文件的方式实现, 在 windows2000 中以 SYS 文件的方式实现。 由于 Libpcap 的平台无关性及其优异的性能,下面将论述基于 Libpcap 的高性能网络监听器 的实现。 Libpcap 的体系结构 Libcap 接口支持基于 BSD 数据过滤器(BPF)的数据过滤机制。Winpcap 是基于 NPF 机制 的,NPF 于 BPF 最大的不同在于采用的内核缓存的形式不同。Libpcap 是基于程序员的角度 设计的,它帮助程序员实现了应用程序与操作系统内核的接口。Libpcap 提供了一组强大而 高效的函数来实现数据包的捕获,同时提供了用户数据缓存用于存储来自与内核的数据包, 有效防止应用程序进入系统内核管理的存储区域,提高程序的健壮性。
基于 BSD 的 Libpcap 结构
Winpcap 与 NPF Libpcap 由二十多个 C 程序文件组成,按功能大致分为以下几个部分: 1) 打开,读取设备,设置过滤部分 2) 编译、优化、调试过滤部分 3) 脱机方式监听部分 4) 本地网络设置检测部分 5) 主控程序及版本部分 Libpcap 数据包捕获程序流程 1. 获取本地设备信息。 通过函数 pcap_lookupdev 寻找系统中可用的网络接口设备,返回一个表示网络适配器 的字符串。 2. 打开设备开始监听会话 通过函数 pcap_open_live()建立监听会话。 Pcap_t *pcap_open_live(char *device,int snaplen,int promisc,int to_ms,char *ebuf) 其中: device 为上一步中所提到的网络适配器的字符串,snaplen 定义监听程序所捕获的最大 字节数,promisc 定义是否将网络适配器设置为混杂模式。to_ms 定义读操作的时间。 Ebuf 函数调用失败时返回错误信息字符串。 3. 设置过滤条件 编辑过滤字符串,设置过滤器,制定要捕获的主机、协议等,可以有效的捕获指定类型 的数据。 通 过 函 数 pcap_compile 将 过 滤 字 符 串 编 译 为 二 进 制 。 常 用 的 过 滤 字 符 串 有 “host 210.40.7.129”表示捕获主机 210.40.7.129 收发的数据帧,“tcp”表示捕获协议类型为 TCP 的数据帧,“port 20” 表示捕获目的或源端口是 20 的数据帧等等,很多过滤字符串还 能进行组合。 由 pcap_setfilter()函数进行内核过滤器的设置生效。 4. 执行捕获循环 每捕获一个数据包后就调用用户的回调函数对数据包进行处理,以上功能可通过调用以 下 两 个 函 数 实 现 pcap_dispatch,pcap_loop, 它 们 的 功 能 基 本 相 同 , 唯 一 的 差 别 在 于 pcap_loop 在读取超时时不会返回。 监听程序性能的调整 在需提高监听程序性能时可做以下相应调整。 1. 调整用户级缓存。通过修改 pcap_open_live()函数的源代码并重新编译后来调整用户级缓 存。 2. 调整函数 pcap_open_live()中的读操作等待时间值。通常出于效率可将该值设置的比较 大;但当对响应时间要求比较高时,应将该值改小。 3. 设置严格的过虑条件。 4. 在基于 WIN32 平台,winpcap 中还可以通过函数 pcap_setbuff()来设置内核缓存,通常情 况,要取得较好的性能应设置较大的内核缓存。 数据帧的协议解析
捕获后的数据帧经过解析才能得到我们想要的信息,如作为网络监听所需要的数据帧的源地 址,目的地址,协议类型等信息。 解析的过程是将数据帧中的数据按不同协议进行分析提取。首先,要按照不同协议数据组织 格式定义效应数据类型,下面根据以太网网数据帧的格式及 TCP/IP 协议栈定义相关数据类 型。 定义以太帧的头部数据类型: typedef struct { UCHAR DestMac[6]; UCHAR SrcMac[6]; UCHAR Etype[2]; }ETHHEADER; 注意网络接口卡驱动程序会负责计算效验和,并取走帧中的前同步字符和效验字段。 根据 IP 数据包的封装格式定义 IP 头部的相应数据类型: typedef struct { UCHAR header_len:4; UCHAR version:4; UCHAR tos:8; USHORT total_len:16; USHORT ident:16; // type of service // length of the packet // unique identifier
USHORT flags:16; UCHAR ttl:8; UCHAR proto:8; USHORT checksum:16; UCHAR sourceIP[4]; UCHAR destIP[4]; // protocol ( IP , TCP, UDP etc) }IPHEADER; 可根据以上示例定其他协议的相应数据结构。 网络监听程序实例 以下将通过本人利用 winpcap 及 MFC 开发的网络监听程序,来进一步阐述利用 libpcap 开发网络监听程序的方法。以下仅分析程序的监听部分。 1. 数据类型定义 为了实现捕获数据的解析定义了相关数据类型:(在文件 decode.h 中定义) //定义协议类型名称 char *Proto[] = {"Reserved", "ICMP", "IGMP", "GGP", "IP", "ST", "TCP", "UCL", "EGP", "IGP", "BBN-RCC-MON", "NVP-II", "PUP", "ARGUS", "EMCON", "XNET", "CHAOS", "UDP", "MUX", "I-NLSP", "SWIPE", "NHRP", "DCN-MEAS", "HMP", "PRM", "XNS-IDP", "TRUNK-1", "TRUNK-2", "LEAF-1", "LEAF-2", "RDP", "IRTP", "ISO-TP4", "NETBLT","MFE-NSP", "MERIT-INP", "SEP", "3PC", "IDPR", "XTP", "DDP", "IDPR-CMTP", "TP++", "IL", "SIP", "SDRP", "SIP-SR", "SIP-FRAG", "IDRP", "RSVP", "GRE", "MHRP", "BNA", "SIPP-ESP", "SIPP-AH", "unassigned","unassigned", "unassigned", "unassigned", "unassigned","any host internal protocol", "CFTP", "any local network", "SAT-EXPAK", "KRYPTOLAN", "RVD", "IPPC", "any distributed file system", "SAT-MON", "VISA", "IPCV", "CPNX", "CPHB", "WSN", "PVP", "BR-SAT-MON", "SUN-ND", "WB-MON", "WB-EXPAK", "ISO-IP", "VMTP", "SECURE-VMTP", "VINES", "TTP", "NSFNET-IGP", "DGP", "TCF", "IGRP", "OSPFIGP", "Sprite-RPC", "LARP", "MTP", "AX.25", "IPIP", "MICP", "SCC-SP", "ETHERIP", "ENCAP", "any private encryption scheme", "GMTP"}; typedef struct{ //定义以太帧的头部数据类型 "unassigned", UCHAR DestMac[6]; UCHAR SrcMac[6]; UCHAR Etype[2]; }ETHHEADER; { typedef struct //IP 头部的数据类型 UCHAR header_len:4; UCHAR version:4; UCHAR tos:8; USHORT total_len:16; USHORT ident:16; USHORT flags:16; UCHAR ttl:8; // type of service // length of the packet // unique identifier
分享到:
收藏