http://blog.csdn.net/wswifth/article/details/5115358

在师哥的代码(packet.c)中使用的是Linux2.4内核中的一个子系统:netfilter,该子系统的使用可以过滤数据包,也就对数据包经行了截获,它通过调用内核网络代码中的一些hook函数完成所需要的工作。

而当一个当数据包游历Linux内核的网络堆栈时,它穿过了几个hook点,在这里,数据包可以被分析并且选择是保留还是丢弃,这些hook点就是Netfilter hook。

而钩子函数(回调函数)也是系统内核为驱动程序提供的一些特定的函数,在驱动程序中某个变量的状态发生改变或将要改变或改变完成时,将会自动调用该回调函数,在netfilter中的状态就有五个(针对IPV4):

hook调用的时机
NF_IP_PRE_ROUTING              在完整性校验之后,选路确定之前
NF_IP_LOCAL_IN               在选路确定之后,且数据包的目的是本地主机
NF_IP_FORWARD                     目的地是其它主机地数据包
NF_IP_LOCAL_OUT                  来自本机进程的数据包在其离开本地主机的过程中
NF_IP_POST_ROUTING            在数据包离开本地主机“上线”之前

而netfilter的返回值有5种:

返回值                含义
NF_DROP                   丢弃该数据包
NF_ACCEPT         保留该数据包
NF_STOLEN               忘掉该数据包
NF_QUEUE                 将该数据包插入到用户空间
NF_REPEAT         再次调用该hook函数

如果要注册一个钩子函数,就要先申明一个nf_hook_ops 结构体,然后对其结构体里面的各个属性进行相应的赋值

struct nf_hook_ops 

struct list_head list; 
nf_hookfn *hook; 
int pf; 
int hooknum; 
int priority; 
}; 
list:链表头,用来把各个处理函数组织成一个表,初始化为{NULL,NULL}; 
hook:我们定义的处理函数的指针,它的返回值必须为前面所说的几个常量之一; 
pf:协议族,表示这个HOOK属于哪个协议族; 
hooknum:我们想要注册的钩子,取值为五个钩子之一; 
priority:优先级,目前Netfilter定义了一下几个优先级,取值也小优先级也高,我们可以根据需要对各个优先级加减一个常量得到符合我们需要的优先级。 
NF_IP6_PRI_FIRST = INT_MIN 
NF_IP6_PRI_CONNTRACK = -200 
NF_IP6_PRI_MANGLE = -150 
NF_IP6_PRI_NAT_DST = -100 
NF_IP6_PRI_FILTER = 0 
NF_IP6_PRI_NAT_SRC = 100 
NF_IP6_PRI_LAST = INT_MAX

以下是一个例子程序:

#define __KERNEL__
#define MODULE

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>

/* 用于注册我们的函数的数据结构 */
static struct nf_hook_ops nfho;

/* 注册的hook函数的实现 */
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 *))
{
    return NF_DROP;           /* 丢弃所有的数据包 */
}

/* 初始化程序 */
int init_module()
{
    /* 填充我们的hook数据结构 */
    nfho.hook = hook_func;         /* 该钩子对应的处理函数 */
    nfho.hooknum  = NF_IP_PRE_ROUTING; /* 使用IPv4的第一个hook */
    nfho.pf       = PF_INET;
    nfho.priority = NF_IP_PRI_FIRST;   /* 让我们的函数首先执行 */

nf_register_hook(&nfho);  //将用户自己定义的钩子注册到内核中

return 0;
}

/* 清除程序 */
void cleanup_module()
{
    nf_unregister_hook(&nfho); //将用户自己定义的钩子从内核中删除
}

对于数据包的截取,使用linux中的netfilter钩子函数的更多相关文章

  1. 网络-数据包在路由转发过程中MAC地址和IP地址,变与不变

    关于MAC地址和IP地址在传输过程中变与不变的问题: 结论:MAC地址在同一个广播域传输过程中是不变的,在跨越广播域的时候会发生改变的:而IP地址在传输过程中是不会改变的(除NAT的时候),总结为 路 ...

  2. 【VS开发】使用WinPcap编程(4)——把网络数据包存储到一个文件中

    这里用到的数据结构是pcap_dumper_t,这也是一个相当于文件描述符的东西,我们在用的时候先指定pcap_dumper_t *dumpfp; 使用两个函数来存储网络数据,一个是pcap_dump ...

  3. linux中应用程序main函数中没有开辟进程的,它应该在那个进程中运行呢?

    1.main函数是一个进程还是一个线程? 不知道你是用c创建的,还是用java创建的. 因为它们都是以main()做为入口开始运行的. 是一个线程,同时还是一个进程. 在现在的操作系统中,都是多线程的 ...

  4. Linux中文件I/O函数

    一.lseek函数 每个打开文件都有一个与其相关联的“当前文件偏移量”.它通常是一个非负整数,用以度量从文件开始处 计算的字节数.通常,读.写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数 ...

  5. (三)flask中的请求钩子函数

    请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...

  6. 让你轻松掌握 Python 中的 Hook 钩子函数

    1. 什么是Hook 经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是 ...

  7. 大数据之路week07--day04 (Linux 中查看文件内容的关键字处)

    Linux如何对文件内容中的关键字进行查找   如果是用vi打开文件后,在命令行下输入“/关键字” 如果是在没有打开文件的前提就用"cat 文件名 | grep "关键字" ...

  8. 大数据之路week06--day07(Linux中的mysql的离线安装)

    这里我提供 服务端和客户端的两个jar包的百度云,也是我使用的 链接:https://pan.baidu.com/s/11a3LT-ENZ8n9IF19-VjmWA 提取码:bdls 离线安装Mysq ...

  9. (转)linux中fork()函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...

随机推荐

  1. tomcat部署方法总结

    可以参考之前的:http://www.cnblogs.com/youxin/archive/2013/01/18/2865814.html 在Tomcat中部署Java Web应用程序有两种方式:静态 ...

  2. VS的基本学习

    2016.4.11  下午 一.数据类型 1.基本数据类型 注:字节:例{10221021  8位数为一个字节    8b=1B} 1).整形(整数) ① short(比Int短   Int16){2 ...

  3. 转:python webdriver API 之alert/confirm/prompt 处理

    webdriver 中处理 JavaScript 所生成的 alert.confirm 以及 prompt 是很简单的.具体思路是使用switch_to.alert()方法定位到 alert/conf ...

  4. nyist 47 过河问题

    http://acm.nyist.net/JudgeOnline/problem.php?pid=47 过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 在漆 ...

  5. java程序运行时内存分配详解 (转)

    转自:http://www.tuicool.com/articles/uU77v2 一.  基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Ja ...

  6. C++之路进阶——bzoj3172(单词)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...

  7. 安装Git

    因为我的开发环境是Windows,那么在windows下安装Git就简单很多了.首先在,从http://msysgit.github.io/下载Git的安装程序,然后按默认选项安装即可. 安装成功之后 ...

  8. JSP和servlet有什么区别?

    JSP和servlet有什么区别? JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达. JSP编译后是"类servlet". Servlet ...

  9. php导入导出

    首先:下载好PHPExcel类库文件 视图层: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  10. SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除

    /*------------------------------------------------------------------------------+ #| = : = : = : = : ...