Linux 如何将内核模块中捕获的数据包的十六进制转储转换为pcap文件?

Linux 如何将内核模块中捕获的数据包的十六进制转储转换为pcap文件?,linux,networking,linux-kernel,Linux,Networking,Linux Kernel,我正在Linux(Xubuntu x64)上编写一个内核模块。内核的版本是5.4.0-52-generic。我的内核模块从接口捕获流量并以十六进制打印: Nov 10 14:04:34 ubuntu kernel: [404009.566887] Packet hex dump: Nov 10 14:04:34 ubuntu kernel: [404009.566889] 000000 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00 Nov

我正在Linux(Xubuntu x64)上编写一个内核模块。内核的版本是5.4.0-52-generic。我的内核模块从接口捕获流量并以十六进制打印:

Nov 10 14:04:34 ubuntu kernel: [404009.566887] Packet hex dump:
Nov 10 14:04:34 ubuntu kernel: [404009.566889] 000000   00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00 
Nov 10 14:04:34 ubuntu kernel: [404009.566899] 000010   00 54 49 4C 40 00 40 01 A7 EF C0 A8 64 0E C0 A8 
Nov 10 14:04:34 ubuntu kernel: [404009.566907] 000020   64 0E 08 00 9E FE 00 03 00 08 72 0E AB 5F 00 00 
Nov 10 14:04:34 ubuntu kernel: [404009.566914] 000030   00 00 7B B5 01 00 00 00 00 00 10 11 12 13 14 15 
Nov 10 14:04:34 ubuntu kernel: [404009.566922] 000040   16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 
Nov 10 14:04:34 ubuntu kernel: [404009.566929] 000050   26 27 28 29
我在root下使用这个命令得到的输出:
tail-f/var/log/kern.log

整个问题是,我需要将此输出保存为pcap文件。我知道有
text2pcap
,但是它的库(libpcap)只是用户模式,所以我不能在内核模块中使用它(或者可能没有?如果我错了,请纠正我)

可以在内核模块中使用text2pcap吗?否则,在内核模块中如何将输出保存为pcap文件?

源代码:

#include//包含在所有内核模块中
#include//include for KERN_INFO
#include//include for _init和_exit宏
#include//include for struct sk_buff
#include//include用于数据包信息
#include//include for ip_hdr
#include//include for dev\u添加/删除\u包
#include//include for ETH_P_ALL
#包括
模块许可证(“GPL”);
模块作者(“测试人员”);
模块描述(“捕获所有网络数据包的示例linux内核模块程序”);
结构包类型jiu-proto;
无效pkt_十六进制转储(结构sk_buff*skb)
{
尺寸透镜;
int rowsize=16;
整数i,l,linelen,剩余;
int-li=0;
uint8_t*数据,ch;
printk(“数据包十六进制转储:\n”);
数据=(uint8_t*)skb_mac_头(skb);
if(skb_是非线性的(skb)){
len=skb->data\u len;
}否则{
len=skb->len;
}
剩余=len;
对于(i=0;ipkt_型)
{
案例数据包\u主机:
printk(KERN_INFO“PACKET to us–ˆ710;'”);
打破
个案分组广播:
printk(KERN_INFO“packettoall–ˆ'”);
打破
case-PACKET\u多播:
printk(KERN_INFO“数据包到组–ˆ’”);
打破
案例数据包\u其他主机:
printk(KERN_INFO“PACKET to someone.'710'”);
打破
案例包输出:
printk(KERN_-INFO“数据包发送”命令);
打破
案例包_环回:
printk(KERN_INFO“PACKET LOOPBACK–ˆ'”);
打破
案例包\u快速路由:
printk(KERN_INFO“packetfastproute–ˆ710;'”);
打破
}
//printk(KERN_CONT“Dev:%s;0x%.4X;0x%.4X\n”,skb->Dev->name,ntohs(skb->protocol),ip_hdr(skb)->protocol);
结构ethhdr*以太=eth_hdr(skb);
//printk(“源:%x:%x:%x:%x:%x:%x\n”,以太->氢源[0],以太->氢源[1],以太->氢源[2],以太->氢源[3],以太->氢源[4],以太->氢源[5]);
//printk(“目的地:%x:%x:%x:%x:%x:%x\n”,以太->目的地[0],以太->目的地[1],以太->目的地[2],以太->目的地[3],以太->目的地[4],以太->目的地[5]);
//printk(“协议:%d\n”,以太->协议);
pkt_hex_倾倒区(skb);
kfree_skb(skb);
返回0;
}
静态整数初始化ji_init(void)
{
/*见
当协议设置为htons(ETH_P_ALL)时,则接收所有协议。
该协议类型的所有传入数据包都将传递给该数据包
套接字,然后将它们传递给内核中实现的协议*/
/*几个例子*/
//以太网环路0x0060/*以太网环回数据包*/
//ETH_P_IP 0x0800/*互联网协议包*/
//ETH_P_ARP 0x0806/*地址解析包*/
//ETH_P_环回0x9000/*以太网环回数据包,符合IEEE 802.3*/
//ETH_P_ALL 0x0003/*每个数据包(小心!!!)*/
//ETH_P_802_2 0x0004/*802.2帧*/
//ETH_P_SNAP 0x0005/*仅限内部*/
ji_原型=htons(ETH_P_IP);
/*NULL是一个通配符*/
//ji_proto.dev=NULL;
ji_proto.dev=dev_get_by_name(&init_net,“enp0s3”);
ji_proto.func=ji_packet\u rcv;
/*数据包套接字用于在设备上接收或发送原始数据包
驱动程序(OSI第2层)级别。它们允许用户实现
物理层顶部用户空间中的协议模块*/
/*将协议处理程序添加到网络堆栈。
传递的数据包类型链接到内核列表中,直到
它已从内核列表中删除*/
开发添加包(&jiu-proto);
printk(KERN_INFO“模块插入成功完成!\n”);
返回0;//非零返回表示无法加载模块。
}
静态空洞uu退出ji_清理(空洞)
{
dev_-remove_-pack(&ji_-proto);
printk(内核信息“清理模块…”\n);
}
模块i_init(ji_init);
模块退出(ji_清理);
可以在内核模块中使用text2pcap吗

如果不将它和它用来编写pcap文件的代码(它不是来自libpcap,而是来自Wireshark的一个小库,dumpcap也使用它来编写pcap和pcapng文件)放到内核中,这是不可能的

在内核模块中时,如何将输出保存为pcap文件

您可以编写自己的代码来打开一个文件,并在内核模块中写入该文件;关于那件事

它还说

“首选”技术是通过IOCTLs传入参数,并在y中实现read()函数