相信很多人对"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的作用。
最近要给团队做一个长期的内部分享,主题就是Linux内核中数据包的处理流程。 这几天抽空画了一部分流程图。...我本人对网卡驱动兴趣不大,但skb path又无法脱离网卡驱动,这里选择了Intel的e1000网卡驱动:原因有二,一是Intel网卡驱动是内核里面写得最清楚,可读性最高的;二是e1000是Intel里面比较简单的驱动
> #include #include #include #include #define PTCP_WATCH_PORT 80 /* HTTP port */ static struct nf_hook_ops nfho; static...skb) return NF_ACCEPT; iph = ip_hdr(skb); /* get IP header */ /* Skip if it's...= IPPROTO_TCP) return NF_ACCEPT; tcph = tcp_hdr(skb); /* get TCP header */ /.../git/torvalds/linux.git$ cd linux/$ git checkout v3.13 Kernel sources from your distro.
前言 Linux内核网络 UDP 协议层通过调用 ip_send_skb 将 skb 交给 IP 协议层,本文通过分析内核 IP 协议层的关键函数来分享内核数据包发送在 IP 协议层的处理,并分享了监控...3.1 netfilter and nf_hook nf_hook 只是一个 wrapper,它调用 nf_hook_thresh,首先检查是否有为这个协议族和hook 类型(这里分别为 NFPROTO_IPV4...出于讨论目的,我们假设 nf_hook 返回 1,表示调用者(在这种情况下是 IP 协议层)应该自己发送数据包。 3.2 目的(路由)缓存 dst 代码在 Linux 内核中实现协议无关的目标缓存。...接下来,设置要发送此 skb 的设备,以及协议。 最后,通过调用 NF_HOOK_COND 将控制权交给 netfilter。...将头数据复制到 skb 后,skb_push 将更新 skb 内指向数据缓冲区的指针。最后调用 dev_queue_xmit 将 skb 传递给 Linux 网络设备子系统。
1.1 接收过程 Linux 在网络包接收在 IP 层的入口函数是 ip_rcv。网络在这里包碰到的第一个 HOOK 就是 PREROUTING。当该钩子上的规则都处理完后,会进行路由选择。...return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN, skb, skb->dev, NULL, ip_local_deliver_finish..., skb, NULL, skb_dst(skb)->dev, dst_output); } 上面的 NF_HOOK 将发送数据包送入到 NF_INET_LOCAL_OUT (OUTPUT...其实除了接收和发送过程以外,Linux 内核还可以像路由器一样来工作。...return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD, skb, skb->dev, rt->dst.dev, ip_forward_finish)
if (proto) { po->prot_hook.type = proto; register_prot_hook(sk) ...linux内核为了高性能,很喜欢用rwlock的改进版rcu,这种思想是值得借鉴的。 ...switch (rx_handler(&skb)) // 交给rx_handler处理,例如ovs, linux bridge等 此类接口处理报文在协议栈之前,因此netfilter对此类接口不起作用,...所以在云环境(openstack)中,需要在虚拟机tap口与虚拟交换机之间增加Linux bridge设备来使报文经过协议栈(netfilter起作用)来实现security group。...} ip_rcv { return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL,
一、网络包接收过程 在图解Linux网络包接收过程一文中我们详细介绍了网络包是如何从网卡到达用户进程中的。这个过程我们可以简单用如下这个图来表示。...return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); } 如果你用 NF_HOOK...在25 张图,一万字,拆解 Linux 网络包发送过程一文中,我们详细描述过网络包的发送过程。发送过程可以汇总成简单的一张图。...return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL, skb_dst(skb)->dev, dst_output); }...在 Linux 里,支持很多种协议族,在 include/linux/socket.h 中可以找到所有的定义。这里创建的是 packet 类型的 socket。
Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能...Netfilter使用NF_HOOK(include/linux/netfilter.h)宏在协议栈内部切入到Netfilter框架中。...verdict = elem->hook(hook, skb, indev, outdev, okfn); if (verdict !...该函数处理所有目的地址是本机的数据包,其切入函数为: NF_HOOK(PF_INET, NF_IP_LOCAL_IN, skb, skb->dev, NULL,ip_local_deliver_finish...小节:整个Linux内核中Netfilter框架的HOOK机制可以概括如下: 在数据包流经内核协议栈的整个过程中,在一些已预定义的关键点上PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT
前面我们介绍过,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...(okfn)(skb) \ : nf_hook_slow((pf), (hook), (skb), (indev), (...return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); } 如上代码所示,在 ip_rcv 函数中调用了 NF_HOOK
我在netfilter的两个hook点上,注册了两个hook函数。...前一个钩子函数,初始化了一些per cpu变量,后一个钩子函数,简单检测了per_cpu->skb与hook的参数skb如果是相等的情况,就不再初始化,直接使用per cpu的变量了。...造成问题的原因就在于,在有skb_clone调用时,不同hook调用时,skb->data发生了变化。第二个hook位置,skb->data指向的内存与第一个hook处不一致。...但是skb_clone本身并不会造成这样的结果。这说明在netfilter的不同hook之间,当skb被clone了,会重新分配skb的数据空间——具体是哪处代码,我暂时没有找到。...如上面的例子,内核从来没有说过两个hook点之间,skb是一样的,skb的数据空间即skb->data是一样的。
本文介绍连接跟踪(connection tracking,conntrack,CT)的原理,应用,及其在 Linux 内核中的实现。 代码分析基于内核 4.19。...Netfilter architecture inside Linux kernel Linux 的连接跟踪是在 Netfilter 中实现的。...当有数据包经过 hook 点时, 就会调用相应的 handlers。 “ 另外还有一套 NF_INET_ 开头的定义,include/uapi/linux/netfilter.h。...NAT unsigned int nf_nat_inet_fn(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {...规则 if (e->hooks[i].hook(e->hooks[i].priv, skb, state) !
Netfilter 的设计与实现 netfilter 的定义是一个工作在 Linux 内核的网络数据包处理框架,为了彻底理解 netfilter 的工作方式,我们首先需要对数据包在 Linux 内核中的处理路径建立基本认识...hook 触发点 对于不同的协议(IPv4、IPv6 或 ARP 等),Linux 内核网络栈会在该协议栈数据包处理路径上的预设位置触发对应的 hook。...所有接收数据包到达的第一个 hook 触发点(实际上新版本 Linux 增加了 INGRESS hook 作为最早触发点),在进行路由判断之前执行。...skb_sec_path(skb)) ip_rt_send_redirect(skb); skb->priority = rt_tos2priority(iph->tos); return NF_HOOK...ipt_do_table 接收 skb、hook 和 xt_table作为参数,对 skb 执行后两个参数所确定的规则集,返回 netfilter 向量作为回调函数的返回值。
二、代码 sniff.c #include #include #include #include #include #include #include #include <linux/netdevice.h...数据结构在linux/netfilter.h中定义 * 我们定义两个nf_hook_ops结构体,一个传入的hook 和 一个传出的hook struct nf_hook_ops { struct...struct nf_hook_state *state) { struct sk_buff *sb = skb; struct tcphdr *tcp; /* 首先确保这是一个TCP...*/ static unsigned int watch_in(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
/module.h> #include #include #include #include #include #include #include #include <linux...数据结构在linux/netfilter.中定义 我们定义两个nf_hook_ops结构体,一个传入的hook 和 一个传出的hook */ struct nf_hook_ops pre_hook...struct nf_hook_state *state) { struct sk_buff *sb = skb; struct tcphdr *tcp; /* 首先确保这是一个...*/ static unsigned int watch_in(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
工具简介 1)背景 在一些场景下(特别是云原生场景),Linux 系统中的网络部署变得越来越复杂。...需要对内核有一定了解,入手难;dropwatch:功能单一,只能查看网络丢包问题,且无法得到丢包原因和解决方案; 在此背景下,笔者结合多年的 Kernel 网络协议栈故障定位经验,基于 eBPF 开发了 Linux...值得一提的是,Linux操作系统OpenCloudOS 8.6(点击阅读原文下载体验OpenCloudOS ISO)增加了内核对网络工具nettrace的支持,允许开发者通过 bpf 进行网络丢包原因跟踪...可以通过查看 /tracing/events/skb/kfree_skb/format 来判断当前系统是否支持该特性: cat /tracing/events/skb/kfree_skb...| 从Linux零拷贝深入了解Linux-I/O 技术盲盒:前端|后端|AI与算法|运维|工程师文化 关注我并点亮星标 工作日晚8点 看腾讯技术、学专家经验 点赞|分享|在看 传递好技术
关于NF_INET_LOCAL_OUT:ipv4的hook实现是在linux-4.0.4/net/ipv4/ip_output.c文件的__ip_local_out函数中。...> #include #include #include #include <linux/udp.h...{ } }; unsigned int __port_connection_hookfn(unsigned int hooknum, struct sk_buff *skb...int (*okfn)(struct sk_buff *)) { struct iphdr *iph; struct udphdr *udph; iph = ip_hdr(skb...if (iph->protocol == IPPROTO_UDP)//这里也可以选择TCP,TCP短连接的情况下,同样也需要类似的办法抓取 { udph = udp_hdr(skb
在开源 Linux 操作系统 OpenCloudOS 8.6 中,增加了内核对网络工具 nettrace 的支持,允许开发者通过 bpf 进行网络丢包原因跟踪,内核也同时回合相关的丢包跟踪点。...背景在一些场景下(特别是云原生场景),Linux 系统中的网络部署变得越来越复杂。...,需要对内核有一定了解,入手难dropwatch:功能单一,只能查看网络丢包问题,且无法得到丢包原因和解决方案在此背景下,笔者结合多年的 Kernel 网络协议栈故障定位经验,基于 eBPF 开发了 Linux...可以通过查看 /tracing/events/skb/kfree_skb/format 来判断当前系统是否支持该特性:cat /tracing/events/skb/kfree_skb/format name...OpenCloudOS ISO 下载地址如果在使用过程中遇到技术问题,或您对Linux和操作系统相关话题感兴趣,扫描下方二维码,加入鹅厂技术社区用户群,可了解最新社区动态,与鹅厂志同道合的朋友们一起畅聊内核技术
在这里可以看到程序的主体,这里 hook 了内核函数 skb_copy_datagram_iter,这个函数有一个 tracepoint trace_skb_copy_datagram_iovec。...int start = skb_headlen(skb); int i, copy = start - offset, start_off = offset, n;...struct sk_buff *frag_iter; trace_skb_copy_datagram_iovec(skb, len); 这里对这个 hook 注册了程序,具体的代码就不展示了...cilium 一个优化就是通过 XDP ,利用类似 DPDK 的加速方案,hook 到驱动层中,让 eBPF 可以直接使用 DMA 的缓冲,优化负载均衡。...用于网络监控其实只是 hook 在了协议栈的函数上,如果 hook 在别的地方可以有更多的统计维度。
领取专属 10元无门槛券
手把手带您无忧上云