Chinaunix首页 | 论坛 | 博客
  • 博客访问: 411502
  • 博文数量: 96
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 415
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-22 09:08
个人简介

最近的研究方向:Nginx

文章分类
文章存档

2017年(2)

2016年(59)

2015年(35)

我的朋友

分类: LINUX

2016-09-12 14:59:35

最近用到了IP hook钩子点抓包分析。需要获取2,3,4指针。
其中内核中有几个函数可以帮助获取指针:
中:

点击(此处)折叠或打开

  1. static inline struct ethhdr *eth_hdr(const struct sk_buff *skb)
  2. {
  3.     return (struct ethhdr *)skb_mac_header(skb);
  4. }
该函数获取skb中的mac头指针。

中:

点击(此处)折叠或打开

  1. static inline struct iphdr *ip_hdr(const struct sk_buff *skb)
  2. {
  3.     return (struct iphdr *)skb_network_header(skb);
  4. }
该函数获取skb中的ip头指针。

中:

点击(此处)折叠或打开

  1. static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb)
  2. {
  3.     return (struct tcphdr *)skb_transport_header(skb);
  4. }
该函数获取skb中的tcp头指针。

中:

点击(此处)折叠或打开

  1. static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
  2. {
  3.     return (struct udphdr *)skb_transport_header(skb);
  4. }
该函数获取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) |
给主人留下些什么吧!~~