我该怎么从netfilter勾出来的报文里读取数据?
我使用这个钩子函数,读取netfilter架构勾出来的网络报文对应的skbuff结构体的内容,并打印到日志中.
unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) //这个函数是钩子函数. //抓到包时会执行该函数. //sk_buff是抓到的数据包. //接受了3个参数,只有中间那个用到了.{ struct iphdr*p=ip_hdr(skb); if(p->protocol==6) { printk(KERN_INFO"TCP packet!"); printk(KERN_INFO"---len=%d",skb->len); struct tcphdr*t=(struct tcphdr*)(skb->data+p->ihl*4); u16 srcport=ntohs(t->source),dstport=ntohs(t->dest); printk(KERN_INFO"---srcport=%hu,dstport=%hu",srcport,dstport); unsigned char *c=skb->data; unsigned char *end=skb->head+skb->tail; if(srcport==12345) for(int i=0;c+i<end;i++) printk(KERN_INFO"%c %c %c %c %c %c",c[i*6],c[i*6+1],c[i*6+2],c[i*6+3],c[i*6+4],c[i*6+5]); } return NF_ACCEPT; // accept the packet //这里,钩子函数判定,接受该包.}
之后,我在本地的12345端口,使用两个终端的netcat指令进行通信,内容为ABCDE.
然后我截取到类似如此的内容.
[24394.700504] ---srcport=12345,dstport=36050[24394.700507] E \x00 \x00 ; : ][24394.700509] @ \x00 @ \x06 \x02 ^[24394.700511] \x7f \x00 \x00 \x01 \x7f \x00[24394.700513] \x00 \x01 0 9 \x8c \xd2[24394.700514] \xc6 \x98 { \xa9 _ \xf8[24394.700516] F \xe6 \x80 \x18 \x02 \x00[24394.700518] \xfe / \x00 \x00 \x01 \x01[24394.700519] \x08 \x9e \xa1 \xfc d[24394.700521] \x9e \xa1 \xe1 \xf4 \x00 \x00[24394.700523] \x00 \x00 \x00 \x00 \x00 \x00[24394.700524] \x00 \x00 \x00 \x00 \x00 \x00[24394.700526] \x00 \x00 \x00 \x00 \x00 \x00
差不多是这么个样子.如果它的网络报文中包含A,B这些英文字符,那为什么我使用printk打印不出来?
现在我发现一个问题,那就是这个钩子函数截取的只有网络报文的头部,和在wireshark打印的样子一模一样.
报文内部的内容是完全没有的.
netfilter没法获取报文内部的应用层数据吗?我看说明说可以啊.
这个包打印的没啥问题,应该是你打错包了。 TCP协议是有三次握手的,有syn、ack、fin、rst这些控制报文,所以你判断源端口是不是12345,并不能说明这个包一定就是你想要的带着ABC数据的报文。通过打印结果来看,这就是一个ACK的空包。
综上,打印没啥问题,应该是打印错包了。另外你计算end的那行我猜你的本意应该是找到报文结束吧?代码写错了,head和tail这俩是指针,指针相加不是代表报文结束,所以你这个printk打印了后面的一堆的0, 如果不考虑非线性数据:
for(c = skb->data, c < skb->tail; c++) { printk(...);}
问题是下面语句从文件中读取不了数据。 文件里的内容是 1 数据库 专业课 48 40 8 5.00 1 2 c语言 专业课 30 15 15 6.00 2 3 python 专业课 30 15 15 5.00 1 4 java 专业课 46 23 23 6.00 2 5 云计算 专业课 20 10 10 4.00 3 6 ps 选修课 10 5 5 1.00 1 7 数学 必修课 20 10 10
rank ▲ ✰ vote url 36 511 136 405 url 在Python里怎么读取stdin? 我在做code golf挑战,但是所有的问题都需要读取stdin的值.在Python里应当怎么做? 这是我从 Stack Overflow 中学到的: import fileinput for line in fileinput.input(): pass fileinput
> 我已经按照以下指南设置了keycloak:https://hub.docker.com/r/jboss/keycloak/使用MySQL作为数据库。我认为使用属性可以将额外的数据存储在keycloak中,使用映射器可以将数据与客户机相关联。我的问题是,如果在keycloak中以这种方式存储我想稍后访问的用户数据是可以的(好的做法)?以及数据应该附加到的位置。因为可以将属性附加到访问令牌、id令
iptables是一个配置Linux内核防火墙的命令行工具,它基于内核的netfilter机制。新版本的内核(3.13+)也提供了nftables,用于取代iptables。 netfilter netfilter是Linux内核的包过滤框架,它提供了一系列的钩子(Hook)供其他模块控制包的流动。这些钩子包括 NF_IP_PRE_ROUTING:刚刚通过数据链路层解包进入网络层的数据包通过此钩子
什么?还能结构化? 任何语言的每一句话之所以称为“话”,是因为它有一定的句子结构,除了一个个独立的词之外,他们之间还存在着某种关系。如果任何一句话可以由任何词构成,可长可短,那么这是一个非结构化的信息,计算机是很难理解并做计算的,但是如果能够以某种方式把句子转化成结构化的形式,计算机就可以理解了。 实事上,人脑在理解一句话的时候也暗暗地在做着由非结构化到结构化的工作。 比如说:“我下午要和小明在公
问题内容: 我正在阅读有关使用私钥加密的IBM教程。我写的代码如下 上面的代码效果很好。我能够看到结果和所有内容。但我想按如下方式进行修改,以便可以将cipherText存储在文件中。然后,另一个程序从文件中读取加密的文本并将其解密。以下是我到目前为止所做的事情,但我不知道如何进行。只是一些有关如何进行的提示会有所帮助。 现在,该程序的工作已经完成。它已成功将加密的字符串写入文件。新程序仅需解密数