dev_add_pack挂钩和内存泄漏

时间:2013-01-15 06:45:05

标签: networking kernel kernel-module

我必须写lkm,它会重新发送所有传入的数据包。是的,我知道xt_TEE,但必须自己写。我查看了一些示例:http://www.phrack.org/archives/55/p55_0x0c_Building%20Into%20The%20Linux%20Network%20Layer_by_lifeline%20&%20kossak.txt(它相当陈旧)和http://www.xakep.ru/post/20794/default.asp?print=true(数据包嗅探器)。
然后我写了我的代码:

    //INCLUDES//////////////////////////////////////////////////////////////
    #include <linux/ip.h>
    #include <linux/netdevice.h>
    #include <linux/skbuff.h>
    #include <linux/module.h>
    #include <linux/kernel.h>

    //ABOUT/////////////////////////////////////////////////////////////////

    MODULE_AUTHOR("");
    MODULE_DESCRIPTION("");
    MODULE_LICENSE("GPL");
    MODULE_VERSION("0.0.1");

    //DEFINES///////////////////////////////////////////////////////////////

    //SYSCALLS//////////////////////////////////////////////////////////////

    //PROTOTYPES/////////////////////////////////////////////////////////////
    int new_hook_func(struct sk_buff *skb, struct device *dv, struct packet_type *pt);
    void test();
    //GLOBALS///////////////////////////////////////////////////////////////
    static struct packet_type my_packet_type;
    static char *dev = "eth0";
    struct net_dev *d;

    //INIT//////////////////////////////////////////////////////////////////
    static int __init init(void)
    {
        printk(KERN_ALERT "module init\n");
        d = dev_get_by_name(&init_net, dev);
        my_packet_type.type = htons(ETH_P_ALL); 
        my_packet_type.func = new_hook_func;
        my_packet_type.dev = d;
        dev_add_pack(&my_packet_type);
        return 0;
    }

    //EXIT//////////////////////////////////////////////////////////////////
    static void __exit exit(void)
    {
        dev_remove_pack(&my_packet_type);
        printk(KERN_ALERT "module exit");
    }

    ////////////////////////////////////////////////////////////////////////

    module_init(init);
    module_exit(exit);

    ////////////////////////////////////////////////////////////////////////


    //CORE//////////////////////////////////////////////////////////////////


    int new_hook_func(struct sk_buff *skb, struct device *dv, struct packet_type *pt)
    {
        struct iphdr *ip;
        ip = (struct iphdr*)skb_network_header(skb);
        if(skb->pkt_type != PACKET_OUTGOING)
        {
            if(ip->version == 4 && ip->protocol == IPPROTO_ICMP)
            {
                struct sk_buff *my_skb = 0;
                //copy incoming skb
                my_skb = skb_copy_expand(skb, 16, 16, GFP_ATOMIC);
                //get eth header
                    struct ethhdr *eth = eth_hdr(my_skb);
                //push ethernet layer to skb
                    skb_push(my_skb, ETH_HLEN);
                //set packet type to outgoing
                    skb->pkt_type = PACKET_OUTGOING;
                //send skb struct
                    dev_queue_xmit(my_skb);
                //drop all incoming packets
    //          kfree_skb(my_skb);
    //          kfree_skb(skb);
            }
        }
            return NET_RX_DROP;
    }  

此代码应该重新发送每个收到的icmp数据包 所以,我遇到了三个问题:
1)内存泄漏。一些如何泄漏。我试图评论整个钩子功能,只有返回,但内存仍在泄漏 2)返回代码不起作用。无论我返回什么(NET_RX_DROP / NET_RX_ACCEPT / NF_DROP / NF_ACCEPT / 1/0)仍然收到数据包并回答它。
3)mac层的问题。正如您在我的代码中看到的那样,我使用扩展复制skb结构,并且必须在那里推送14个字节的mac-layer。否则将在没有任何mac字节的情况下发送数据包 我为我可怜的英语道歉并请求帮助。

0 个答案:

没有答案