免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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

最佳答案

查看完整内容

怎么解决了。还是直接使用Hook函数了?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2008-12-19 19:54 |只看该作者

回复 #57 ubuntuer 的帖子

怎么解决了。还是直接使用Hook函数了?

论坛徽章:
0
3 [报告]
发表于 2008-12-19 21:03 |只看该作者
ipt.c:66是哪一行?
多写点printk看看。
是不是根本没有被调用呢?

论坛徽章:
0
4 [报告]
发表于 2008-12-19 21:15 |只看该作者
static unsigned int
139reject_tg(struct sk_buff *skb, const struct net_device *in,
140          const struct net_device *out, unsigned int hooknum,
141          const struct xt_target *target, const void *targinfo)

论坛徽章:
0
5 [报告]
发表于 2008-12-19 23:07 |只看该作者
insmod加载
lsmod查看是否加载

论坛徽章:
0
6 [报告]
发表于 2008-12-19 23:31 |只看该作者
到   include/linux/netfilter/x_tables.h  这个文件里,看
struct xt_target 的 target 成员的定义,与你的 reject_tg 定义是否相同

我这里是不同的,我是 2.6.24 的代码,
xt_target 里 target 的参数顺序和个数都和你的 reject_tg 不同

希望能帮到你

论坛徽章:
0
7 [报告]
发表于 2008-12-20 00:49 |只看该作者
应该是struct sk_buff **skb吧?

论坛徽章:
0
8 [报告]
发表于 2008-12-20 08:58 |只看该作者
我帮你看了一下,数据结构是这样的,照这个该接口吧,
进到内核里看内核是怎么调用target的.      
         unsigned int (*target)(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);
请问,这个模块实现的是什么功能?

论坛徽章:
0
9 [报告]
发表于 2008-12-20 08:59 |只看该作者
看的是2.6.27.4

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2008-12-20 09:34 |只看该作者
这是写NF hook函数把。现在变化挺大阿。一个hook函数注册三个hook点阿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP