请在法律允许范围内复现本文内容, 复现后果作者不予承担
硬件平台
- HackRFOne, 外部TCXO时钟模块, 40MHz-6GHz 拉杆天线
静态模拟
-
使用项目
- gps-sdr-sim-GPS信号仿真器
Clone 项目, 然后编译
bash
git clone https://github.com/osqzss/gps-sdr-sim
cd gps-sdr-sim
gcc gpssim.c -lm -O3 -o gps-sdr-sim
HackRFOne 配置
-
HackRFOne 安装好外部TCXO时钟模块
-
判断是否安装正确
shhackrf_debug --si5351c -n 0 -r
- 如果输出
[ 0] -> 0x01
- 如果输出
-
使用 gps-sdr-sim 生成二进制GPS数据
bash
./gps-sdr-sim -e [GPS 星历文件] -l [坐标] -b [二进制数据类型] -o [输出文件, 默认为gpssim.bin]
-
-e
GPS星历文件路径- 可以直接使用项目自带的星历, 也可以最新的广播星历
-
-l
经纬度坐标- 纬度, 经度, 高度
-
-b
二进制数据类型 -
比如
bashgps-sdr-sim -e brdc1660.25n -l 39.91232019878092,116.3910017124552,46 -b 8 -o gpssim.bin
-
然后就会生成一个
gpssim.bin
文件
使用 HackRFOne 发射 GPS 信号
bash
hackrf_transfer -t [GPS信号文件, 即gpssim.bin] -f [中心频率] -s [采样率] -a [是否开启功放] -x [发射功率] -R
-
-t
GPS信号文件- 使用之前生成的
gpssim.bin
文件
- 使用之前生成的
-
-f
中心频率, 单位 Hz- 指定频率为
1575420000
即民用GPS L1波段频率
- 指定频率为
-
-s
采样率, 单位 Hz, 4/8/10/12.5/16/20 MHz,默认 10 MHz -
-a
设置功放 ( 1 表示开启, 0 表示关闭) -
-x
指定发射功率, 开启天线增益- 指定TX VGA(IF)为0、10、20不等(为了限制影响范围, 最大为47, 尽量不要使用)
-
-R
重复发送模式(默认为关闭)- 不过值得注意的是, 虽然是重复发送, 但是只做不到连贯的, 结束一轮后会断开信号, 然后再重新发送
-
比如
bashhackrf_transfer -t gpssim.bin -f 1575420000 -s 2600000 -a 1 -x 20 -R
动态模拟
使用 Google Earth 绘制路径
注意
- Google Earth Pro 查看国内地图会存在火星偏移,即卫星图与显示地名、街道信息不对应, 应该以卫星图为准
- 绘制好路径后, 选择导出为 kml文件
- 这个时候, 文件中只有路径每个点的信息
kml文件 转为 NMEA文件
-
这里需要使用 SatGen, 把谷歌地图生成的 kml文件 导入进去, 然后再进行导出为 NMEA文件
-
这个是官网下载的较新版本, 不过一次只能导出120s的路径
-
这个版本可以不使用 Google Earth 直接在软件上面标记路径
- 不过要注意的是, Google Earth 的坐标与国内的坐标有稍微偏差, 可以选择Bing地图
-
-
-
-
修改 gps-sdr-sim-GPS 的修改动态模式时间上限并编译
bash
gcc gpssim.c -lm -O3 -o gps-sdr-sim -DUSER_MOTION_SIZE=3600
USER_MOTION_SIZE
单位是秒(s)
生成 GPS 信号模拟文件
bash
gps-sdr-sim -e [星历文件] -g [NMEA文件] -b 8
使用 HackRF 发射伪造 GPS 信号
bash
hackrf_transfer -t gpssim.bin -f 1575420000 -s 2600000 -a 1 -x 20 -R
- 参数跟静态的是一样的
实时动态伪造
使用项目
搭建实时发射平台
-
如果使用低版本, 直接使用上述项目中的
tcp.grc
就可以了 -
但是如果跟我一样使用较新的版本, 这需要把原本接收
IQ数据
的模块, 调换为新版的TCP Source
-
配置如图
-
-
整体上看是这样的, 挺简单的
搭建实时获取位置平台
-
在 gym487/gps-sdr-sim-realtime: Realtime gps-sdr-sim with TCP stream output that can connect to gnuradio or anything else... 中, 进入
mapper
文件夹 -
首先安装 python 依赖
bashpip install web.py
-
然后启动地图服务
bashpython mapper.py
-
然后就可以点击地图改变位置, 具体操作逻辑, 自己尝试一下就懂了
-
然后点击
Start
- 地图服务就会向
127.0.0.1:5678
发送坐标信息, 就是Start
上的信息
- 地图服务就会向
搭建 GPS-SDR-SIM
-
上面我们只是搭建了发射信号和获取位置的平台, 但是位置要转为发射的IQ数据, 这就需要
GPS-SDR-SIM
-
先编译
GPS-SDR-SIM
bashgcc gpssim.c -lm -O3 -o gps-sdr-sim -DUSER_MOTION_SIZE=3600
- 同样需要修改
USER_MOTION_SIZE
, 来增长模拟时间
- 同样需要修改
-
然后就是启动
GPS-SDR-SIM
bash./gps-sdr-sim -e brdc1660.25n -w 5678 -n 1234
-
-e
对应着 星历 -
-w
对应着 搭建实时获取位置平台 发送数据的端口 -
-n
对应着 GNURadio 监听IQ数据的端口
-
- 完事具备, 把三个服务都启动了, 就可以实时伪造GPS信号了, 不过欺骗还是需要等待 30s 左右, 而且延迟有 2-3s