




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux下利用PF_PACKET协议族捕包方法先放一段示例程序,这段程序我在RH9和AS4下编译通过,程序功能就是用从2.2内核加入的PF_PACKET协议族来进行底层数据包捕获并显示。 PF_PACKET协议族是与系统TCP/IP协议栈并行的同级别模块,即从PF_PACKET协议族得到的数据包是没有经过系统TCP/IP协议栈处理的。而且,通过设置混杂模式,可以很容易的实现sniffer。#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define RED E31mE1m#define GREEN E32mE1m#define YELLOW E33mE1m#define BLUE E34mE1m#define NORMAL Emint Get_IfaceIndex(int fd, const char* interfaceName)struct ifreq ifr;if (interfaceName = NULL) return -1;memset(&ifr, 0, sizeof(ifr);strcpy(ifr.ifr_name, interfaceName);if (ioctl(fd, SIOCGIFINDEX, &ifr) = -1) printf(RED ioctl errorn); return -1;return ifr.ifr_ifindex;int set_Iface_promisc(int fd, int dev_id)struct packet_mreq mr;memset(&mr,0,sizeof(mr);mr.mr_ifindex = dev_id;mr.mr_type = PACKET_MR_PROMISC;if(setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,&mr,sizeof(mr)=-1) fprintf(stderr,GREEN set promisc failed! n); return -1;return 0;void usage(char *exename)fprintf(stderr,RED%s nNORMAL, exename);int main(int argc, char *argv)int listen_fd;int ipak=0,maxk=0;char buffer8192;int frmlen;struct sockaddr_ll sll;struct iphdr *ip;if(argc 3) usage(argv0); return -1;listen_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL);sll.sll_family = AF_PACKET;sll.sll_ifindex = Get_IfaceIndex(listen_fd,argv1);sll.sll_protocol = htons(ETH_P_ALL);if(bind(listen_fd,(struct sockaddr *)(&sll),sizeof(sll)=-1) fprintf(stderr,YELLOWbind error:%s !nNORMAL,strerror(errno); goto FAIL;if(set_Iface_promisc(listen_fd,sll.sll_ifindex) = -1) fprintf(stderr,BLUE set promisc failed !n); goto FAIL;maxk = atoi(argv2);while(!maxk | ipak flags (MSG_PEEK,MSG_OOB,MSG_WAITALL,MSG_TRUNC) ip = (struct iphdr *)(buffer + sizeof(struct ethhdr); printf(NORMAL IP Packet from: %sn,inet_ntoa(*(struct in_addr*)&ip-saddr); printf(NORMAL -IP Packet To: %sn,inet_ntoa(*(struct in_addr*)&ip-daddr); printf(NORMAL -IP Protocol: %dn,(ip-protocol); printf(NORMAL -Buffer Length: %d bytesn,frmlen); printf(NORMAL buffer Content: %snn,buffer); ipak+;return 0;FAIL:close(listen_fd);return -1;解释说明:#include #include /* 需要里面的 glibc 版本号 */#if _GLIBC_ = 2 & _GLIBC_MINOR = 1#include #include /* 链路层(L2)协议 */#else#include #include #include /* 链路层协议 */#endifpacket_socket=socket(PF_PACKET,intsocket_type,intprotocol);DESCRIPTION 描述分组套接口(也译为插口或套接字)被用于在设备层(OSI 的链路层) 收发原始(raw )分组。它允许用户在用户空间实现在物理层之上的协议模块。对于包含链路层报头的原始分组,socket_type 参数是 SOCK_RAW;对于去除了链路层报头的加工过的分组,socket_type 参数是 SOCK_DGRAM。链路层报头信息可在作为一般格式的 sockaddr_ll 中的中得到。socket 的 protocol 参数指的是 IEEE 802.3 的按网络层排序的协议号,在头文件中有所有被允许的协议的列表。当 protocol 被设置为 htons(ETH_P_ALL)时,可以接收所有的协议。到来的此种类型的分组在传送到在内核实现的协议之前要先传送给分组套接口。只有有效 uid 是 0 或有 CAP_NET_RAW 能力的进程可以打开分组套接口。传送到设备和从设备传送来的 SOCK_RAW 分组不改变任何分组数据。当收到一个 SOCK_RAW 分组时, 地址仍被分析并传送到一个标准的 sockaddr_ll 地址结构中。当发送一个 SOCK_RAW 分组时, 用户供给的缓冲区应该包含物理层报头。接着此分组不加修改的放入目的地址定义的接口的网络驱动程序的队列中。一些设备驱动程序总是增加其他报头。 SOCK_RAW 分组与已被废弃的 Linux 2.0 的 SOCK_PACKET 分组类似但不兼容。对 SOCK_DGRAM 分组的操作要稍微高一层次。在分组被传送到用户之前物理报头已被去除。从 SOCK_DGRAM分组套接口送出的分组在被放入网络驱动程序的队列之前,基于在 sockaddr_ll 中的目的地址得到一个适合的物理层报头。缺省的所有特定协议类型的分组被发送到分组套接口。为了只从特定的接口得到分组,使用bind(2)来指定一个在 sockaddr_ll 结构中的地址,以此把一个分组套接口绑定到一个接口上。只有地址字段 sll_protocol 和 sll_ifindex 被绑定用途所使用。不支持在分组套接口上的 connect(2) 操作。(不能作为客户端使用)ADDRESS TYPES 地址类型sockaddr_ll 是设备无关的物理层地址。struct sockaddr_llunsigned short sll_family; /* 总是 AF_PACKET */unsigned short sll_protocol; /* 物理层的协议 */int sll_ifindex; /* 接口号 */unsigned short sll_hatype; /* 报头类型 */unsigned char sll_pkttype; /* 分组类型 */unsigned char sll_halen; /* 地址长度 */unsigned char sll_addr8; /* 物理层地址 */;sll_protocol 是在 linux/if_ether.h 头文件中定义的按网络层排序的标准的以太桢协议类型。sll_ifindex 是接口的索引号(参见 netdevice(2);0 匹配所有的接口(当然只有合法的才用于绑定)。 sll_hatype 是在 linux/if_arp.h 中定义的 ARP 硬件地址类型。 sll_pkttype 包含分组类型。有效的分组类型是:目标地址是本地主机的分组用的 PACKET_HOST,物理层广播分组用的 PACKET_BROADCAST ,发送到一个物理层多路广播地址的分组用的 PACKET_MULTICAST,在混杂(promiscuous)模式下的设备驱动器发向其他主机的分组用的 PACKET_OTHERHOST,本源于本地主机的分组被环回到分组套接口用的 PACKET_OUTGOING。这些类型只对接收到的分组有意义。sll_addr 和 sll_halen 包括物理层(例如 IEEE 802.3)地址和地址长度。精确的解释依赖于设备。译注: (1) 对于以太网(ethernet) OSI 模型不完全适用,以太桢定义包括物理层和链路层的基本内容, 所谓的以太桢协议类型标识的是网络层的协议。IEEE 802 委员会为与 OSI 相一致,把以太桢定义称为 MAC(medium access control)层,在 MAC 层与网络层之间加入 LLC (logical link control)层,补充上了 OSI 标准的链路层。但在BSD TCP/IP 中是为了兼容官方标准才被实现的。对于 TCP/IP 协议族 OSI 模型也不完全适用,TCP/IP 没定义链路层,只能用 UNIX 的设备驱动程序去对应链路层。无论如何这是既成事实,在本手册页中物理层、链路层、设备层指的都是以太网的 MAC 层。余以为不必严格按层次划分去理解问题,现在这个协议栈是优胜劣汰的结果,不是委员会讨论出来的。 (2) 以太网地址分为三类,物理地址(最高位为0),多路广播地址 (最高位为1),广播地址(全是1)。以 DP8390 为例,它的接收配置寄存器的 D2 位用来指定 NIC 是否接受广播桢,D3 位用来指定 NIC 是否对多路广播桢进行过滤,D4 位用来指定 NIC是否接受所有的物理地址桢。混杂(Promiscuous)模式就是接收所有物理地址桢。SOCKET OPTIONS 套接口选项分组套接口可被用来配置物理层的多路广播和混杂模式。配置通过调用 setsockopt(2)实现,套接口参数是一个分组套接口、层次参数为 SOL_PACKET 、选项参数中的 PACKET_ADD_MEMBERSHIP 用于增加一个绑定,选项参数中的 PACKET_DROP_MEMBERSHIP 用于删除一个绑定。两个选项都需要作为参数的 packet_mreq 结构:struct packet_mreqint mr_ifindex; /* 接口索引号 */unsigned short mr_type; /* 动作 */unsigned short mr_alen; /* 地址长度 */unsigned char mr_address8; /* 物理层地址 */;mr_ifindex 包括接口的接口索引号,mr_ifindex 的状态是可以改变的。mr_type 参数指定完成那个动作。PACKET_MR_PROMISC 允许接收在共享介质上的所有分组,这种接受状态常被称为混杂模式; PACKET_MR_MULTICAST 把套接口绑定到由mr_address 和 mr_alen 指定的物理层多路广播组上;PACKET_MR_ALLMULTI 设置套接口接收所有的来到接口的多路广播分组。除此之外传统的 ioctls 如 SIOCSIFFLAGS, SIOCADDMULTI, SIOCDELMULTI 也能用于实现同样的目的。IOCTLS 输入输出控制SIOCGSTAMP 用来接收最新收到的分组的时间戳。它的参数是 timeval 结构。除此之外,所有的在 netdevice(7) 和 socket(7) 中定义的标准的 ioctl 在分组套接口上均有效。ERROR HANDLING 错误处理分组套接只对传送分组到设备驱动程序时发生的错误做错误处理,其他不做错误处理。这里没有等待解决的错误的概念。COMPATIBILITY 兼容性在 Linux 2.0 中,得到分组套接口的唯一方法是调用 socket(PF_INET, SOCK_PACKET, protocol)。它仍被支持但变得没有价值。两种方法的主要不同在于 SOCK_PACKET 使用老的 sockaddr_pkt 结构来指定一个接口,没有提供物理层接口无关性。 (依赖于物理设备)struct sockaddr_pktunsigned short spkt_family;unsigned char spkt_device14;unsigned short spkt_protocol;spkt_family 包括设备类型,spkt_protocol 是在中定义的 IEEE 802.3 协议类型,spkt_device 是表示设备名的 null 终结的字符串,例如 eth0。译注: who is nntp 就是一个以 null ( )终结的字符串。这个结构已经被废弃,不应在新的代码中使用。NOTES 注意不建议对要求可移植的程序通过 pcap(3) 使用 PF_PACKET 协议族;它只覆盖了 PF_PACKET 特征的一个子集。译注:该函数库可在 /libpcap.tar.Z 得到。SOCK_DGRAM 分组套接口对 IEEE 802.3 桢不做生成或分析 IEEE 802.2 LLC 报头的尝试。当在套接口中指定了 ETH_P_802_3 协议,告知内核生成 802.3 桢,并填写了长度字段;用户必须提供 LLC 报头来产生符合标准的分组。到来的 802.3 分组不在协议字段 DSAP/SSAP 上实现多路复用;而是故意的把 ETH_P_802_2 协议的 LLC 报头提供给用户。所以不可能绑定到 ETH_P_802_3;而可以绑定到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现场救护专业培训课件
- 农作物加工设备创新创业项目商业计划书
- 农产品展销会创新创业项目商业计划书
- 职业技能课程自适应学习系统创新创业项目商业计划书
- 电商品牌客服服务创新创业项目商业计划书
- 2025年工业互联网平台传感器网络自组网技术在智能工厂设备维护中的应用报告
- 2025年工业互联网平台安全多方计算技术保障工业互联网生态安全报告
- 2025年新能源汽车废旧电池回收处理产业技术创新与市场应用研究报告
- 2025年社交媒体舆情监测与危机公关技术应用现状与发展趋势报告
- 山东省菏泽市2021-2022学年五年级上学期科学期中学情调研试卷(含答案)
- 老年病人麻醉管理
- 2025年广西专业技术人员继续教育公需科目(一)答案
- 2025至2030中国波浪能行业需求状况与发展行情走势分析报告
- 白细胞减少症和粒细胞缺乏
- CJ 41-1999工业企业水量平衡测试方法
- 地下矿山地压管理制度
- 藏文考试试题及答案
- 施工水电费合同协议书
- 车辆动力学分析考试试题及答案
- 2025-2030中国毫米波雷达行业发展分析及发展趋势与投资前景预测研究报告
- 2025年格力中央空调销售安装合同范本
评论
0/150
提交评论