• Linux内核:从skb获取udp头,udp_hdr()获取到是错误的udp头(转)


    一、skb中获取ip头、udp头

    内核代码HOOK函数中:

            从skb获取ip头,使用内核API ip_hdr():


    #include <linux/ip.h>

    struct iphdr *iph;
    iph = ip_hdr(skb);
            从skb获取udp头,使用内核API udp_hdr():

    #include <linux/udp.h>

    struct udphdr *udph;
    udph = udp_hdr(skb);
    二、udp_hdr()获取到是错误的udp头
    2.1 现象

            上述获取的iph是正确的ip头,获取的udph是错误的udp头。

    2.2 原因

            因为此时sk_buff的transport_header并没有指向正确的udp头,而是和network_header一同指向了ip头。

    三、正确的获取udp头

    3.1 通过ip头计算udp头

    struct udphdr *udph;
    udph = (struct udphdr *) ((u8 *) iph + (iph->ihl << 2));
    3.2 先设置transport_header指向正确的udp头,再用udp_hdr()获取

    struct udphdr *udph;
    skb_set_transport_header(skb, sizeof(struct iphdr)); //iph->ihl << 2
    udph = udp_hdr(skb);
    四、实例代码
    4.1 代码

    unsigned int hook_mark1(unsigned int hooknum, struct sk_buff *skb,
    const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
    {
    struct iphdr *iph;
    struct udphdr *udph1;
    struct udphdr *udph2;

    iph = ip_hdr(skb);
    if (iph->protocol == 17)
    {
    iph = ip_hdr(skb);
    udph1 = udp_hdr(skb);
    udph2 = (struct udphdr *) ((u8 *) iph + (iph->ihl << 2));
    printk("001 iph:%p, udph1:%p, udph2:%p ", iph, udph1, udph2);

    skb_set_transport_header(skb, sizeof(struct iphdr));

    iph = ip_hdr(skb);
    udph1 = udp_hdr(skb);
    udph2 = (struct udphdr *) ((u8 *) iph + (iph->ihl << 2));
    printk("002 iph:%p, udph1:%p, udph2:%p ", iph, udph1, udph2);
    }
    return NF_ACCEPT;

    ————————————————
    版权声明:本文为CSDN博主「kanguolaikanguolaik」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/guowenyan001/article/details/41284723

  • 相关阅读:
    [转载]各种计算机语言的经典书籍
    [转载]VC 常用快捷键
    [转载]Visual Studio中的debug和release版本的区别
    [转载]Visual C++开发工具与调试技巧整理
    [转载]一个游戏程序员的学习资料
    [转载]C++资源之不完全导引(完整版)
    [转载]一个图形爱好者的书架/白话说学计算机图形学
    [摘录]这几本游戏编程书籍你看过吗?
    Oracle分析函数的使用
    [C/C++]C++下基本类型所占位数和取值范围
  • 原文地址:https://www.cnblogs.com/erhu-67786482/p/12963886.html
Copyright © 2020-2023  润新知