Support us and view this ad

可选:点击以支持我们的网站

免费文章

本文章主要介绍是用ZYNQ7020+AD9361+Gnu radio是搭建一个蓝牙抓包器的文章。用SDR(Software Defined Radio)设备研究了下BLE的抓包,通过BLE的抓包了解下蓝牙的controller的一点点内容,日拱一卒,拱了2个周终于可以抓到蓝牙37通道的广播数据,并且可以把数据传送到Wireshark中。 本文章主要介绍是用ZYNQ7020+AD9361+Gnu radio是搭建一个蓝牙抓包器的文章。 由于之前一直做蓝牙Host,对controller觉得是一个比较虚无缥缈的东西,得不到的总是在骚动,所以最近用我用吃灰了2年的SDR(Software Defined Radio)设备研究了下BLE的抓包,通过BLE的抓包了解下蓝牙的controller的一点点内容,日拱一卒,拱了2个周终于可以抓到蓝牙37通道的广播数据,并且可以把数据传送到Wireshark中。整份工程是C语言+gnu radio来完成,没有借用python等。为什么选用C语言而不用python呢,因为我是想着做完这个找到灵感,是不是可以直接用SDR做蓝牙芯片了(哈哈,愿景哈) 代码连接:https://github.com/sj15712795029/bt_sdr_air_sniffer 欢迎有大牛一起来实现这个伟大的愿景!!! 一. 硬件环境     我是用的SDR设备就是ZYNQ7020 + AD9361 其中 Zynq-7020 是赛灵思(Xilinx)推出的一款高度集成的片上系统(SoC),结合了可编程逻辑 (FPGA) 和基于 ARM Cortex-A9 的双核处理器。这个系统具有强大的灵活性和高性能,适用于广泛的应用领域。Zynq-7020 内部包括了85K可编程逻辑单元,560个DSP slices,220个I/O pins,以及多个高速接口如USB、Gigabit Ethernet 和SDIO。它还集成了多个硬件加速器,能够处理复杂的计算任务。Zynq-7020 提供了广泛的软件支持,包括Linux、FreeRTOS 等操作系统,并配有丰富的开发工具,如Vivado和SDK,帮助开发者快速进行硬件设计和软件开发。该芯片特别适合于嵌入式系统、工业自动化、通信、视频处理和医疗设备等需要高计算能力和实时处理的领域,通过其高效的硬件加速和灵活的配置选项,为用户提供了高度优化的解决方案。   其中AD9361 是美国模拟器件公司(Analog Devices, Inc.)推出的一款高性能、可编程的射频收发器,广泛应用于无线通信系统。以下是对 AD9361 的详细介绍: AD9361 是一款集成的射频收发器,覆盖从 70 MHz 到 6.0 GHz 的频率范围,支持宽带调制解调功能。它具有双通道,支持从 200 kHz 到 56 MHz 的信号带宽,能够适应各种无线通信标准,如 LTE、BT、WiFi、WiMAX 和公共安全通信等。 主要特点包括: 双通道设计:支持多输入多输出 (MIMO) 配置,增强了数据传输的可靠性和效率。 高集成度:将发射器、接收器、PLL、混频器、ADC、DAC 和滤波器集成在一个芯片内,简化了系统设计,减小了物理尺寸。 宽频带:覆盖 70 MHz 到 6.0 GHz 的宽频范围,适用于多种应用。 可编程性:通过 SPI 接口进行控制和配置,支持动态调整频率和带宽。 高线性度和低噪声:提供优异的接收灵敏度和发射质量,确保通信系统的性能和稳定性。 低功耗:在提供高性能的同时,保持较低的功耗,适合于电池供电的便携设备。 AD9361 常用于软件定义无线电 (SDR) 平台、蜂窝基站、微波中继、军事通信和测试测量设备中。其灵活性和高性能使其成为开发多种无线通信系统的理想选择。通过结合高集成度和广泛的频率覆盖,AD9361 有效简化了设计流程,缩短了产品上市时间,同时提供了卓越的系统性能。 1. 抓包短期架构   这个架构主要有几点工作: 1)使用PC GNU radio来控制ad9361做特定频率,特定带宽的射频收发,以及GFSK的解调 2)使用PC GNU radio把GFSK解调( Demodulation )后的数据通过ZMQ发送到C语言程序 备注:中间可能不仅仅是蓝牙数据,可能有其他垃圾数据或者其他无线技术的数据,这点需要在C语言中做解析,剔除掉不是蓝牙的数据 3)C语言程序收到GFSK解调( Demodulation )后的数据就行解析(寻找前导码/读取Access code/读取PDU header/读取PDU payload/读取CRC/去白PDU跟CRC/CRC校验等步骤) 4)做完第三步后通过pcap的format格式把数据发送给wireshark 2. 抓包长期架构   1)使用ZYNQ 7020 ARM Core驱动AD9361进行特定频率收数据,使用ZYNQ 7020 FPGA core进行GFSK的解调(Demodulation)/寻找前导码/读取Access code/读取PDU header/读取PDU payload/读取CRC/去白PDU跟CRC/CRC校验等步骤 2)把得到的数据通过ethernet参照pcap格式发送给wireshark 二 . 使用 目前我做的过程使用起来比较简单: 1)设置ZYNQ7020跟PC在同一个网段,要保证能ping通 ifconfig eth0 10.88.110.66   备注:目前我在GNU Radio中的PlutoSDR Source的URI写死的是10.88.110.66,所以你想用这个工程,需要修改grc文件 2)启动gnuradio-companion gnuradio-companion 需要注意的是我安装的gnu radio的版本是3.8.5   至于怎样安装gnu radio以及libiio libiio-ad9361自行百度,我就不具体介绍了,这些算基本的环节 3)点击运行ble_sniffer_no_gui.grc   4)在ubuntu创建跟wireshark通信的fifo mkfifo /tmp/fifo1 备注:当然你也可以选择用其他通信手段跟wireshark通信,或者保存文件的形式 5)wireshark开启抓包 wireshark -S -k -i /tmp/fifo1 6)开启蓝牙抓包C语言程序 ./bt_start_sniffer -o /tmp/fifo1 备注:一定要先启动wireshark 当你完成以上几步,就可以实现抓包啦 可以看到C语言程序在解析Link layer的数据   wireshark在实时解析蓝牙数据封包     局限性:当前只能抓取BLE的广播通道的数据封包,并且只能抓取Channel 37通道的数据 我有几个疑惑大家也可以给我解惑下: 1)虽然AD9361可以支持40M带宽,但是这也不能抓蓝牙全频段,所以理论上要2个AD9361来实时抓取蓝牙全信道封包,你可能会说:可以写个跳频算法啊,跟着跳频就行了,但是我还想做BR/EDR的sniffer,那个在开始之前你并不知道在哪个channel上去连接,所以你无法提前预知跟着跳频,所以你要全频道抓取(80M带宽) 2)如果是全频段抓取80M带宽(用两个AD9361),但是我怎么知道某一时间抓取的数据他是在哪个频段上呢?我自己的想法是40M带宽,我用100M sample rate去采样,比如50M时候收到的数据,那么是就认定他是20M带宽处的数据,也就是2420M的频率,不知道这种想法是否准确,哪怕准确,我觉得运算量也很大,所以我觉得这一定不是最优解! 三.GNU radio的剖析 在开始介绍GNU radio的各个组件之前,我们先来看下我做的ble sniffer的整个grc文件   下面我们就来一个介绍! 1. plutosdr souce设置 plutosdr soruce是antsdr的射频接收的组件!也就是收到的无线电数据首先会经过这里处理   蓝牙的广播通道是37、38、39     蓝牙低功耗(Bluetooth Low Energy, BLE)的信道37的频率中心点是2402 MHz。由于每个信道的带宽是2 MHz,因此信道37的频率范围可以计算如下: 中心频率:2402 MHz 信道带宽:2 MHz 因此,信道37的频率范围可以表示为中心频率的±1 MHz: 下限频率:2402 MHz - 1 MHz = 2401 MHz 上限频率:2402 MHz + 1 MHz = 2403 MHz 所以,信道37的频率范围是 2401 MHz 到 2403 MHz。 这个是antsdr的射频接收部分配置,如下:   IIO context URI:Antsdr的ip地址, 这个是开发板的ip地址,通过libiio通信 LO Frequency: 如果想抓BLE 37通道的广播,中心频点是2.402g,这里我们虽然写的ble_channel是0,但是对于ble channel其实就是advertising channel 37   sample rate: 采样率为10M RF bandwidth:2M RX Gain: -90 2. Simple Squelch 在 GNU Radio 中,Simple Squelch 是一个用于信号门限控制的模块。它的主要作用是通过设置一个阈值来控制信号的通过或抑制,当输入信号的幅度低于设定的阈值时,输出将被强制为零,从而消除低于此阈值的噪声和不需要的信号。   3. Frequency Xlating FIR Filter 在 GNU Radio 中,Frequency Xlating FIR Filter(频率平移 FIR 滤波器)是一个功能强大的模块,用于对输入信号进行频率平移(变频)和滤波。这个模块结合了频率转换和有限脉冲响应(FIR)滤波的功能,是信号处理中的一个重要工具。 4. GFSK demod 在 GNU Radio 中,GFSK(Gaussian Frequency Shift Keying)解调器是用于解调通过 GFSK 调制的信号的模块。GFSK 是一种常用的频率调制技术,尤其在低功耗和短距离无线通信中,如蓝牙和一些工业、科学和医疗(ISM)频段应用。   5. unpakced to packed 在GNU Radio中,“Unpacked to Packed”模块用于将解包的比特流转换为打包的字节流。这对于处理比特级数据(如BPSK调制解调器输出)非常有用,可以将数据压缩成字节形式以便后续处理或传输。...

继续阅读完整内容

支持我们的网站,请点击查看下方广告

正在加载广告...

登陆