pf_packet 的实现原理主要包括以下几个方面: 原始套接字:用户空间的应用程序通过创建原始套接字(使用 socket() 系统调用并指定 SOCK_RAW 和PF_PACKET)来与 pf_packet 协议簇交互。 数据包的发送和接收:通过原始套接字,应用程序可以直接发送和接收网络层的数据包。这些数据包可以是 IP 数据包、ARP 数据包等,具...
先 放一段示例程序,这段程序我在RH9和AS4下编译通过,程序功能就是用从2.2内核加入的PF_PACKET协议族来进行底层数据包捕获并显示。 PF_PACKET协议族是与系统TCP/IP协议栈并行的同级别模块,即从PF_PACKET协议族得到的数据包是没有经过系统TCP/IP协议栈处理 的。而且,通过设置混杂模式,可以很容易的实现sniffer。 #...
先 放一段示例程序,这段程序我在RH9和AS4下编译通过,程序功能就是用从2.2内核加入的PF_PACKET协议族来进行底层数据包捕获并显示。 PF_PACKET协议族是与系统TCP/IP协议栈并行的同级别模块,即从PF_PACKET协议族得到的数据包是没有经过系统TCP/IP协议栈处理 的。而且,通过设置混杂模式,可以很容易的实现sniffer。 #...
packet_socket=socket(PF_PACKET,intsocket_type,intprotocol); (这个套接字的打开需要用户有root权限) 其中socket_type有两种类型,一种为SOCK_RAW,它是包含了MAC层头部信息的原始分组,当然这种类型的套接字在发送的时候需要自己加上一个MAC头部(其类型定义在linux/if_ether.h中,ethhdr),另一种是SOCK_DGRAM类型...
题!我们一起来看看程序1,我们打开一个属于PF_PACKET-family 协议簇的SOCKET,指定 一个SOCK_RAW socket类型和IP相关协议类型。这时我们开始从SOCKET抓包,在一些相关 检查后.我们开始得到从链路层和IP层抓来的头部信息,。通过阅读程序一,你将会发现让应 用程序从网络层抓包其实并不难!
分组(也译为数据包),PF_PACKET - 在设备层的分组接口 译注:PF_PACKET 中的 PF 是 protocol family(协议族)的缩写。 SYNOPSIS总览 #include<sys/socket.h>#include<features.h>/*需要里面的glibc版本号*/#if__GLIBC__>=2&&__GLIBC_MINOR>=1#include<netpacket/packet.h>#include<net/ethernet.h>/*链路...
我们一起来看看程序1,我们打开一个属于PF_PACKET-family 协议簇的SOCKET,指定一个SOCK_RAW socket类型和IP相关协议类型。这时我们开始从SOCKET抓包,在一些相关检查后.我们开始得到从链路层和IP层抓来的头部信息,。通过阅读程序一,你将会发现让应用程序从网络层抓包其实并不难!
它是一种基于套接字的接口,通过创建一个特殊类型的套接字,用户可以利用 pf_packet 接口收发数据包。 二、pf_packet 的使用步骤 1. 创建套接字 使用socket 函数创建一个 PF_PACKET 类型的套接字,并指定协议类型为 ETH_P_ALL,表示接收所有类型的数据包。 2. 绑定接口 使用bind 函数将套接字与特定的网络接口...
unsigned short sll_family; /*总是AF_PACKET */ unsigned short sll_protocol; /*物理层的协议*/ int sll_ifindex; /*接口号*/ unsigned short sll_hatype; /*报头类型*/ unsigned char sll_pkttype; /*分组类型*/ unsigned char sll_halen; /*地址长度*/ ...
定义一个pf_packet = socket(PF_SOCKET, SOCK_RAW, htons(ETH_P_RARP)); 就可以利用函数sendto和recefrom来读取和发送链路层的数据包了(当然,发送ARP包,上面第三个参数要变为htons(ETH_P_ARP),或者IP的包为ETH_P_IP,可查看文件/usr/include/linux/if_ether.h文件看到所有支持的协议)。 3.在使用SOCK...