0x00 序言
本文作者 Nack'BT ,未经允许,严禁转载
SDR技术交流加我qq 3505932208
估计点击来的同学都看过使用hackrf制作超级跑马机,文章写得很好,我就想拿USRP弄一个,找了一下一共就2两篇关于USRP做GPS欺骗的博客,而且都没有使用外部时钟导致可以发现星座但是无法成功欺骗的问题,其次只是静态坐标欺骗,可能是因为找不到KML转NMEA的SatGen工具,作者花了120大洋从一个做跑马机的那里买来了老版SatGen(新版限制太多),所以麻烦各位同学看完点个赞吧,拒绝白嫖。
0x01 软&硬件资源
软件
- ubuntu(笔者在ubuntu18和16上均实验成功)
- UHD & Gnuradio
- GPS-sdr-sim
- 谷歌地球
- SatGen
硬件
- USRP B210(其他大牛在n210 x310均实验成功)
- 10Mhz 0.01ppm OCXO时钟(只要兼容USRP即可)
- SAM-J 转 SAM-J 转接线
- GPS增强蘑菇头天线或者支持1.5Ghz鞭状天线
- 2.5w全频功放(可选)
注意:不能用GPS DO驯服时钟(为什么自己想)
0x02 搭建环境
1.安装 UHD & Gnuradio
从源安装(推荐)参见我的另外一篇博客:
https://blog.csdn.net/qq_42652838/article/details/98198534
源码编译(不推荐)参见大佬优秀文章:
https://blog.csdn.net/jipengwang/article/details/79451729
2.编译GPS-sdr-sim
克隆->进入目录->编译
git clone https://github.com/osqzss/gps-sdr-sim.git
cd /gps-sdr-sim
gcc gpssim.c -lm -O3 -o gps-sdr-sim
查看指令集
./gps-sdr-sim -h
Usage: gps-sdr-sim [options]
Options:
-e <gps_nav> RINEX navigation file for GPS ephemerides (required)
-u <user_motion> User motion file (dynamic mode)
-g <nmea_gga> NMEA GGA stream (dynamic mode)
-c <location> ECEF X,Y,Z in meters (static mode) e.g. 3967283.154,1022538.181,4872414.484
-l <location> Lat,Lon,Hgt (static mode) e.g. 35.681298,139.766247,10.0
-t <date,time> Scenario start time YYYY/MM/DD,hh:mm:ss
-T <date,time> Overwrite TOC and TOE to scenario start time
-d <duration> Duration [sec] (dynamic mode max: 300, static mode max: 86400)
-o <output> I/Q sampling data file (default: gpssim.bin)
-s <frequency> Sampling frequency [Hz] (default: 2600000)
-b <iq_bits> I/Q data format [1/8/16] (default: 16)
-i Disable ionospheric delay for spacecraft scenario
-v Show details about simulated channels
下面是中文对照
用法:gps-sdr-sim [选项]
选项:
-e <gps_nav>用于GPS星历表的RINEX导航文件(必填)
-u <user_motion>用户动作文件(动态模式)
-g <nmea_gga> NMEA GGA流(动态模式)
-c <位置> ECEF X,Y,Z,以米为单位(静态模式),例如3967283.15,1022538.18,4872414.48
-l <位置> Lat,Lon,Hgt(静态模式),例如30.286502,120.032669,100
-t <日期,时间>场景开始时间YYYY / MM / DD,hh:mm:ss
-T <日期,时间>将TOC和TOE覆盖到方案开始时间
-d <欺骗时间>持续时间[秒](动态模式最大值:300静态模式最大值:86400)
-o <输出> I / Q采样数据文件(默认值:gpssim.bin;使用 - 用于stdout)
-s <频率>采样频率[Hz](默认值:2600000)
-b <iq_bits> I / Q数据格式[1/8/16](默认值:16)
-i禁用航天器场景的电离层延迟
-v显示有关模拟频道的详细信息
0x03 劫持实战
首先如图连接设备(笔者使用国产USRP ,如果是山黑的可以直接把时钟插在板子上)
1.生成静态GPS星历报文
命令格式:
另外两篇博客写bit不能设置为16,否则欺骗会不成功,但是笔者8/16bit均实验成功
./gps-sdr-sim -e <导航报文> -l <坐标> -s <采样率>
#使用-b指定bit位数(16/8/1)
举个栗子:
生成坐标为 30.286502,120.032669,100的星历报文
(USRP使用10Mhz时钟采样率必须可以整除,所以设置为 2500000)
gps-sdr-sim -e brdc3540.14n -l 30.286502,120.032669,100 -s 2500000
2.生成动态GPS星历动态报文
首先使用谷歌地图画出要伪造的轨迹
保存格式一定要选择KML
然后使用SatGen将KML文件转为NMEA轨迹文件(后缀是txt)
然后会生成一个nmea轨迹文件,用这个生成GPS报文
./gps-sdr-sim -e brdc3540.14n -g nmea.txt -s 2500000
3.USRP发射GPS报文
另外两篇文章最大的问题就是没有使用外部时钟,所以不成功,刚开始我以为USRP跟hackrf一样直接把时钟接上去就行,后来经大佬指点,一语惊醒梦中人,gps-sdr-sim-uhd.py加-c才能选择时钟 我tm。。。
./gps-sdr-sim-uhd.py -t gpssim.bin -s 2500000 -c external -x 40
# external 外部时钟
# internal 内部时钟
如果一切正常的话,TX/RX的指示灯会亮起来
效果如图
以100km/h速度在护城河中游泳(逃
打字不易,还请各位看官老爷点个赞
如果实在找不到SatGen加我QQ 3505932208(学业繁忙,不定期看qq)