2.2 修改IPHeader包
IP层的最后一个发送函数是ip_output.c中的ip_finish_output(8.11) , 可以在此添加hook函数,
这里是修改TOS字段,Type of Services,是表示优先级的,由于现在大部分路由器忽略此字段,因此修改TOS不会对现有网络造成影响
2.2.1修改 ip_output.c
int (*myHook_IPTOS)(strcut sk_buff*) = 0;
__inline__ int ip_finish_output(struct sk_buff* skb)
{
//...
if( myHook_IPTOS)
{
myHook_IPTOS(skb);
}
//...
}
代码最后
EXPORT_SYMBOL(myHook_IPTOS);
2.2.2编写myHook_IPTOS.c
#define __KERNEL__
#define MODULE
#include <linux/config.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/tcp.h>
#include <linux/ip.h>
#include <net/ip.h>
extern int (*myHook_IPTOS)(struct sk_buff*);
//这的struct sk_buff仍然是2.4的,在2.6中struct sk_buff结构被修改了,基本原理未变
//此部分代码以后再修改为2.6的,
int myHook_IPTOS_impl(struct sk_buff* skb)
{
struct iphdr* iph;
struct tcphdr* th;
iph = skb->nh.iph;
if( iph->protocol == IPPROTO_TCP)
{
skb->h.raw = (unsigned char*)(skb->nh.raw + iph->ihl * 4);
th = skb->h.th;
if(( tcp_flag_word(th) & TCP_FLAG_ACK))
{
skb->nh.iph->tos = 0xB8;
ip_send_check(skb->nh.iph);
}
}
return 0;
}
static int init_hook( void )
{
myHook_IPTOS = myHook_IPTOS_impl; //后门函数指向了真正的实现函数
printk("myHook_IPTOS installed"); //表示加载成功
return 0;
}
static int exit_hook(void)
{
myHook_IPTOS= 0; //后门函数清0
printk("myHook_IPTOS removed/n"); //表示卸载成功
return 0;
}
MODULE_LICENSE("GPL"); //表示采用的开放协议
module_init(init_hook); //为当加载Module时,自动调用init_hook
module_exit(exit_hook); //当卸载Module时,自动调用exit_hook;
2.2.3 编写Makefile
obj-m := myHook_IPTOS.o
all:
make -C /lib/modules/2.6.24.3/build /
M=$(PWD) modules
clean:
make -C /lib/modules/2.6.24.3/build /
M-$(PWD) modules
保存后,输入
#make 编译
2.2.4 加载卸载
#insmod myHook_IPTOS.ko
#cat /var/log/message
就能看到 "myHook_IPTOS installed",表示加载成功
然后打开Firefox,上上网,
....
#tcpdump
看发送的包
#rmmod myHook_IPTOS
#cat /var/log/message
就能看到 "myHook_IPTOS removed",表示卸载成功