AF_PACKET套接字解密 --- 02

2023-11-02

AF_PACKET套接字解密 --- 02  2012-05-23 22:36:57

分类: LINUX

当AF_PACKET套接字注册了prot_hook后,怎样进行监听呢,先来看发送:

当协议栈准备将数据交给net_device发送时,它将调用dev_queue_xmit():


点击(此处)折叠或打开

  1. int dev_queue_xmit(struct sk_buff *skb)
  2. {
  3.     struct net_device *dev = skb->dev;
  4. ......
  5.                     rc = dev_hard_start_xmit(skb, dev, txq);
  6. ......
  7. }

点击(此处)折叠或打开

  1. int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
  2.             struct netdev_queue *txq)
  3. {
  4. ......
  5.         if (!list_empty(&ptype_all))
  6.             dev_queue_xmit_nit(skb, dev);
  7. ......
  8. }

由于AF_PACKET套接字注册了prot_hook,将导致dev_queue_xmit_nit()被调用:

点击(此处)折叠或打开

  1. static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
  2. {
  3.     struct packet_type *ptype;
  4.     struct sk_buff *skb2 = NULL;
  5.     struct packet_type *pt_prev = NULL;

  6.     rcu_read_lock();
  7.     list_for_each_entry_rcu(ptype, &ptype_all, list) {
  8.         /* Never send packets back to the socket
  9.          * they originated from - MvS (miquels@drinkel.ow.org)
  10.          */
  11.         if ((ptype->dev == dev || !ptype->dev) &&
  12.          (ptype->af_packet_priv == NULL ||
  13.          (struct sock *)ptype->af_packet_priv != skb->sk)) {
  14.             if (pt_prev) {
  15.                 deliver_skb(skb2, pt_prev, skb->dev);
  16.                 pt_prev = ptype;
  17.                 continue;
  18.             }

  19.             skb2 = skb_clone(skb, GFP_ATOMIC);
  20.             if (!skb2)
  21.                 break;
  22. ......
  23.         }
  24.     }
  25.     if (pt_prev)
  26.         pt_prev->func(skb2, skb->dev, pt_prev, skb->dev);
  27.     rcu_read_unlock();
  28. }
在遍历ptype_all链表时,这里有几点需要着重说明:

1:对于发送的包过滤条件有:
    1). net_device是否是prot_hook指定的dev(NULL代表全部匹配)。
    2). ptype->af_packet_priv在packet_creat()中被设定为自己,故自己发送的包不会被监听。

2:遍历ptype_all时,第一次会复制skb;只有ptype_all中不止1个entry时,将调用deliver_skb()。

3:当退出遍历时,将调用prot_hook的func成员,即packet_rcv()。

4: deliver_skb()仅仅是在调用prot_hook的func成员前增加skb的引用计算数。

点击(此处)折叠或打开

  1. static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
  2.          struct packet_type *pt, struct net_device *orig_dev)
  3. {
  4. ......
  5.     __skb_queue_tail(&sk->sk_receive_queue, skb);
  6. ......
  7. }
经过packet_rcv(),发送的数据包被加入到了AF_PACKET套接字的接收队列,等待我们的读取。。。一切就是这么简单!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AF_PACKET套接字解密 --- 02 的相关文章

  • Linux安装libpcap(pcap.h库)(以Ubuntu 18.04为例)

    做毕业设计需要用到libpcap来抓包 借此次机会完整记录下自己的安装过程 xff0c 前人种树后人乘凉 到libpcap官网去下载最新的源码包 下载完成后tar xzf 文件 tar gz 解压 xff0c 于是我们可以看到完整的源码目录
  • AF_PACKET套接字解密 --- 02

    AF PACKET套接字解密 02 2012 05 23 22 36 57 分类 LINUX 当AF PACKET套接字注册了prot hook后 怎样进行监听呢 先来看发送 当协议栈准备将数据交给net device发送时 它将调用dev
  • 使用 TPACKET_V2 时,Vlan id 设置为 0

    我对这个 TPACKET V2 的使用有疑问 我的问题是 在套接字上设置这种类型的数据包后 当我尝试接收一些数据包时 我无法从数据包中读取 vlan id 当然是从数据包的标头 vlan tci 始终为 0 现在我正在使用 open sus
  • Android NDK:尝试移植 JnetPcap

    我发现了一个Android流量监控应用程序 Shark 它基于 JnetPcap 并且有一个包含所有源文件和相应的文件Android mk files 我将 jni 目录放在 Android NDK 的示例文件中 并尝试使用ndk buil
  • 在 libpcap pcap_loop() 回调上传递参数

    因为我想做一些测试libpcap http www tcpdump org pcap htm和一个小型 C 程序 我试图将一个结构从 main 传递到 got packet 阅读 libpcap 教程后 我发现了这一点 pcap loop
  • 转换 .wav 文件中的 RTP 序列有效负载

    我有一个文本文件 其中包含 VoIP 对话的 RTP 数据包的有效负载 十六进制 有谁知道如何将文本转换为文件 使用 c c 的 wav 音频 PS 我使用的是 GNU Linux Thanks 我用 Java 做了同样的事情 这是我用于测
  • pcap 纳秒 Python

    有没有办法使用现有的 python 库从 pcap 中获取纳秒 我有一个纳秒 pcap 文件 可以与 Wireshark 配合使用 但与 Python 配合使用效果很好库甚至不会导入该文件 此功能确实存在于 c libpcap 中 请参阅
  • 如何使用libpcap中的“pcap_lookupdev()”?

    代码找不到任何设备 我想知道 pcap lookupdev 是做什么的 谢谢 include
  • libpcap 还是 PF_PACKET?

    我知道这个问题已经讨论过很多次了 我应该使用 libpcap 还是 PF PACKET 数据链路套接字 来捕获数据包 根据我的研究 几乎所有地方都建议使用 libpcap 而不是 PF PACKET 主要是因为它的可移植性 然而 对于我当前
  • 在监控模式下使用 libpcap 嗅探 wifi

    问题陈述 Calling pcap activate 结果是PCAP ERR RFMON NOTSUP错误 即不支持 RF 监控模式 Context 我正在编写一个小型 C 程序 其工作是在监视器模式下监听我的笔记本电脑的 wifi 卡 该
  • libpcap:pcap_breakloop() 导致内存泄漏

    使用 Linux 时pthreads and libpcap我在使用时注意到一些奇怪的行为pcap breakloop 我的目标如下 打开一个将运行的新线程pcap loop并处理捕获的数据包 而主线程将执行其他操作 当收到信号 SIGIN
  • 如何确定目标MAC地址

    我的应用程序在 CentOS 5 5 上运行 我需要使用 libpcap API 发送原始数据包 pcap inject or pcap sendpacket 到特定的IP地址 如何确定 MAC 地址属于特定目标 看起来你想要的是ioctl
  • pcap_loop 和 pcap_dispatch 区别

    pcap loop 和 pcap dispatch 到底有什么区别 该手册对这一点的描述非常好 我是板着脸说的 保证 从man pcap loop pcap loop processes packets from a live captur
  • 当scapy和pypcap严重丢失时,如何嗅探python上的所有数据包?

    我尝试使用 python 在 Win10 上嗅探数据包 然而 我发现很多数据包实际上是被 scapy 丢弃的 例如 我从 ftp 下载一个 2 MB 的文件 wireshark 捕获了近 2000 个数据包 而 scapy 只捕获了 500
  • 为什么 pcap_datalink() 总是返回 1(以太网),即使在无线设备上也是如此?

    我遇到一个问题pcap datalink 总是会回来1 据我了解 这是LINKTYPE ETHERNET 但是 我使用的设备是无线卡 就我而言en0 这会阻止我将卡置于监控模式 并阻止我的 WLAN 过滤器工作 我尝试在 OSX 和 Lin
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • 在 macOS 上更改 libpcap 版本(Apple 删除了一项功能)

    我只想使用 tcpdump 和 Ubuntu 上提供的相同 Qout 功能 在 macOS 上 tcpdump 和 libpcap 已被剥离使用 Qout 进行过滤的功能 tcpdump Qout nnSX c 10 w packet pc
  • Python 和 libpcap。查找数据包的源mac地址

    我正在编写 python 程序来使用 pcap 构建 mac 地址缓存 但是 python 的 pcap 模块没有好的文档 我找到了这个页面http pylibpcap sourceforge net http pylibpcap sour
  • 发送 802.11 帧的“帧控制字段”数据的顺序?

    以下是 QoS 数据 FC 字段的位格式 00 01 0001 01000010 前2位代表版本 接下来2位代表类型 接下来4位代表子类型 其中ToDS 0 FromDS 1 保护位 1 那么 上述数据在空中是按照什么顺序通过接口发送的呢

随机推荐

  • [764]tmux简介及使用教程

    tmux是一个开源工具 用于在一个终端窗口中运行多个终端会话 它可以减少过多的打开终端控制台 tmux的源码在 https github com tmux tmux 它的License是BSD Tmux 是一个终端复用器 terminal
  • 记录yolov5更改backbone为ShuffleBlock网络迁移训练出错问题以及解决方法

    前言 最近在学习yolov5 记录一些报错 1 张量不对 Sizes of tensors must match except in dimension 1 Expected size 16 but got size 8 for tenso
  • 雾化(使用w分量)

    11
  • 将一个按钮固定在右下角

    fix btn position fixed bottom 5rem right 2rem
  • xpath——4k解析图片

    需求 解析下载图片数据 http pic netbian com 4kyouxi import requests from lxml import etree import os if name main headers User Agen
  • 互联网背景下为什么会出现NoSQL?

    一 传统应用模式 ALL IN ONE 所有的东西都部署在一台机器上 包括站点 数据库 文件等等 现在阿里云的出现方便了很多 核心工作就是 前端传过来一些数据 然后业务逻辑层拼装 然后访问数据库 数据库返回数据 数据拼装成页面 最终返回到浏
  • Python做一个简单的名片管理系统

    项目介绍 如下图 本次项目主要完成新建名片 显示全部名片 查询对应名片并对对应名片完成相关操作 框架搭建 名片管理首先可以由main py以及tools py组成 main py主要完成主要功能 tools主要完成选择分支下的功能 由于每次
  • 面经-阿里电话面试

    又是一年面试季节 闲来无事看看市面上都在找那些技术 查缺补漏弥补不足 当然如果能够找到不错的去处也是好的 说来惭愧 第一次接到阿里电话时正在外边跟同事吃饭 环境实在是不允许 冒昧的给推迟到第二天了 第二次 是第二天的下午开会中 由于手机静音
  • VLC相关参数中文说明!

    用法 vlc 选项 流 您可以在命令行中指定多个流 它们将被加入播放列表队列 指定的首个项目将被首先播放 选项样式 选项 用于设置程序执行期间的全局选项 选项 单字母版本的全局 选项 选项 一个仅在流之前应用的选项 且将覆盖先前的设置 流
  • 探索Java中的反射机制:解析类的信息与执行动态操作

    探索Java中的反射机制 解析类的信息与执行动态操作 引言 在Java编程领域中 反射机制是一项强大的工具 它使得我们能够在运行时动态地获取 使用类的信息 甚至可以对类进行修改 通过反射 我们可以在编译时未知类的情况下 通过获取类的构造方法
  • 为什么 Java 中只有值传递?

    开始之前 我们先来搞懂下面这两个概念 形参 实参 值传递 引用传递 形参 实参 方法的定义可能会用到 参数 有参的方法 参数在程序语言中分为 实参 实际参数 用于传递给函数 方法的参数 必须有确定的值 形参 形式参数 用于定义函数 方法 接
  • python中函数返回值为func 和func() 的区别

    今天看书注意到一个问题 就是有些函数的返回值是直接return func 有些则是return func 看不清其区别 所以自己探究了一下 首先定义一个foo函数 def foo pass 察看type foo 得到
  • fabric2.X以上系统用test-network环境测试自己的链码

    首先 我们需要安装好fabric2 X的环境 具体参考我之前的文章 这里默认已经有了fabric2 X的环境 进入test network文件夹 在开始测试之前 先把gopath项目路径全部解锁 sudo chmod R 777 GOPAT
  • 时间复杂度以及空间复杂度——程序的性能分析

    什么是时间复杂度 算法的渐进时间复杂度T n O f n 其中f n 表示每行代码执行次数之和 而 O 表示正比例关系 大O符号表示法并不是用于来真实代表算法的执行时间的 它是用来表示代码执行时间的增长变化趋势的 时间复杂度是一种用于衡量算
  • 使用MATLAB实现对信号的EMD分解

    文章目录 0 前言 1 经验模式分解EMD 2 希尔伯特变换HT 3 希尔伯特 黄变换HHT 4 基于EMD的语音信号处理 5 MATLAB实现对信号的EMD分解 5 1 对构造的信号进行EMD 5 2 对实际的信号进行EMD 6 参考文献
  • python pyecharts的基础使用

    python pyecharts的基础使用 导包 from pyecharts charts import Line from pyecharts options import TitleOpts LegendOpts ToolboxOpt
  • 如何用springboot实现发送通知给用户的功能

    可以使用 Spring Boot 中的 Spring Boot Starter Mail 来实现发送通知给用户的功能 首先需要在项目的 pom xml 文件中添加对 spring boot starter mail 的依赖 然后在 appl
  • 【程序人生】5个月从职场打杂到月薪14000的女测试工程师逆袭之路

    大家好 我是来自湖南的一位辣妹子 毕业于一所工业大学 大学的专业是软件与工程 其实也算是本专业 大学期间掌握的知识也算比较广 各个方面都会一丢丢 就是不是特别深入 之所以这么说 是因为一直以来我觉得自己还不错 但毕业设计的时候 怎么也做不出
  • Audition报错:“无法应用设备设置,因为发生了以下错误:MME设备内部错误“

    今天打开AU提示有一个错误如下 打开设置以后就这样显示三条都不可用 查找了相关资料发现都不能解决 后来自己尝试几个地方设置才得以解决 问题出在如下 没有选对相应输入输出设备
  • AF_PACKET套接字解密 --- 02

    AF PACKET套接字解密 02 2012 05 23 22 36 57 分类 LINUX 当AF PACKET套接字注册了prot hook后 怎样进行监听呢 先来看发送 当协议栈准备将数据交给net device发送时 它将调用dev