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和加载卸载
方法如前文,此处忽略。
加载运行后,就可以看到一定几率的包被丢弃。