免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13984 | 回复: 16
打印 上一主题 下一主题

内核模块编程求救 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-19 19:54 |显示全部楼层 |倒序浏览
5可用积分
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/icmp.h>
#include <net/icmp.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <net/route.h>
#include <net/dst.h>
#include <linux/netfilter/x_tables.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#ifdef CONFIG_BRIDGE_NETFILTER
#include <linux/netfilter_bridge.h>
#endif

MODULE_LICENSE("GPL");
MODULE_AUTHOR("zj");
MODULE_DESCRIPTION("Xtables: packet \"winnuke\" target for IPv4");

static unsigned int
reject_tg(unsigned int hooknum,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       struct sk_buff *skb,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       const struct net_device *in,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       const struct net_device *out,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       int (*okfn)(struct sk_buff *))
{
&nbsp;&nbsp;&nbsp;&nbsp;const struct iphdr *oiph;
&nbsp;&nbsp;&nbsp;&nbsp;const struct tcphdr *oth;
&nbsp;&nbsp;&nbsp;&nbsp;struct tcphdr _otcph;

&nbsp;&nbsp;&nbsp;&nbsp;oiph = ip_hdr(skb);
&nbsp;&nbsp;&nbsp;&nbsp;if (oiph->frag_off & htons(IP_OFFSET))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_DROP;
&nbsp;&nbsp;&nbsp;&nbsp;switch (oiph->protocol)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_TCP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk("TCP PACKET!!!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_UDP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  printk("UDP PACKET!!!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_ICMP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_ACCEPT;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;oth = skb_header_pointer(skb, ip_hdrlen(skb),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(_otcph), &_otcph);
&nbsp;&nbsp;&nbsp;&nbsp;if (oth == NULL)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_DROP;

&nbsp;&nbsp;&nbsp;&nbsp;if (oth->urg)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_DROP;
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk("urg ok!!!!!");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk("s_port:%d,d_port:%d",oth->source,oth->dest);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_ACCEPT;
}

static struct xt_target reject_tg_reg __read_mostly = {
&nbsp;&nbsp;&nbsp;&nbsp;.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "reject",
&nbsp;&nbsp;&nbsp;&nbsp;.family&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= PF_INET,
&nbsp;&nbsp;&nbsp;&nbsp;.target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= reject_tg,
&nbsp;&nbsp;&nbsp;&nbsp;.hooks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD) |
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (1 << NF_INET_LOCAL_OUT),
&nbsp;&nbsp;&nbsp;&nbsp;.me&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= THIS_MODULE,
};

static int __init reject_tg_init(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;return xt_register_target(&reject_tg_reg);
}

static void __exit reject_tg_exit(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;xt_unregister_target(&reject_tg_reg);
}

module_init(reject_tg_init);
module_exit(reject_tg_exit);


TARGET=ipt
ifneq ($(KERNELRELEASE),)
obj-m := ${TARGET}.o
else
&nbsp;&nbsp;&nbsp;&nbsp;KDIR := /lib/modules/$(shell uname -r)/build
&nbsp;&nbsp;&nbsp;&nbspWD := $(shell pwd)
default:
&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE) -C $(KDIR) M=$(PWD) modules
endif
clean:
&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
&nbsp;&nbsp;&nbsp;&nbsp;rm *odule*


make的时候ipt.c:66: warning: initialization from incompatible pointer type
我ismod加载后根本没作用,我是防ipt_REJECT.c写的.内核是最新的2.6.27

论坛徽章:
0
2 [报告]
发表于 2008-12-20 13:19 |显示全部楼层
首先感谢大家的回复
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/icmp.h>
#include <net/icmp.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <net/route.h>
#include <net/dst.h>
#include <net/net_namespace.h>
#include <linux/netfilter/x_tables.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#ifdef CONFIG_BRIDGE_NETFILTER
#include <linux/netfilter_bridge.h>
#endif

MODULE_LICENSE ("GPL");
MODULE_AUTHOR ("zj");
MODULE_DESCRIPTION ("Xtables: packet \"winnuke\" target for IPv4");

static unsigned int
reject_tg (struct sk_buff *skb,
       const struct net_device *in,
       const struct net_device *out,
       unsigned int hooknum,
       const struct xt_target *target, const void *targinfo)
{
  const struct iphdr *oiph;
  oiph = ip_hdr (skb);
  if (oiph->frag_off & htons (IP_OFFSET))
    return NF_DROP;
  switch (oiph->protocol)
    {
    case IPPROTO_TCP:
      printk ("TCP PACKET!!!\n");
      break;
    case IPPROTO_UDP:
      printk ("UDP PACKET!!!\n");
      break;
    case IPPROTO_ICMP:
      break;
    default:
      return NF_ACCEPT;
    }
  return NF_ACCEPT;
}


static struct xt_target reject_tg_reg __read_mostly = {
  .name = "reject",
  .family = PF_INET,
  .target = reject_tg,
  .hooks = (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD) |
    (1 << NF_INET_LOCAL_OUT),
  .me = THIS_MODULE,
};


static int __init
reject_tg_init (void)
{
  return xt_register_target (&reject_tg_reg);
}

static void __exit
reject_tg_exit (void)
{
  xt_unregister_target (&reject_tg_reg);
}

module_init (reject_tg_init);
module_exit (reject_tg_exit);


我没extern也是正确的....
现在的问题貌似就是没有执行reject_tg函数,还有就是skb_header_pointer取tcp结构体有问题

这他妈的就一helloworld,老子那个郁闷阿.....
fuck damned kernel

[ 本帖最后由 iptabler 于 2008-12-20 13:20 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-12-20 13:51 |显示全部楼层
首先感谢dreamice 版主的热心帮助!!!!
我想是我自己没把问题说清楚,我现在就是要自己写个内核模块,截获通过内核的包,就是skb结构,然后分析这个结构,然后决定这个包是drop还是accept或者其它处理....
也许我的程序最开始的思路就是错误的
还望指点
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/netdevice.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <net/tcp.h>
#include <linux/netfilter_ipv4.h>

static struct nf_hook_ops nfho;

unsigned int
hook_func (unsigned int hooknum,
&nbsp;&nbsp;&nbsp;&nbsp;   struct sk_buff **skb,
&nbsp;&nbsp;&nbsp;&nbsp;   const struct net_device *in,
&nbsp;&nbsp;&nbsp;&nbsp;   const struct net_device *out, int (*okfn) (struct sk_buff *))
{
&nbsp;&nbsp;struct iphdr *iph = (*skb)->nh.iph;
&nbsp;&nbsp;uint32_t iphlen = iph->ihl << 2;
&nbsp;&nbsp;struct tcphdr *tcph = NULL;
&nbsp;&nbsp;
&nbsp;&nbsp;if(!(*skb)) return NF_ACCEPT;
&nbsp;&nbsp;if(!((*skb)->nh.iph)) return NF_ACCEPT;
&nbsp;&nbsp;switch (iph->protocol)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_TCP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk ("It's a TCP PACKET\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcph = (struct tcphdr*)((uint8_t*)iph + iphlen);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_ICMP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_UDP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk ("It's a UDP PACKET\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;tcph = (struct tcphdr *)((*skb)->nh.iph+((*skb)->nh.iph->ihl));
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;printk ("s_port=%d,d_port=%d!",(int)tcph->source,(int)tcph->dest);
&nbsp;&nbsp;&nbsp;&nbsp;printk ("urg=%d",(int)tcph->urg);
&nbsp;&nbsp;return NF_ACCEPT;
}

int
init_module ()
{

&nbsp;&nbsp;nfho.hook = hook_func;
&nbsp;&nbsp;nfho.hooknum = NF_IP_LOCAL_OUT;
&nbsp;&nbsp;nfho.pf = PF_INET;
&nbsp;&nbsp;nfho.priority = NF_IP_PRI_FIRST;
&nbsp;&nbsp;nf_register_hook (&nfho);

&nbsp;&nbsp;return 0;
}

void
cleanup_module ()
{
&nbsp;&nbsp;nf_unregister_hook (&nfho);
}


这是个2.6.18上测试通过的....大致思路是这样的...程序在公司电脑上,我凭记忆写的....

[ 本帖最后由 iptabler 于 2008-12-20 13:54 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-12-20 19:26 |显示全部楼层
沉了...

论坛徽章:
0
5 [报告]
发表于 2008-12-21 10:43 |显示全部楼层
原帖由 Godbach 于 2008-12-20 22:48 发表


难道不是沉了,我也知道drop,我也知道程序还有问题.
我现在就是想知道这个模块加载成功后,iptables如何加载...

论坛徽章:
0
6 [报告]
发表于 2008-12-21 12:08 |显示全部楼层
要想测试这个target,还得写一个用户层的程序,并通过iptables命令加载这个target才行
dreamice版主的这句话又和解?????
我tail -f /var/log/message根本就没有printk的信息

论坛徽章:
0
7 [报告]
发表于 2008-12-21 12:11 |显示全部楼层
我curl外网,让同学ping我都try过了,tail -f /var/log/messages都没有printk的信息
以前在2.6.18上是有的,18那个程序

论坛徽章:
0
8 [报告]
发表于 2008-12-21 12:33 |显示全部楼层
感谢god兄的回复
现在关键是这句都没打印
printk("reject_tg call success!!!\n");
还有我hook的时候
.hooks = (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD) | (1 << NF_INET_LOCAL_OUT)
不是表示从三个hook走????我在内核源码内仿的

论坛徽章:
0
9 [报告]
发表于 2008-12-21 12:35 |显示全部楼层
dreamice还要有兴趣的话
看看
http://bbs.chinaunix.net/viewthread.php?tid=791863
我现在在仿这个写,就是你所谓的思路....
那给的九贱的那个我也写了的...insmod是成功的,可是跟上面的domain是一样的,没效果...

其实我一直觉得我这个真的没必要iptables

论坛徽章:
0
10 [报告]
发表于 2008-12-21 12:36 |显示全部楼层
17楼的程序是我自己在2.6.18内核上写的 是测试通过的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP