免费注册 查看新帖 |

Chinaunix

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

[内核模块] 拦截自己编写的ARP发包程序发出去的ARP包不成功 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-30 15:43 |只看该作者 |倒序浏览
本帖最后由 liudeyi545 于 2015-01-05 18:54 编辑

我想实现的功能是:防止本机在中ARP病毒后,病毒向网关发送虚假ARP包,所以拦截本机发出去的ARP包,对其原MAC地址进行比较,如果和本机一致则通过,不一致说明是病毒发出去的,就丢弃。但是没有实现!

内核版本号:3.13.0-43

#define arp_hrd ea_hdr.ar_hrd
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/netfilter.h>
#include<linux/netfilter_ipv4.h>
#include<linux/ip.h>
#include<net/ip.h>
#include<linux/udp.h>
#include<linux/in.h>
#include<linux/skbuff.h>
#include<linux/netdevice.h>
#include<linux/if_ether.h>
#include<linux/if.h>
#include<linux/if_arp.h>
#include<linux/netfilter_arp.h>

unsigned int hook_func(
                unsigned int hooknum,//功能函数挂载点
               struct sk_buff *skb,//数据包结构体指针
                const struct net_device *in,
                const struct net_device *out,
                int (*okfn)(struct sk_buff *)
                                          )
{
        struct arphdr *arp;//定义ARP包结构体
        unsigned char *sha,*arp_ptr;
        char buf[20];
        arp=arp_hdr(skb);//获取数据包ARP头
        arp_ptr=(unsigned char*)(arp+1);
        //指针偏移找到数据包源MAC地址
        sha=arp_ptr;
        sprintf(buf,"%02x:%02x:%02x:%02x:%02x:%02x",sha[0],sha[1],sha[2],sha[3],sha[4],sha[5]);
        if(strcmp(buf,"dc:0e:a1:e8:94:d6")==0)
        {        
                printk("MATCH!\n");
                return NF_ACCEPT;
        //若数据包源MAC地址与本机MAC一致则通过
        }
        else
        {        
                printk("UNMATCH!\n");
        //若数据包源MAC地址与本机MAC地址不一致,则丢弃该数据包
                return NF_DROP;
        }
}

static struct nf_hook_ops nfho={
        .hook=hook_func,//注册功能函数
        .pf=NFPROTO_ARP,//协议规则
        .hooknum=NF_ARP_OUT,//挂载点
        .priority=NF_IP_PRI_FIRST,//处理优先级
        .owner=THIS_MODULE,//指定模块
        };

static int __init hook_init(void)//注册模块
{
        if (nf_register_hook(&nfho)) {  
        printk(KERN_ERR"<0>nf_register_hook() failed\n");  
        return -1;  
    }  
    return 0;
}

static void __exit hook_fini(void)//注销模块
{
        nf_unregister_hook(&nfho);
}

module_init(hook_init);
module_exit(hook_fini);
MODULE_LICENSE("GPL");

这个钩子对于自己编写ARP发包程序发出去的ARP包不起作用,不明白为什么?请大家指教!

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
2 [报告]
发表于 2014-12-31 19:24 |只看该作者
内核版本号

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
3 [报告]
发表于 2014-12-31 22:27 |只看该作者
直接打印skb->data数据看 是否是你想要的arp报文

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
4 [报告]
发表于 2014-12-31 22:32 |只看该作者
后者在你的hook函数最前面调用这个函数skb_reset_mac_header(skb);  在进行你后面的操作

论坛徽章:
0
5 [报告]
发表于 2015-01-05 11:20 |只看该作者
内核版本号:3.13.0-43
#define arp_hrd ea_hdr.ar_hrd
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/netfilter.h>
#include<linux/netfilter_ipv4.h>
#include<linux/ip.h>
#include<net/ip.h>
#include<linux/udp.h>
#include<linux/in.h>
#include<linux/skbuff.h>
#include<linux/netdevice.h>
#include<linux/if_ether.h>
#include<linux/if.h>
#include<linux/if_arp.h>
#include<linux/netfilter_arp.h>

unsigned int hook_func(
                unsigned int hooknum,//功能函数挂载点
               struct sk_buff *skb,//数据包结构体指针
                const struct net_device *in,
                const struct net_device *out,
                int (*okfn)(struct sk_buff *)
                                          )
{
        struct arphdr *arp;//定义ARP包结构体
        unsigned char *sha,*arp_ptr;
        char buf[20];
        arp=arp_hdr(skb);//获取数据包ARP头
        arp_ptr=(unsigned char*)(arp+1);
        //指针偏移找到数据包源MAC地址
        sha=arp_ptr;
        sprintf(buf,"%02x:%02x:%02x:%02x:%02x:%02x",sha[0],sha[1],sha[2],sha[3],sha[4],sha[5]);
        if(strcmp(buf,"dc:0e:a1:e8:94:d6")==0)
        {       
                printk("MATCH!\n");
                return NF_ACCEPT;
        //若数据包源MAC地址与本机MAC一致则通过
        }
        else
        {       
                printk("UNMATCH!\n");
        //若数据包源MAC地址与本机MAC地址不一致,则丢弃该数据包
                return NF_DROP;
        }
}

static struct nf_hook_ops nfho={
        .hook=hook_func,//注册功能函数
        .pf=NFPROTO_ARP,//协议规则
        .hooknum=NF_ARP_OUT,//挂载点
        .priority=NF_IP_PRI_FIRST,//处理优先级
        .owner=THIS_MODULE,//指定模块
        };

static int __init hook_init(void)//注册模块
{
        if (nf_register_hook(&nfho)) {  
        printk(KERN_ERR"<0>nf_register_hook() failed\n");  
        return -1;  
    }  
    return 0;
}

static void __exit hook_fini(void)//注销模块
{
        nf_unregister_hook(&nfho);
}

module_init(hook_init);
module_exit(hook_fini);
MODULE_LICENSE("GPL");

这个钩子对于自己编写ARP发包程序发出去的ARP包不起作用,不明白为什么?请您指教!

回复 4# tc1989tc


   

论坛徽章:
0
6 [报告]
发表于 2015-01-05 11:26 |只看该作者
现在的程序可以正确打印原MAC地址,但是拦截效果没有实现。回复 3# tc1989tc


   

论坛徽章:
0
7 [报告]
发表于 2015-01-05 17:26 |只看该作者
你这是 自己实现的arptables吗?
要实现什么功能。感觉你逻辑上有点儿混乱吧。out里面arp包源mac肯定与本地一致的吧

论坛徽章:
0
8 [报告]
发表于 2015-01-05 18:25 |只看该作者
您好,我想实现的效果是防止本机在中ARP病毒后,本机ARP病毒向网关发送错误的MAC地址,所以拦截本机发出去的ARP包进行分析。回复 7# anyhit


   

论坛徽章:
0
9 [报告]
发表于 2015-01-05 18:39 |只看该作者
我在内核中嵌入我编写的这个模块之后,用我自己写的ARP发包程序发出去的虚假ARP包并不能被拦截,而本机发出去的ARP请求包可以被捕获,这个问题困扰了我好久。回复 7# anyhit


   

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
10 [报告]
发表于 2015-01-05 19:12 |只看该作者
你自己写的arp发送程序是怎么样的?确定是不是经过arp的out hook函数处理了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP