软件无线电安全之GNU Radio基础(下)

图片

往期回顾

软件无线电安全之GUN Radio基础(上)

背景

在上一小节中,我们简单介绍和使用了GNU Radio软件的基础功能和模块,同时通过GNU Radio Companion(GRC)创建了简单的流程图,展示了信号生成、处理和输出的流程。最后通过制作一个FM receiver来加深对GNU Radio的了解。在这一小节中我们将更加深入的了解和使用GNU Radio软件的功能,并制作一个简单的蓝牙抓包器。

GNU Radio使用

Bits的打包和解包

Bits的打包与解包对于表示二进制数据(与数字化 RF 样本相对)以及使用调制器模块(Constellation调制器、GFSK 调制器和 OFDM 发射器)非常有用。我们创建一个新流程图并将 Random Source 模块添加到工作区,把他的输出设置为byte,此时输出端口由紫色显示。

图片

然后将 Throttle、Pack K Bits、Char to Float 和 QT GUI Histogram Sink 模块按照下图添加到流程图并连接它们:

  1. 编辑 Pack K Bits 的属性,设置K为4

  2. 编辑QT GUI Histogram Sink的属性,设置Number of Bins: 1024,Max x-axis: 16。

  3. 编辑另一个QT GUI Histogram Sink的属性,设置Number of Bins: 1024,Max x-axis: 16。

图片

此时我们开始运行流程图, 4 Bit的直方图显示 0 到 15 的值,而1 Bit的直方图显示 0 和 1 的值 。

图片

随后我们将 Unpack K Bits 模块添加到工作区,并将其连接在 Pack K Bits 模块和 Char to Float 模块之间。编辑 Unpack K Bits 模块属性并输入 K: 4,流程图如下。

图片

此时如果我们运行一下,就会得出上面框图是0-15的数值范围,下面的1bit只有0和1。

图片

流和向量

GNU Radio 中的块可以使用流或向量进行连接。流为每个时间单位携带 1 个实例样本,且必须具有数据类型,例如 Float 32 或 Byte。向量是能够在单个时间实例中携带多个采样,代表了多个数据的平行存在。GRC 使用较浅的颜色表示流,使用较暗的颜色表示向量。我们用下面的流程图来更深刻的理解一下流,第一个数据源是一个1k的cosine函数,这个输出的stream类型的数据就是数据流。然后我们使用节流阀进行一个流量控制,然后可以将这个流送到一个QT GUI Time Sink中来展示出来。运行效果如下:

图片

然后我们将第一个流程图的信号源复制出三份,然后分别将它们的输出类型设置成complex、float和short。此时我们可以用一个stream to vector的,将流转化为向量,我们可以收集128个数据,然后合成一个向量。

图片

此时运行效果如下:

图片

我们使用一个流转成向量的典型例子,更形象地展示一下。下面这个流程图引入了两个数据源,一个是1KHz的cosine信号源,另一个是100Hz的cosine信号源,然后第一个信号源设置浮动为正负1,第二个信号源设置浮动为正负0.1,相当于我们有两个数据流,此时我们用一个strings to vector,把俩个数据源的流留合成为一个向量,然后接着我们再把合成的向量转换成一个数据,然后把它显示出来。

图片

我们可以运行流程图查看一下效果,第一个是我们的100Hz的cosine信号源正负0.1的效果图,第二个是1KHz的cosine信号源正负1的一个数据源。第三个图为把两个交替信号源显示的效果图。

图片

类似byte的打包解包,我们可以用vector to stream模块将两个stream打包成一个vector,那我们也可以利用vector to streams模块将数据拆解回原来的样子。下面流程图中,两个数据源经过streams to vector,然后打包把它先显示出来,然后调用Vector to Streams 模块反序列化向量样本并将其转换为流,执行与Streams to Vector 模块的相反操作。

图片

我们可以运行流程图查看一下效果,此时经过打包之后的一个合成数据源已分为两个流:

图片

层次块

当我们想要在设计其他流程图中,如何自己设计一个模块并使用呢?这时就用到了层次块。在GNU Radio Companion软件中点击就File-New-Hier Block,即可创建层次块流程图。在新的 GRC 选项卡中创建流程图如下:

图片

双击选项块并编辑属性,设置Id: FrequencyShifter,Title: Frequency Shifter Block。

图片

此时我们需要注意变量与 GNU Radio 中的参数不同。参数为 hier 块创建一个接口以接受来自外部源的值,而变量仅存在于 hier 块内部。

图片

例如, samp_rate 变量只能从 hier 块内访问。

图片

那么我们就需要删除 samp_rate 变量,将其替换成为参数,我们将俩个参数块添加到 GRC 工作区中,以便可以从较大流程图中的另一个块进行更新。

  1. 设置第一个参数属性:Id: samp_rate,Label: Sample Rate,Type: Float

  2. 设置第二个参数属性:Id: frequency,Label: Frequency,Type: float

图片

流程图设置完成后,需要generate保存。但是此时从右侧功能模块中搜索,并不能搜索到我们保存的层次块。

图片

我们需要单击重新加载块按钮,此时再次从右侧功能模块中搜索,就可以搜索到我们保存的层次块了。

图片

创建一个python块

python块是什么功能呢,我们要实现一个功能块,它可以中有多个输入,并且会根据属性中的特定参数进行相应处理。通常,Python 块有两个属性:代码(代码,一个点击框,其中包含该块的 Python 代码的链接)和参数(块的输入参数)。在下面的例子中,我们要实现一个可以实现输入相加或者相乘的一个块。该功能块的参数可以决定是相加还是相乘。我们搜索 Python 块并将其添加到工作区:

图片

单击 Open in Editor 编辑 Python 代码:

图片

此时编辑器窗口中会显示 Python 块的 Python 代码:

注意: __init__() 和 work() 函数必须符合 GNU Radio 软件框架的规则和期望进行修改,该框架控制块输入和输出之间的数据传输。

图片

我们可以在编辑器菜单中选择“查找和替换”,将默认example_param参数重命名以方便我们自己查看,这里我全部替换为additionFlag。

图片

接下来就是修改功能实现部分了,该python文件中定义了默认块有一个输入和一个输出,但是我们需要该块的两个输入,我们需要将第二个  np.complex64 添加到 in_sig列表中。同时,python块在处理条件分支时,处理逻辑分别为加和乘,那么我们需要修改work函数。最终修改的代码如下:

图片

根据我们设计的逻辑,在“加法”或“乘法”模块中参数选择“True”处理逻辑为两个信号源的相加。运行流程图给出以下两个图:

图片

当我们设置参数为 Additionflag 属性输入 False,处理逻辑为相乘。这时两个复数正弦曲线相乘会在两个频率之和处产生一个正弦曲线。因此,频率为 1,000 的信号源与频率 3,000 的乘积是频率为 4,000 的复正弦曲线。运行流程图时可以看到这个复杂的正弦曲线:

实验:制作一个简单的蓝牙抓包器

实验的github仓库地址为"https://github.com/oldprogram/sdr4iot-ble-rx",该工具可以捕获的 BLE 数据包并通过命名管道 (FIFO) 直接显示在 Wireshark 中。我们使用Gnu Radio 用于接收和解调传入的 BLE 数据包。我们打开仓库中的流程图进行查看,流程为使用hackrf one设备收集到的数据,然后送到一个阈值滤波,-70的db的一个阈值滤波进行静噪和滤波。再送到GFSK模块(蓝牙的一种调制方式为GFSK)中进行个解码,解码后的数据再进行一个打包。然后数据会通过ZMQ模块(ZMQ模块,下小节中会进行讲解)pub出去。这样我们就可以用这个流程图实现一个功能,就是拿到了蓝牙最原始的GFSK数据包,并把它解出来就拿到蓝牙的物理层级别的数据。那接下来再写一个数据链路层的一个数据包的解析(ble_dump.py文件实现此功能,下一小节中讲解),就能把蓝牙的广播包提取出来。

图片

我们打开终端,运行下面的命令进行蓝牙抓包:

mkfifo /tmp/fifo1
wireshark -S -k -i /tmp/fifo1
./ble_dump.py -o /tmp/fifo1

抓包效果如下:

图片

总结

这一小节,我们更加深入的了解和使用GNU Radio软件的功能,同时对流程图基础知识也有了更好的拓展。从这一小节开始我们将接触与python的交互,方便我们更加高效和快捷的使用GNU Radio。在下一小节中,我们会学习ZMQ模块的使用以及蓝牙抓包器的原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gitee配置SSH公钥

采用SSH协议同步Git仓库代码的好处就是高效。在配置好SSH公钥后,不需要每次操作都要输入用户名和密码(主要针对命令行来说)。 以我个人项目为例。 生成 SSH 公钥 1. 通过命令 ssh-keygen 生成 SSH Key: ssh-keygen -t ed25519…

2024年认证杯SPSSPRO杯数学建模D题(第一阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现: 2023 年开年,ChatGPT 作为一款聊天型AI工具,成为了超越疫情的热门词条;而在AI的另一个分支——绘图领域,一款名为Midjourney(MJ&#xff…

算法-字符串-5.最长回文子串

一、题目: 二、思路解析 1.思路: 最长子串——动态数组 2.常用方法: a.字符串的截断 ress.substring(start,end1); 3.核心逻辑: 1.特殊情况:字符串为空或字符串的长度为0 if(snull||s.length())return ""…

高中数学:计数原理-二项式定理

文章目录 一、二项式定理与通项公式二、二项式系数的性质 一、二项式定理与通项公式 我们先来看完全平方公式 二、二项式系数的性质

刷题计划day26 回溯(五)回溯止【N 皇后】【解数独】

⚡刷题计划day26 回溯(五)继续,回溯最后一个专题,今天的是hard题,也是比较经典的题型,可以点个免费的赞哦~ 往期可看专栏,关注不迷路, 您的支持是我的最大动力🌹~ 目录…

UE5基本数据类型

bool: 表示布尔值,只有两个取值:true 或 false,用于表示逻辑条件。int8: 表示 8 位的有符号整数,范围是 −128−128 到 127127。uint8: 表示 8 位的无符号整数,范围是 00 到 255255。int16: 表示 16 位的有符号整数&am…

linux的vdagent框架设计

1、vdagent Linux 的 spice 客户代理由两部分组成,一个系统范围的守护进程 spice-vdagentd 和一个 X11 会话代理 spice-vdagent,每个 X11 会话有一个。spice-vdagentd 通过 Sys-V initscript 或 systemd 单元启动。 如下图:spice-vdagent&a…

docker修改并迁移存储至数据盘

文章目录 前言一、操作步骤(需要root权限)1. 查看磁盘占用,查看当前docker目录占用的空间2. 查看正在运行的容器,并停止容器及服务3. 拷贝数据、修改配置(关键步骤)4. 加载配置,启动服务及容器 …

证明网络中的流形成一个凸集

证明网络中的流形成一个凸集 步骤1:定义和符号步骤2:线性组合步骤3:验证容量限制步骤4:验证流量守恒结论示例代码(C语言) 在网络流理论中,一个流 f f f 是定义在网络图的边集上的一种函数&…

阿里云轻量应用服务器开放端口,图文教程分享

阿里云轻量应用服务器如何开放端口?在轻量服务器管理控制台的防火墙中添加规则即可开通端口,开通80端口就填80,开通443就填443端口,开通3306端口就填3306。阿里云百科网aliyunbaike.com整理阿里云轻量应用服务器端口号开通图文教程…

如何在Ubuntu中利用repo和git地址下载获取imx6ull的BSP

01-设置git的用户名和邮箱 git config --global user.name "suwenhao" git config --global user.email "2487872782qq.com"这里不设置的话后面在第5步的repo配置中还是会要求输入,而且以后进行相关操作都要输入,不妨现在就进行配置…

C++设计模式之外观模式

动机 下图中左边方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统…

13.高级GLSL

高级GLSL 1.GLSL的内建变量 着色器都是最简化的,如果需要当前着色器以外地方的数据的话,我们必须要将数据传进来。我们已经学会使用顶点属性、uniform和采样器来完成这一任务了。然而,除此之外,GLSL还定义了另外几个以gl_为前缀…

使用数据层进行数据生命周期管理

作者:来自 Elastic Stef Nestor Elasticsearch 7.10 使配置数据生命周期变得不再那么复杂。在这篇博文中,我将介绍一些变化、如何使用它们以及一些最佳实践。 数据生命周期可以包含很多阶段,因此我们将涉及: 将集群划分为层&…

Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1

文章目录 Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、安装配置Jenkins2.1 安装JDK…

用Python绘制医学热图

在医学研究和临床实践中,数据的可视化是不可或缺的一部分。通过直观的数据展示,医学专业人员可以更好地理解各种疾病的治愈率、治疗效果以及医院之间的差异。今天,我们将介绍一种强大的数据可视化工具——热图(Heatmap&#xff09…

WPF 本地生成验证码

1、效果如下图&#xff0c;点击图片可更新验证码&#xff08;其实图片就是一个Button的背景图&#xff09;。 2、主要使通过用户控件创建&#xff0c;UCVerificationCode.xaml代码如下。 <UserControl x:Class"UC.UCVerificationCode"xmlns"http://schemas.…

彻底理解ThreadLocal的应用场景和底层实现

一.概念 定义&#xff1a; ThreadLocal 是 Java 中所提供的线程本地存储机制&#xff0c;可以利用该机制将数据缓存在某个线程内部&#xff0c;该线程可以在任意时刻、任意方法中获取缓存的数据。 其实是可以通过调用 Set() 方法往里面存入值&#xff0c;存入的值是每个线程互…

视频 的 音频通道提取 以及 视频转URL 的在线工具!

视频 的 音频通道提取 以及 视频转URL 的在线工具&#xff01; 工具地址: https://www.lingyuzhao.top/toolsPage/VideoTo.html 它提供了便捷的方法来处理视频文件&#xff0c;具体来说是帮助用户从视频中提取音频轨道&#xff0c;并将视频转换为可以通过网络访问的URL链接。无…

shell自动显示当前git的branch

效果简介&#xff1a; 1. 如果没在git仓库&#xff0c;显示无变化 2. 如果在git仓库&#xff0c;显示当前分支 实现方法&#xff1a; 在~/.bashrc 里添加&#xff1a; function git_branch { test -d .git && branch"git branch | grep "^\*" | sed…