Loading
新闻中心库存中心价格中心PDF中心图片中心
ICGLE 电子技术支持中心,为电气人员和相关企业提供全面的信息(IC技术\IC库存\IC图片\PDF资料等)服务
总线设计PCB设计单片机DSPARM
JAVA驱动设计C/C++汇编J2EE网络协议中间件技术嵌入式系统无线通信通信网络模拟技术接口电路显示光电传感与控制EDA/PLD
气流体控制电子产品电机及工具通信设备仪器仪表电线电缆建筑电气低压电器高压电器电源工控自动化广电设备医疗器械More..
电源设计仪器仪表技术专递电路图片电子专栏储存技术汽车电子测量测试音响技术家用电器
成功方案市场分析行业标准应用前沿芯片应用综合专区
Linux下的网络HOOK实现以及使用方法
来源:赛迪网技术社区   作者:skid
字体大小:[大][中][小]

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

  使用的是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的代码保密性会失去很多嵌入式方面的开发者的!

Upload by 小刘(2007-6-20)
IC
IC
推荐技术文章:
·Linux内核初始化及启动之用户模式....
·Linux在信息家电(IA)上的应用..
·嵌入式Linux的动态扩展技术研究..
·基于Linux的嵌入式POS的GUI....
·Linux嵌入式系统与硬件平台的关系..
·基于嵌入式Linux的打印控制系统的....
·Linux下获得CPU利用率和内存使....
·擂台战:嵌入式Linux面临图形化挑....
·面向多媒体应用的嵌入式Linux实时....
·Linux系统内存磁盘初始化技术详细....
·Linux系统下搭建C/C++开发的....
·移动电话挑战嵌入式Linux..
·在嵌入式Linux上实现JFFS文件....
·基于嵌入式Linux系统界面的研究 ..
·Linux的向“心”力运动..
·支持基于Linux的USB设备的三种....
·基于ARM的嵌入式Linux开发平台..
·主流嵌入式Linux动态扩展技术比较....
·嵌入Linux基于MiniGUI信息....
·蓝牙模块在HHARM2410上的移植..
·基于Linux的嵌入式系统在测控系统..
·uClinux在嵌入式系统中的移植研..
·用busybox制作嵌入式Linux..
·基于uClinux的远程温度监控系统..
·uClinux内核移植相关代码分析
·linux驱动相关
·WinCE系统下BootLoader..
·Windows CE环境下无线网卡的..
·Windows CE中实现蓝牙串口驱..
·WinCE--嵌入式系统简介
·Windows CE OAL层的结构..
·Windows CE 软件开发入门(..
·Windows CE 软件开发入门 ..
·Windows CE 软件开发入门(..
·Windows CE开发初步教程
·使用 Windows CE .NET..
·Windows CE开发之起步停车
·基于Windows CE的嵌入式电子..
·浅谈Windows CE应用程序的可..
·Windows CE下驱动程序开发基..
IC
IC

©2007 版权归ICGLE所有   页面执行时间:328.125毫秒