软件无线电安全之GNU Radio基础 -上

IoT 2个月前 admin
27 0 0

软件无线电安全之GNU Radio基础 -上本期作者/0xc4se

GNU Radio介绍


GNU Radio是一款开源的软件工具集,专注于软件定义无线电(SDR)系统的设计和实现。该工具集支持多种SDR硬件平台,包括USRP、HackRF One和RTL-SDR等。用户可以通过GNU Radio Companion构建流程图,使用不同的模块实现信号处理、滤波、解调等功能。GNU Radio提供了丰富的信号处理库,支持实时和离线操作,广泛应用于无线通信、雷达、无线电天文学等领域。其强大的社区支持和详细的文档使开发者能够更好地使用这一工具,灵活、可定制地构建和测试各种无线通信系统。


调制与信号处理流程


人类的可听范围为20 – 20000kHz。相对而言,这些频率远低于FM无线电广播频率。因此,音频波只能传播很短的距离。广播电台想要远程传输声音和音乐的音频信号。那么电台就需要将音频信号中的信息传输到更高频率的载波上。这些波可以比人们可听见的波传播得更远、更快。这个过程称之为调制。调制有几种不同的类型,我们经常收听的FM 广播电台,使用的是频率调制。

在软件无线电(SDR)行业中,数字信号是以离散形式表示的信号,即信号的幅度、频率和相位在时间上是离散的。这与模拟信号不同,模拟信号是连续的。数字信号的处理涉及将模拟信号转换为数字形式,通过一系列离散的处理步骤对其进行操作,最后将结果重新转换回模拟信号。


以下是数字信号在软件无线电行业中的处理步骤:

  1. 模数转换(Analog-to-Digital Conversion,ADC)过程:模拟信号首先通过模数转换器(ADC)转换为数字信号。目的:将连续的模拟信号在时间和幅度上进行离散化,以便计算机能够处理。

  2. 数字信号处理(Digital Signal Processing,DSP)过程:数字信号经过一系列数字信号处理算法,如滤波、混频、解调等。目的:在数字域中对信号进行操作和处理,以提取、增强或变换信号的特定特征。

  3. 数模转换(Digital-to-Analog Conversion,DAC)过程:处理后的数字信号通过数模转换器(DAC)转换为模拟信号。目的:将数字信号还原为连续的模拟信号,以便在后续的模拟电路或设备中使用。

  4. 输出阶段过程:模拟信号经过可能的放大器、滤波器等设备后,最终输出到用户的设备,如扬声器或显示器。目的:将数字信号处理的结果转换为可感知或可用的模拟信号。

在软件无线电中,这些步骤通常在计算机上通过专用软件(例如本小节中的GNU Radio)执行。这种数字信号的处理方法使得系统更加灵活,能够适应不同的通信标准和应用需求。


GNU Radio安装


sudo apt-get install libboost-all-dev libusb-1.0-0-dev python-mako doxygen python-docutils cmake build-essential
git clone git://github.com/EttusResearch/uhd.git
cd ~/code/udh/host
sudo mkdir build
sudo cmake ../
sudo make
sudo ldconfig
export LD_LIBRARY_PATH=/usr/local/lib
sudo apt install cmake git g++ libboost-all-dev python-dev python-mako
python-numpy python-wxgtk3.0 python-sphinx python-cheetah swig libzmq3-dev
libfftw3-dev libgsl-dev libcppunit-dev doxygen libcomedi-dev libqt4-opengl-dev
python-qt4 libqwt-dev libsdl1.2-dev libusb-1.0-0-dev python-gtk2 python-lxml
pkg-config python-sip-dev
sudo apt-get install python3-pip
git clone --recursive https://github.com/gnuradio/gnuradio.git
cd gnuradio
sudo mkdir build
cd build
sudo cmake -DCMAKE_INSTALL_PREFIX=/opt/gnuradio ../
sudo make
sudo make install
sudo vim ~/.barshrc
export PATH=$PATH:/opt/gnuradio/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gnuradio/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/gnuradio/lib/pkgconfig
export PYTHONPATH=$PYTHONPATH:/opt/gnuradio/lib/python2.7/dist-packages


GNU Radio使用


第一个流程图

打开终端运行gnuradio_companion命令,会显示如下界面,界面中有Options和Variable俩个块。我们双击 Options 块,我们可以通过编辑 Id 和 Title 来命名流程图:

软件无线电安全之GNU Radio基础 -上

点击file->save,输入grc文件的名称后保存GRC流程图。


软件无线电安全之GNU Radio基础 -上


我们可以进入保存grc的目录下进行查看,发现保存了一个grc文件和生成了一个python文件。其中grc文件包含了在 GRC 中显示流程图的信息,python文件则包含实际的 Python 流程图代码。


软件无线电安全之GNU Radio基础 -上
软件无线电安全之GNU Radio基础 -上


返回gnuradio打开的grc文件中,键盘使用ctrl+f或者点击菜单栏中的放大镜按钮可以进行模块搜索。这里我们分别搜索 Signal Source 、Throttle、QT GUI Frequency Sink 和 QT GUI Time Sink模板,并按照下图顺序将每个块拖放到工作区中。随后依次点击上一个块out口和下一个块的in口,连接效果如下。


软件无线电安全之GNU Radio基础 -上


点击Execute按钮(菜单栏中绿色的三角按钮)启动程序,我们可以看到如下的波形:


软件无线电安全之GNU Radio基础 -上


定义变量

我们搜索var,然后将Variable变量模块拖入工作区中。并将其id命令为frequency。


软件无线电安全之GNU Radio基础 -上


双击Signal Source,修改Sample Rate的值为samp_rate变量,即可将定义的samp_rate=32k值赋值给Signal Source的。修改Frequency的值为frequency变量。


软件无线电安全之GNU Radio基础 -上


运行时更新变量

GNU Radio 模块库自带 QT GUI 模块,这些模块允许在运行时对流程图进行交互和修改。QT GUI Range 模块会创建一个滑块,可用于运行时更新变量。我们搜索range并将QT GUI Range块拖入工作区中:


软件无线电安全之GNU Radio基础 -上
软件无线电安全之GNU Radio基础 -上


QT GUI Range是一个可变滑块,使用该模块需要设置 QT GUI Range默认值。我们将ID修改为frequency,然后将Default Value设置为 0。这里的start和stop是滑块的开始值和停止值。我们设置起始值为 -samp_rate/2 ,停止值设置为 samp_rate/2 。step是滑块的步长。我们这里将步长设置为 100 Hz ,并点击apply。


软件无线电安全之GNU Radio基础 -上


点击运行流程图后,效果如下。我们可以滑动按钮来修改frequency的值。


软件无线电安全之GNU Radio基础 -上
软件无线电安全之GNU Radio基础 -上
软件无线电安全之GNU Radio基础 -上


QT GUI Chooser为变量创建选项下拉菜单。我们可以搜索Chooser,并将 QT GUI Chooser拖放到工作区中。


软件无线电安全之GNU Radio基础 -上


修改QT GUI Chooser的ID值后,点击apply,发现报错。


软件无线电安全之GNU Radio基础 -上


这里是因为我们前面的QT GUI Range块已经引用了frequecy变量,导致冲突。


软件无线电安全之GNU Radio基础 -上


我们右击QT GUI Range块,点击disable将其禁用,禁用该块后显示为灰色。

软件无线电安全之GNU Radio基础 -上


此时已经显示正常,我们此时点击运行流程图。

软件无线电安全之GNU Radio基础 -上


QT GUI Chooser效果如下。


软件无线电安全之GNU Radio基础 -上
软件无线电安全之GNU Radio基础 -上


信号数据类型

块上的每个输入和输出端口都将具有与之关联的数据类型。数据类型由输入和输出端口的颜色标识,我们单击 Help->Types可以进行查看:


软件无线电安全之GNU Radio基础 -上


窗口显示数据类型及其关联的颜色,这些颜色对应于 GRC 中模块的输入和输出端口。


软件无线电安全之GNU Radio基础 -上


下面示例流程图中使用 Complex Float 32 数据类型,该数据类型使用一对 32 位浮点数来表示复杂样本的实部和虚部。


软件无线电安全之GNU Radio基础 -上
软件无线电安全之GNU Radio基础 -上


运行流程图显示绘制在时域中的复数信号,其中信号 1 是实数分量,信号 2 是复数信号的虚数分量:


软件无线电安全之GNU Radio基础 -上


将所有数据类型转换为 Float 后,我们重新运行该流程图:


软件无线电安全之GNU Radio基础 -上


Signal Source 模块创建一个实际输出,该输出显示为时域中的唯一信号:


软件无线电安全之GNU Radio基础 -上


数据类型转换

搜索 Random Source 块并将其拖动到工作区中:


软件无线电安全之GNU Radio基础 -上


该块默认为 Integer 32 数据类型。双击该块以打开属性并将数据类型修改为 byte:


软件无线电安全之GNU Radio基础 -上


Random Source 和 Throttle 模块之间的红色箭头表示需要修复的数据类型错误。双击 Throttle 模块,我们将数据类型更改为 byte:


软件无线电安全之GNU Radio基础 -上


QT GUI Time Sink 没有 char 数据类型,我们选择float类型。GNU Radio 模块库附带了类型转换器下列出的各种数据类型转换器。搜索 Char To Float 模块,将其拖动到工作区中,然后将其连接到流程图中。


软件无线电安全之GNU Radio基础 -上


现在所有红色错误都消失了,按播放按钮启动流程图。QT GUI Time Sink 现在将显示来自随机源块的数据,该块随机化为 0 和 1:


软件无线电安全之GNU Radio基础 -上


其他


以上为gnuradio几个基础模块的使用方法,除了上面用到模块的使用,常见的其他模块使用效果如下:


信号波形生成器(Waveform Generators)

  1. 常数信源(Constant Source) – 生成固定幅度的常数信号。

  2. 噪声信源(Noise Source) – 生成各种类型的噪声信号,如高斯噪声。

  3. 信号源(Signal Source) – 生成各种信号类型,如正弦波、方波等。

调制器(Modulators)

  1. AM解调(AM Demod) – 解调幅度调制(AM)信号。

  2. 连续相位调制(Continuous Phase Modulation) – 进行连续相位调制。

  3. 相位偏移调制与解调(PSK Mod/Demod) – 进行相位偏移调制和解调。

  4. 高斯频移键控调制与解调(GFSK Mod/Demod) – 高斯频移键控调制和解调。

  5. 高斯最小频移键控调制与解调(GMSK Mod/Demod) – 高斯最小频移键控调制和解调。

  6. 正交振幅调制调制与解调(QAM Mod/Demod) – 进行正交振幅调制和解调。

  7. 宽带调频接收(WBFM Receive) – 宽带调频调制的接收端。

  8. 窄带调频接收(NBFM Receive) – 窄带调频调制的接收端。

界面(GUI)

  1. 星座图(Constellation Sink) – 可视化星座图。

  2. 频域图(Frequency Sink) – 显示信号频谱的频域图。

  3. 时域图(Time Sink) – 显示信号的时域波形图。

  4. 直方图(Histogram Sink) – 显示信号的直方图。

  5. 瀑布图(Waterfall Sink) – 显示频谱随时间变化的瀑布图。

数学运算(Math Operators)

  1. 绝对值(Abs)

  2. 相加(Add)

  3. 复数共轭(Complex Conjugate)

  4. 相除(Divide)

  5. 积分(Integrate)

  6. 取对数(Log10)

  7. 相乘(Multiply)

  8. 均方根(RMS)

  9. 相减(Subtract)

信道模型

  1. 衰落信道模型(Fading Model) – 模拟信号在信道中的衰落效应。

  2. 动态信道模型(Dynamic Channel Model) – 模拟动态变化的信道特性。

  3. 频率选择性衰落模型(Frequency Selective Fading Model) – 模拟频率选择性衰落的信道。

滤波器(Filters)

  1. 带通/带阻滤波器(Band Pass / Reject Filter)

  2. 低通/高通滤波器(Low / High Pass Filter)

  3. 无限冲激响应滤波器(IIR Filter)

  4. 均方根余弦滤波器(Root Raised Cosine Filter)

  5. 抽取有限冲激响应滤波器(Decimating FIR Filter)

傅里叶分析

  1. 快速傅里叶变换(FFT) – 执行快速傅里叶变换以分析信号的频谱。

  2. 克斯塔斯环(Costas Loop) – 一种相位同步技术,通常用于解调PSK调制的信号。


实验:制作一个FM receiver流程图


该实验我们使用osmocom_source 模块来接收FM信号,设置中心频率center_freq=97.9MHz,设置了一个滑块channel_freq,默认频率为97.9MHz。这里需要注意,channel_freq是收听广播的频率,center_freq是接收信号的中心频率。其中采样率设置为变量samp_rate=10MHz(采样率决定了接收信号的范围,以中心频率为中心左右各5MHz。),Ch0:Frequency (Hz)设置为变量center_freq=97.9MHz。用一个Signal Source产生一个频率为center_freq-channel_freq的余弦波来与osmocom Source模块的输出相乘,进行频谱搬移。流程图中低通滤波器(低通滤波器就是只允许频率低于截止频率的波通过的滤波器,高于截止频率的波会被直接消除)的截止频率设置为75kHz,过渡带宽为25kHz,Decimation抽取值为int(samp_rate/channel_width)=50,经过此模块后的采样率由10MHz变为了200kHz。使用Rational Resampler模块来继续调整采样率,以此来满足后续Audio Sink模块需要的48kHz做准备。经过Rational Resampler模块作用,采样率变化过程为200k*12/5=480kHz。使用WBFM接收模块来进行WBFM解调,其中Audio Decimation为10,表示将采样率480kHz要变为480k/10=48kHz,以此来适应Audio Sink所要求的48kHz。Quadrature Rate表示的是WBFM Receive模块所期望的输入采样率为480kHz。


软件无线电安全之GNU Radio基础 -上


点击运行后,即可收听97.9MHz频率的波段。这里虽然可以收听到FM电台,但是声音一样有断续,左下角控制终端一直输出aUaU…。经过查阅相关资料后发现是虚拟机音频欠载的原因,目前该问题未解决,切换至windows实体机则不会出现该问题。该流程图后续优化将frequency设置为滑块并设置初始和结束值,便可以很方便的修改收听频率。


软件无线电安全之GNU Radio基础 -上


总结


这一小节,我们简单使用了GNU Radio软件,我们通过GNU Radio Companion(GRC)创建了简单的流程图,展示了信号生成、处理和输出的流程。最后通过制作一个FM receiver来加深对GNU Radio的了解。


软件无线电安全之GNU Radio基础 -上

原文始发于微信公众号(蛇矛实验室):软件无线电安全之GNU Radio基础 -上

版权声明:admin 发表于 2024年2月23日 下午6:01。
转载请注明:软件无线电安全之GNU Radio基础 -上 | CTF导航

相关文章