最近疯狂的研究Linux的种种功能,也颇有心得,这里讲述一下Linux下的Net的Hook,使用net的Hook可以实现很多很多非常底层的功能,比如过滤报文,做防火墙,做代理等等。

  Now,Let's Go!

  

  使用的是Linux 2.6.19.1的内核代码。

  首先是 在./Source/net/netfilter/core.c文件中的函数 nf_register_hook:

  

  static DEFINE_SPINLOCK(nf_hook_lock);

  

  int nf_register_hook(struct nf_hook_ops *reg)

  {

  struct list_head *i;

  

  spin_lock_bh(&nf_hook_lock);

  list_for_each(i, &nf_hooks[reg->pf][reg->hooknum]) {

  if (reg->priority < ((struct nf_hook_ops *)i)->priority)

  break;

  }

  list_add_rcu(®->list,
i->prev);

  spin_unlock_bh(&nf_hook_lock);

  

  synchronize_net();

  return 0;

  }

  EXPORT_SYMBOL(nf_register_hook);

  

  void nf_unregister_hook(struct nf_hook_ops *reg)

  {

  spin_lock_bh(&nf_hook_lock);

  list_del_rcu(®->list);

  spin_unlock_bh(&nf_hook_lock);

  

  synchronize_net();

  }

  EXPORT_SYMBOL(nf_unregister_hook);

  

  int nf_register_hooks(struct nf_hook_ops *reg, unsigned int n)

  {

  unsigned int i;

  int err = 0;

  

  for (i = 0; i < n; i++) {

  err = nf_register_hook(®[i]);

  if (err)

  goto err;

  }

  return err;

  

  err:

  if (i > 0)

  nf_unregister_hooks(reg, i);

  return err;

  }

  EXPORT_SYMBOL(nf_register_hooks);

  

  void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)

  {

  unsigned int i;

  

  for (i = 0; i < n; i++)

  nf_unregister_hook(®[i]);

  }

  EXPORT_SYMBOL(nf_unregister_hooks);

  

  上面分别是四个函数:

  nf_register_hook,nf_unregister_hook,nf_register_hooks,nf_unregister_hooks.

  功能是注册Hooks函数

  输入的参数是struct nf_hook_ops *reg。

  

  下面让我们看一个验证ARP报文的Hook代码,以表示我们如何使用Hook函数实现这种功能。

  

  unsigned int arphook_snd(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;

  struct net_device *dev;

  unsigned char * arp_ptr;

  unsigned char *sha, *tha;

  u32 sip,tip;

  unsigned short arpop;

  unsigned int status=NF_DROP;

  

  dev=(*skb)->dev;

  arp = (*skb)->nh.arph;

  arp_ptr= (unsigned char *)(arp+1);

  sha = arp_ptr;

  arp_ptr += dev->addr_len;

  memcpy(&sip, arp_ptr, 4);

  arp_ptr += 4;

  tha = arp_ptr;

  arp_ptr += dev->addr_len;

  memcpy(&tip, arp_ptr, 4);

  

  arpop=ntohs(arp->ar_op);

  

  if(!check_ip(&tip,WABLOCK)) /*check block list*/

  {

  if(arpop==1) /*sending ARP request*/

  {

  if(!check_ip(&tip,WAARP)) /*if not in list add it*/

  add_ip(&tip,WAARP);

  }

  status=NF_ACCEPT;

  }

  return(status);

  }

  

  下面是初始化一些参数的函数

  

  static int arpstar_init(void)

  {

  arphkrcv.hook=arphook_rcv; /*arp receive hook*/

  arphkrcv.hooknum=NF_ARP_IN;

  arphkrcv.pf=NF_ARP;

  arphkrcv.priority=NF_IP_PRI_FIRST;

  nf_register_hook(&arphkrcv);

  

  arphksnd.hook=arphook_snd; /*arp send hook*/

  arphksnd.hooknum=NF_ARP_OUT;

  arphksnd.pf=NF_ARP;

  arphksnd.priority=NF_IP_PRI_FIRST;

  nf_register_hook(&arphksnd);

  

  iphkrcv.hook=iphook_rcv; /*ip rcv hook*/

  iphkrcv.hooknum=NF_IP_LOCAL_IN;

  iphkrcv.pf=PF_INET;

  iphkrcv.priority=NF_IP_PRI_FIRST;

  nf_register_hook(&iphkrcv);

  

  tmac=strtomac(trustedmac);

  trustip=strtou32(trustedip);

  run_timer(0);

  return(0);

  }

  

  下面是函数结束时候的清理工作

  

  static void arpstar_exit(void)

  {

  nf_unregister_hook(&arphkrcv); /*clean up time*/

  nf_unregister_hook(&arphksnd);

  nf_unregister_hook(&iphkrcv);

  del_timer(&watimer);

  free_list();

  kfree(tmac);

  }

  

  我们知道Windows下面也有Hook的功能,但是要Hook到Net的底层,一般是使用NDIS来实现,但是Linux就提供了如此强大的功能,让我们不得不佩服Linux的伟大。几天的研究让我越来越对Linux的推崇!而且我想Linux在嵌入式方面的应用会更加广泛!

  这几天也在看一些嵌入式的资料,想想,这个世界真的可以因为Linux的改变而改变,相对来说Windows的代码保密性会失去很多嵌入式方面的开发者的!

arp hook的更多相关文章

  1. ebtables hook

    1 概述 netfliter框架不仅仅在ipv4中有应用,bridge,ipv4,ipv6,decnet 这四种协议中都有应用,其中ipv4中又分开了arp和ip的两种 其实netfliter是个大的 ...

  2. ARP 实现

    ARP 实现 现在我们介绍一下arp的实现,内核版本2.6.24. [数据结构] 协议栈通过ARP协议获取到的网络上邻居主机的IP地址与MAC地址的对应关 系都会保存在这个表中,以备下次与邻居通讯时使 ...

  3. 探索NDIS HOOK新的实现方法(1)

    NDIS HOOK是专业级防火墙使用的一种拦截技术,NDIS HOOK的重点是如何获得特定协议对应NDIS_PROTOCOL_BLOCK指针,获得了该指针,接下来就可以替换该协议所注册的收发函数,而达 ...

  4. kali linux下的arp攻击

    这是我第一篇博客,写的不好请谅解 ____________________________(分割线)_______________________________ 在kali linux系统下自带工具 ...

  5. svnserver hook python

    在使用中可能会遇到的错误排除 :1.Error: svn: 解析"D:\www\test"出错,或svn: E020024: Error resolving case of 'D: ...

  6. 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息

    ARP欺骗的作用 当你在网吧玩,发现有人玩LOL大吵大闹, 用ARP欺骗把他踢下线吧 当你在咖啡厅看上某一个看书的妹纸,又不好意思开口要微信号, 用arp欺骗,不知不觉获取到她的微信号和聊天记录,吓一 ...

  7. Android Hook技术

    原文:http://blog.csdn.net/u011068702/article/details/53208825 附:Android Hook 全面入侵监听器 第一步.先爆项目demo照片,代码 ...

  8. Frida HOOK微信实现骰子作弊

    由于微信摇骰子的功能在本地进行随机后在发送,所以存在可以hook掉判断骰子数的方法进行修改作弊. 1.frida实现hook java层函数1)写个用来测试的demo,当我们点击按钮的时候会弹出窗口显 ...

  9. (转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理 ...

随机推荐

  1. 类加载器 ClassLoder详解

    一.类加载器定义 从作用的角度来认识类加载器:(根据API文档) 1.类加载器是一个负责加载类的对象,而ClassLoader是一个抽象类.类加载器将xxx.class文件加载到JVM,生成xxx的C ...

  2. Java设计模式(14)——行为模式之不变模式(Immutable)

    一.概述 概念 分类:弱不变模式(子类可变)和强不变模式(子类也是不可变) 应用场景 java.lang.String是一个经典的强不变类 二.分析 与享元模式的关系

  3. 成都Uber优步司机奖励政策(2月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  4. 关于iOS和Android的安装包更新笔记

    关于iOS和Android的安装包更新问题 1. Android更新apk 1)使用DownloadManager下载 2)使用HttpClient下载 apk的下载不能使用ssl,即不能使用http ...

  5. 一文带你了解 Raft 一致性协议的关键点

    此文已由作者孙建良授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Raft 协议的发布,对分布式行业是一大福音,虽然在核心协议上基本都是师继 Paxos 祖师爷(lampor ...

  6. Hive支持行级update、delete时遇到的问题

    Hive从0.14版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置.要想支持行级insert.update.delete,需要配置Hive支持事务.(行级的insert好像不配置也能运 ...

  7. OpenCV 3.0.0处理鱼眼镜头信息 - Fisheye camera model

    此篇随笔主要参考OpenCV 3.0.0的官方文档翻译而来,主要用作理解OpenCV对鱼眼相机的标定.图像校正.3D重建功能的理解. 版权所有,转载请注明出处~ xzrch@2018.09.29 参考 ...

  8. 「赛后补题」Meeting(HDU-5521)

    题意 A,B两个人分别在1和n区.每个区有若干点(区之间的点可以重复,各个区内点间的距离一致),给出区之间有联系的图以及到达所需时间.求两个人见面最短时间以及在哪个区碰面(可有多个) 分析 隐式图搜索 ...

  9. selenium元素定位(三)

    使用selenium就不可避免的要提到界面元素定位,通过元素定位来实现一系列的逻辑操作. selenium提供了8中元素定位的方式: id.name.class name.tag name.link ...

  10. linux c语言 fork() 和 exec 函数的简介和用法

    linux c语言 fork() 和 exec 函数的简介和用法   假如我们在编写1个c程序时想调用1个shell脚本或者执行1段 bash shell命令, 应该如何实现呢? 其实在<std ...