本文介绍的GPS欺骗有三种方法:
方法A:利用https://github.com/osqzss/gps-sdr-sim的方法。
方法B:利用https://wiki.myriadrf.org/GPS_Simulation的方法。
方法C:利用https://github.com/osqzss/LimeGPS的方法。(经过测试,方法C是目前最可靠,成功率最高的方法,建议大家使用。)
无论是利用方法A、方法B还是方法C,核心工具都是用的gps-sdr-sim工具,只是具体操作方法稍有不同而已。
目录
本文内容、开发板及配件仅限用于学校或科研院所开展科研实验!
一、准备工作
二、gps-sdr-sim下载、编译
三、GPS欺骗方法A
四、GPS欺骗方法B
五、GPS欺骗方法C
1、Ubuntu系统下使用LimeSDR的环境搭建
#这是安装LimeSuite组件,Soapy API和LimeSDR的所有驱动的程序,没有安装过的朋友先安装
sudo add-apt-repository -y ppa:myriadrf/drivers
sudo apt-get update
sudo apt-get install limesuite liblimesuite-dev limesuite-udev limesuite-images
sudo apt-get install soapysdr soapysdr-module-lms7
安装好后,开始下一步的操作(下载gps-sdr-sim代码)
git clone https://github.com/osqzss/gps-sdr-sim
cd gps-sdr-sim
#接下来对你下载好的文件进行gcc编译(前提是你的Ubuntu系统已经安装了gcc)
gcc gpssim.c -lm -O3 -o gps-sdr-sim
到这前期准备工作就好了,下面我们来看编译好的文件中的各类指令
Usage: gps-sdr-sim [options] #
Options:
-e RINEX navigation file for GPS ephemerides (required)
-u User motion file (dynamic mode)
-g NMEA GGA stream (dynamic mode)
-c ECEF X,Y,Z in meters (static mode) e.g. 3967283.15,1022538.18,4872414.48
-l Lat,Lon,Hgt (static mode) e.g. 30.286502,120.032669,100
-t Scenario start time YYYY/MM/DD,hh:mm:ss
-T Overwrite TOC and TOE to scenario start time
-d Duration [sec] (dynamic mode max: 300 static mode max: 86400)
-o
#这是中文的对照
用法:gps-sdr-sim [选项]
选项:
-e 用于GPS星历表的RINEX导航文件(必填)
-u 用户动作文件(动态模式)
-g 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 I / Q数据格式[1/8/16](默认值:16)
-i禁用航天器场景的电离层延迟
-v显示有关模拟频道的详细信息
利用https://github.com/osqzss/gps-sdr-sim的方法。
使用gps-sdr-sim指令时,可以生成动态与静态的文件,例如
gps-sdr-sim -e brdc3540.14n -u circle.csv #静态模式
gps-sdr-sim -e brdc3540.14n -g triumphv3.txt #静态模式
gps-sdr-sim -e brdc3540.14n -l 30.286502,120.032669,100 #动态模式
在指令前一定要加./,例如
./gps-sdr-sim -e brdc3540.14n -l 30.286502,120.032669,100 #生成北纬30,东经120,高度100m的星历
在上述命令中,brdc3540.14n是星历文件,其中,该文件的命名格式为:
如果你想下载任意的或者最新的星历文件,请在https://cddis.nasa.gov/Data_and_Derived_Products/GNSS/broadcast_ephemeris_data.html
如果你想下载2020年的,可以从以下网页下载。
ftp://cddis.nasa.gov/gnss/data/daily/2020/brdc/
-l后边的参数 30.286502,120.032669,是你想伪造的GPS坐标点,100是海拔高度,这个信息,可以在网站 http://www.gpsspg.com/maps.htm,上查询一个你感兴趣的地方的 GPS 经纬度信息,鼠标点击后,从界面上复制坐标点数据。
等待./gps-sdr-sim -e brdc3540.14n -l 30.286502,120.032669,100执行完之后,你会发现文件中多了一个gpssim.bin的文件,将它重命名为circle.1b.1M.bin
下一步,也是至关重要的一步,我前面尝试时会报错,报错的类型是无法找到文件或目录经过探索,发现这个指令中的limeplayer可执行程序未生成,所以执行以下步骤
cd player
gcc -O2 -Wall -o limeplayer limeplayer.c -lLimeSuite
执行完后会发现文件夹中多了一个limeplayer的可执行程序
接着执行最后一条指令,开始利用LimeSDR-USB(称“Lime大板子”)或者LimeSDR Mini(称“Mini”)来发射伪造的GPS数据,注意一定记得加./
./limeplayer -s 1000000 -b 1 -d 2047 -g 0.1 < ../circle.1b.1M.bin
此时,终端上应该显示LimeSDR的信息,并出现一系列数据流,开始发送信息。
但是,该实验不一定能够每次成功,与多种因素有关,例如不同的实验环境,不同的手机型号(有的手机可以每次都成功,但是有的手机就是无法成功)。
利用https://wiki.myriadrf.org/GPS_Simulation的方法。
相关背景知识和内容,请查看https://wiki.myriadrf.org/GPS_Simulation。
执行以下命令生成GPS数据文件gpssim.s8。注意其中-s后边是采样率,这里是10000000,即10MHz,后边用GRC程序来发射数据的时候,GRC中模块中的采样率要与这个采样率一致。
在grc程序中需要设置的参数有发射模块采样率(sample_rate)、及发射频率(Freq).
发射模块采样率(sample_rate)需要与生成gpssim.s8文件的采样率一致,采样率如果与发射频率(Freq)不匹配,一般情况是采样率过低,则会出现如下错误:
发射频率(Freq)在实验中设置为1.57542GHz。
./gps-sdr-sim -e brdc3540.14n -l 30.286502,120.032669,100 -s 10000000 -b 8 -o gpssim.s8
生成了gpssim.s8文件之后(s8文件后缀,这是专门用于LimeSDR的文件格式),利用GRC程序来发射该文件数据。
发射数据大概2-3分钟之后,观察你手机中的百度地图、或高德地图,或者安卓手机下的GPS Test APP。看看是否你的地理位置发生了变化。
为了提高GPS欺骗的成功率,存在以下两个小技巧:
(1)手机跟天线平行,距离大概三十公分。
(2)手机开飞行模式,由于现在采用的定位方式不仅仅是gps,还采用了很多辅助技术以及信号的甄别机制,所以最好把手机调整到飞行模式。(我记得2016年的时候用HackRF One玩GPS的时候,无论是3G、WiFi或者飞行模式下,都是很容易成功的。)
利用https://github.com/osqzss/LimeGPS的方法。
下载LimeGPS代码并编译。
$ git clone https://github.com/osqzss/LimeGPS
$ cd LimeGPS
$ make
选定你要伪造的GPS位置,并用LimeSDR-USB或LimeSDR Mini来发射数据。
./LimeGPS -e brdc0350.18n -l 30.286502,120.032669,100
发射数据大概2-3分钟之后,观察你手机中的百度地图、或高德地图,或者安卓手机下的GPS Test APP。看看是否你的地理位置发生了变化。