最近用到了IP hook钩子点抓包分析。需要获取2,3,4指针。
其中内核中有几个函数可以帮助获取指针:
中:
-
static inline struct ethhdr *eth_hdr(const struct sk_buff *skb)
-
{
-
return (struct ethhdr *)skb_mac_header(skb);
-
}
该函数获取skb中的mac头指针。
中:
-
static inline struct iphdr *ip_hdr(const struct sk_buff *skb)
-
{
-
return (struct iphdr *)skb_network_header(skb);
-
}
该函数获取skb中的ip头指针。
中:
-
static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb)
-
{
-
return (struct tcphdr *)skb_transport_header(skb);
-
}
该函数获取skb中的tcp头指针。
中:
-
static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
-
{
-
return (struct udphdr *)skb_transport_header(skb);
-
}
该函数获取skb中的udp头指针。
但是当我在使用IP HOOK时,使用tcp_hdr函数时获取到的tcp头指针计算tcp数据长度时是错误的,让我很疑惑。最后看到了一篇帖子才明白了其中的原由:
原来时IP hook钩子函数都在 IP 层。
skb 有指向 MAC 头和 IP 头的成员,都是有效的,可以直接使用接口API获取。
而获取TCP/UDP头时,skb中的成员是无效的,所以需要自己实现获取API:
tcph = (struct tcphdr *)((unsigned char *)iph + iph->ihl * 4)。
阅读(2752) | 评论(0) | 转发(0) |