Socket_Kernel_Module 05

2.4 随机丢弃IP包 

在内核中发送包的最后一个函数/net/core/dev.c的dev_queue_xmit()中(就是2.1简单实例的hook过的函数),可以设定按照一定几率随机丢弃包, 当丢包后,需要kfree_skb(skb)释放包,并且停止进一步下传,即可

2.4.1 修改dev_queue_xmit

添加

int (*myHook_IPDrop)(struct sk_buff* )  = 0;

int dev_queue_xmit(struct sk_buff* skb)

{

     //...

     if( myHook_IPDrop && (*myHook_IPDrop)(skb))

     {

         kfree_skb(skb);

         return 0; //返回0,这样终止了进一步下传,同时上层以为发送成功,这个包就被抛弃了

     }

}

EXPORT_SYMBOL(myHook_IPDrop);

 

2.4.2 myHook_IPDrop.c

 

#define __KERNEL__

#define MODULE

#include <linux/module.h>

#include <linux/skbuff.h>

#include <linux/tcp.h>

#include <linux/ip.h>

#include <linux/proc_fs.h>

#include <net/ip.h>

//big-endian和little-endian转换,big用在网络中,而linux中是little

#define u32toValue(x) ((__u32)( /

                                  (((__u32)(x) & (__u32)0x000000ffUL) << 24) | /

                                  (((__u32)(x) & (__u32)0x0000ff00UL) <<   8) | /

                                  (((__u32)(x) & (__u32)0x00ff0000UL) >>   8) | /

                                  (((__u32)(x) & (__u32)0xff000000UL) >> 24) ))

float fDropRate = 0.5;

extern int (*myHook_IPDrop)(struct sk_buff*);

 

//转为可打印地址

static void IpAddressToString(unsigned long i, char* s)

{

     unsinged long j1, j2,j3,j4;

     j1 = (i & 0x000000FF);

     j2 = (i & 0x0000FF00)>>8;

     j3 = (i & 0x00FF0000)>>16;

     j4 = (i & 0xFF000000)>>24;

     sprintf(s, "%u.%u.%u.%u", j4,j3,j2,j1); //注意顺序

}

 

//hook函数的实现

int myHook_IPDrop_impl(struct sk_buff* skb)

{

    strcut iphdr* iph;

    strcut tcphdr* th;

    char szTargetIP[50];

    unsigned short t; //用于产生随机数,不能初始化

 

    iph = skb->nh.iph;

    IpAddressToString(u32toValue(skb->nh.iph->daddr), szTargetIP);

    if( strcmp(szTargetIP, "192.168.0.2") == 0) //判断目的地址

   {

        get_random_bytes(&t,2);

        if( t * 1.0 / 65535 < fDropRate) 

        {

             printk("rand=%d, Dropped/n",t);

             return 1; //表示要抛弃

         }

    }     

    return 0; //表示保留

}

 

static int init_hook( void )
{
    myHook_IPDrop = myHook_IPDrop_impl;  //后门函数指向了真正的实现函数

    printk("myHook_IPDrop installed");        //表示加载成功
    return 0;
}

 

static int exit_hook(void)

{

    myHook_IPDrop= 0;                    //后门函数清0
    printk("myHook_IPDrop removed/n"); //表示卸载成功

    return 0;
}

 

MODULE_LICENSE("GPL"); //表示采用的开放协议

module_init(init_hook);     //为当加载Module时,自动调用init_hook
module_exit(exit_hook);   //当卸载Module时,自动调用exit_hook;

 

2.4.3 Makefile和加载卸载

方法如前文,此处忽略。

加载运行后,就可以看到一定几率的包被丢弃。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值