1.首先指出,NF_HOOK系列宏的outdev参数的传递方式(直接传递一个net_device结构体指针)是不正确的 正确的方式要么是不传递,要么是传递指针的地址,即地址的地址。...2.接下来指出,仅仅传递一个地址为何不对 因为在该HOOK点可能存在多个HOOK函数,每一个函数都有可能改变skb的路由,即调用reroute,比如NAT,比如IP Mark等,这样后续的HOOK函数看到的依然是旧的...因为OUTPUT处在路由之后,如果其中的mangle表改变了skb的mark,那么会reroute,不幸的是,reroute并无法改变OUTPUT点上NF_HOOK的outdev参数值!...4.怎么修正 办法很多,依次介绍: a.使用setsockopt打mark而不是iptables打mark,绕开OUTPUT和路由的暧昧关系; b.修改NF_HOOK的dev参数为struct net_device...**类型,然后在reroute中重路由成功后执行*out = (struct dst_entry*)skb_dst(skb)->dev;从而改变NF_HOOK中的outdev的值; c.去掉NF_HOOK
相信很多人对"Hook"都不会陌生,其中文翻译为"钩子”.在编程中, 钩子表示一个可以允许编程者插入自定义程序的地方,通常是打包好的程序中提供的接口....通过Hook,我们可以暂停系统调用,或者通过改变系统调用的参数来改变正常的输出结果, 甚至可以中止一个当前运行中的进程并且将控制权转移到自己手上....$hello表示字符串"Hello"的地址; 32位Linux系统通过0x80中断来进行系统调用....更多关于32位和64位汇编指令的区别可以参考stack overflow的总结, 因为我当前环境是64位Linux,所以下文的操作都以64位系统为例....参考资料 playing with ptrace part I playing with ptrace part II 安卓动态调试之Hook
LInux Hook技术实践 什么是hook 简单的说就是别人本来是执行libA.so里面的函数的,结果现在被偷偷换成了执行你的libB.so里面的代码,是一种替换。...为什么hook 恶意代码注入 调用常用库函数时打log 改变常用库函数的行为,个性化 怎么hook 这个东西在win里面有现成的api,但是在linux里面却要主动修改ELF文件,或者修改动态库链接路径...所以这里提供一种简单的方法来hook 下面直接demo吧 /*myselect.c*/ #define _GNU_SOURCE #include #include <stdio.h...举个例子: 某些系统上select的实现可能与众不同,在没有fd就绪时,并不阻塞,而是忙等,这时便可以通过hook技术,在select中插入usleep,达到释放cpu的作用。
BNCF范式:在第三范式的基础上,消除主属性之间的部分函数依赖 第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值都是不可再分的最小数据单位,则称R是第一范式的关系。...例:如职工号,姓名,电话号码组成一个表(一个人可能有多个电话号码) 规范成为1NF有三种方法: 一是重复存储职工号和姓名。这样,关键字只能是电话号码。 ...第二范式(2NF):如果关系模式R(U,F)中的所有非主属性都完全依赖于任意候选关键字,则称关系R 是属于第二范式的。...它对任何一个候选关键字都是完全函数依赖的,并且是直接依赖,所以该关系模式是3NF。 分析一下主属性。...1NF直到BCNF的四种范式之间有如下关系: BCNF包含了3NF包含2NF包含1NF 小结: 目的:规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新 原则:
3NF 分解过程 (伪代码) let Fc be the canonical cover(最小函数依赖集) for F, i = 0 for each FD α → β Fc do if (none
ER图转为关系模式 无损分解和保持依赖 3NF分解与BCNF分解 正则覆盖与候选码 如何设计ER图(弱实体集) 如何设计ER图(映射基数) ---- 1. 3NF分解 先求出正则覆盖Fc...B,C->A,CE->G,B->D,C->D} 正则覆盖为{B->DG,CE->B,C->AD} R1=BDG,R2=CEB,R3=CAD CE是候选码,R2包含CE R1,R2,R3没有包含关系 3NF...B->D,D->A 1.函数依赖是:A->BC.B->DE,D->A 2.R1=ABC,R2=BDE,R3=DA,不包含候选码(AF,BF,DF)中任意一个,所以任意添加一个R4=AF 3. 3NF
统计机器中网络连接各个状态个数 netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 一下子不明白$NF是什么意思,去查了下...awk的用法,发现NF表示浏览记录的域的个数 awk ‘{print $1}’打印第一列 awk ‘{print $2}’打印第二列 NF表的是列数 如: a b c d e 那么NF=5 $NF就是表示第五列的值...,就是一行数据最后一列的那个值 $NF就是一行数据最后一列的那个值 netstat -a 最后一列是连接状态 ?
linux/tcp.h> #define PTCP_WATCH_PORT 80 /* HTTP port */ static struct nf_hook_ops nfho; static...unsigned int ptcp_hook_func(const struct nf_hook_ops *ops, struct...;}static int __init ptcp_init(void){ int res; nfho.hook = (nf_hookfn *)ptcp_hook_func; /*...hook function */ nfho.hooknum = NF_INET_PRE_ROUTING; /* received packets */ nfho.pf...hook priority */ res = nf_register_hook(&nfho); if (res < 0) { pr_err("print_tcp: error
Netfilter/iptables由两部分组成,一部分是Netfilter的”钩子(hook)“,这些”钩子”由Linux内核协议栈提供,内核模块可以通过注册”钩子”来完成各种各样的功能。...Netfilter Netfilter是嵌入Linux内核协议栈的,设置在报文处理路径上的一系列调用入口。...Netfilter在不同协议栈的不同点上放置钩子函数,当数据包经过某个协议栈(NF_PROTO)的某个点(NF_HOOK)时,该协议栈会通过NF_HOOK()函数调用对应钩子链表(nf_hooks[NF_PROTO...我们首先初始化nf_hook_ops中的常用字段: static struct nf_hook_ops nf_hook_test_ops = { .hook = test_hook_func;...) { nf_register_hook(&nf_hook_test_ops); } void cleanup_module() { nf_unregister_hook(&nf_hook_test_ops
在ipv4目录下,grep -i nf_hook *.c,可以看到ipv4实现的几个hook点的位置和大致逻辑。其中,这里要使用的就是NF_INET_LOCAL_OUT这个hook点。...关于NF_INET_LOCAL_OUT:ipv4的hook实现是在linux-4.0.4/net/ipv4/ip_output.c文件的__ip_local_out函数中。...err = nf_register_hook(&port_conn_hook);//注册netfilter的hook if (err) { printk(KERN_ERR"nf_register_hook...; } goto out; unregister_hook : nf_unregister_hook(&port_conn_hook); out : return err...; } static void __exit nf_exit(void) { nf_unregister_hook(&port_conn_hook); unregister_net_sysctl_table
// include/linux/netfilter.h /* Function to register/unregister hook points. */ int nf_register_hook...(struct nf_hook_ops *reg); void nf_unregister_hook(struct nf_hook_ops *reg); int nf_register_hooks(struct... nf_hook_ops *reg, unsigned int n); void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)...钩子操作数据结构 // include/linux/netfilter.h struct nf_hook_ops { struct list_head list; /* User fills...nf_test_opt为struct nf_hook_ops类型的结构体数组,其内部包含了所有关键元素,比如钩子函数的注册节点(此处为NF_INET_LOCAL_IN)以及钩子函数(**nf_test_in_hook
前面我们介绍过,Netfilter 通过链表来存储钩子函数,而钩子函数是通过结构 nf_hook_ops 来描述的,其定义如下: // 文件:include/linux/netfilter.h struct...其中 hook 字段的类型为 nf_hookfn,nf_hookfn 类型的定义如下: // 文件:include/linux/netfilter.h typedef unsigned int nf_hookfn...要触发调用某个挂载点上(链)的所有钩子函数,需要使用 NF_HOOK 宏来实现,其定义如下: // 文件:include/linux/netfilter.h #define NF_HOOK(pf, hook...我们来看看 nf_hook_slow 函数的实现: // 文件:net/core/netfilter.c int nf_hook_slow(int pf, unsigned int hook, struct...六、总结 本文主要介绍了 Netfilter 的实现,因为 Netfilter 是 Linux 网络数据包过滤的框架,而 iptables 就是建立在 Netfilter 之上的。
主要的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和巴斯-科德范式(BCNF)。每个高级范式都建立在前一个范式的基础上。...确保表中的每个列的值都与主键直接相关 第二范式(2NF)是基于哪个范式之上的? A. 1NF B. 3NF C....外键约束 如果一个关系模式R满足BCNF,则一定满足: A. 1NF但不一定 满足2NF B. 2NF但不一定满足3NF C. 3NF和2NF D. 1NF, 2NF和3NF 在数据库设计中,范式的提升通常意味着什么...A. 1NF B. 2NF C. 3NF D. BCNF (2)答案和解析 C....D. 1NF, 2NF和3NF 解析:如果一个关系模式满足BCNF,那么它一定也满足1NF、2NF和3NF,因为BCNF是在这些范式的基础上进一步加强约束的范式。 C.
Netfilter 的设计与实现 netfilter 的定义是一个工作在 Linux 内核的网络数据包处理框架,为了彻底理解 netfilter 的工作方式,我们首先需要对数据包在 Linux 内核中的处理路径建立基本认识...hook 触发点 对于不同的协议(IPv4、IPv6 或 ARP 等),Linux 内核网络栈会在该协议栈数据包处理路径上的预设位置触发对应的 hook。...所有接收数据包到达的第一个 hook 触发点(实际上新版本 Linux 增加了 INGRESS hook 作为最早触发点),在进行路由判断之前执行。...NF_HOOK 宏和 netfilter 向量 所有的触发点位置统一调用 NF_HOOK 这个宏来触发 hook: static inline int NF_HOOK(uint8_t pf, unsigned...在执行 NF-HOOK 宏触发指定的 hook 时,将调用 nf_iterate 函数迭代这个 hook 对应的 nf_hook_ops 链表,并依次调用每一个 nf_hook_ops 的注册函数成员
Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能...Netfilter使用NF_HOOK(include/linux/netfilter.h)宏在协议栈内部切入到Netfilter框架中。...在include/linux/socket.h中IP协议AF_INET(PF_INET)的序号为2,因此我们就可以得到TCP/IP协议族的钩子函数挂载点为: PRE_ROUTING: nf_hooks...其核心就是nf_hook_slow()函数。...小节:整个Linux内核中Netfilter框架的HOOK机制可以概括如下: 在数据包流经内核协议栈的整个过程中,在一些已预定义的关键点上PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT
数据结构在linux/netfilter.中定义 我们定义两个nf_hook_ops结构体,一个传入的hook 和 一个传出的hook */ struct nf_hook_ops pre_hook...*/ pre_hook.priority = NF_IP_PRI_FIRST; /*hook的类型为 在完整性校验之后,选路确定之前*/ pre_hook.hooknum = NF_INET_PRE_ROUTING...post_hook.hooknum = NF_INET_POST_ROUTING; /*将pre_hook和post_hook注册,注册实际上就是在一个nf_hook_ops链表中再插入一个nf_hook_ops...结构*/ nf_register_net_hook(&init_net ,&pre_hook); nf_register_net_hook(&init_net ,&post_hook);...nf_hook_ops结构*/ nf_unregister_net_hook(&init_net ,&post_hook); nf_unregister_net_hook(&init_net
数据结构在linux/netfilter.h中定义 * 我们定义两个nf_hook_ops结构体,一个传入的hook 和 一个传出的hook struct nf_hook_ops { struct...post_hook.hooknum = NF_INET_POST_ROUTING; /*将pre_hook和post_hook注册,注册实际上就是在一个nf_hook_ops链表中再插入一个nf_hook_ops...结构*/ nf_register_net_hook(&init_net ,&pre_hook); nf_register_net_hook(&init_net ,&post_hook);...return 0; } void cleanup_module() { /*将pre_hook和post_hook取消注册,取消注册实际上就是在一个nf_hook_ops链表中删除一个nf_hook_ops...结构*/ nf_unregister_net_hook(&init_net ,&post_hook); nf_unregister_net_hook(&init_net ,&pre_hook
p=29690IntroductionNormal From是数据库理论里面最恶心的问题,从1NF到6NF,加上BCNF,DKNF以及UF。...(Don’t just consider the listed FDs, but all that follow).f) Decompose R into 3NF....h) Decompose R into 4NF....) Which of your relations in 3NF are not in BCNF?...f) Which of your relations in 3NF are not in 4NF?
Netfilter architecture inside Linux kernel Linux 的连接跟踪是在 Netfilter 中实现的。...uapi/linux/netfilter_ipv4.h #define NF_IP_PRE_ROUTING 0 /* After promisc drops, checksum checks....当有数据包经过 hook 点时, 就会调用相应的 handlers。 “ 另外还有一套 NF_INET_ 开头的定义,include/uapi/linux/netfilter.h。...可能的结果有: // include/uapi/linux/netfilter.h #define NF_DROP 0 // 已丢弃这个包 #define NF_ACCEPT 1 // 接受这个包...NF_REPEAT 4 // 当前处理函数应当被再次调用 hook 优先级 每个 hook 点可以注册多个处理函数(handler)。
领取专属 10元无门槛券
手把手带您无忧上云