基于netfilter的tcp网络包的过滤与…

基于netfilter的tcp网络包的过滤与修改(修正版)

转自http://hi.baidu.com/widebright/item/0c6c94b44e749c9619469784

一直对公司封掉mp3文件的下载耿耿于怀,上次写的那个netfilter驱动还是有点问题,修改后的后续tcp网络包的序号还是有问题。最近有空,仔细看了下内核里面的代码,结合别人你的代码研究一下。更正如下,改正之后 打开网址http://www.google.cn/1.mp3 这个内核模块就可以自动帮我把地址改为    http://www.google.cn/1.mp%3 , 哈哈,这样就可以穿透公司的防火墙了,他们没有过滤这个地址。这样就可以打开百度音乐播放器在线听歌了,不然会被过滤掉。哈哈希望不会很快被公司那些人检测到。



#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 

linux/module.h>
linux/moduleparam.h>
linux/kernel.h>
inux/skbuff.h>
linux/ip.h>
linux/tcp.h>
net/tcp.h>
net/udp.h>
linux/netfilter.h>
linux/netfilter_ipv4.h>
net/sock.h>

MODULE_LICENSE("GPL"); //用了nf_conntrack_tcp_update 函数要用这个遵守GPL开放协议才能编译通过
//MODULE_LICENSE("copyright (c) 2009 widebright");
MODULE_AUTHOR("widebright");
MODULE_DESCRIPTION("widebright's netfilter");
MODULE_VERSION("1.0");

static void hex_dump(const unsigned char *buf, size_t len) {
     size_t i;

     for (i = 0; i < len; i++) {
          if (i && !(i % 16))
               printk("\n");
          printk("x ", *(buf + i));
     }
     printk("\n");
}

char * is_mp3_request(char * start) {
     char data[4] = ".mp3";
     char * i = start;

     i += 4; //跳过 GET
     while (*i != ' ' && *i != '\n')
          i++; //查找网络地址最后的位置

     if (*(int *) (i - 4) == *(int *) data)
          return i;
     else
          return NULL;
}

unsigned int check_link_address(unsigned int hooknum, struct sk_buff *skb,
          const struct net_device *in, const struct net_device *out, int(*okfn)(
                    struct sk_buff *)) {
     char * payload = NULL;
     const struct iphdr *iph = NULL;
  

你可能感兴趣的:(openwrt)