Хакер - Как стать спутником. Спуфим GPS в 2023 году
hacker_frei
qeewqq
Содержание статьи
- Теория
- GNSS
- Частоты
- Триангуляция и трилатерация
- TTFF
- Практика
- Оборудование
- GPS-SDR-SIM
- iPhone
- На что обратить внимание
- Выводы
Каждый из нас пользуется спутниковой навигацией, чтобы добраться куда угодно за пределами своего двора. А что, если в один момент GPS перестанет быть таким надежным средством определения локации? В этой статье я покажу работающий способ обмануть эту систему.
WARNING
Не повторяй действия, описанные в статье, вблизи аэропортов и других объектов, которые сильно зависят от геопозиционирования! Работа в эфире требует специального разрешения и должна проводиться с соблюдением мер предосторожности. Статья публикуется исключительно в образовательных целях, и ни автор, ни редакция «Хакера» не несут ответственности за действия, совершенные с использованием этого материала.
ТЕОРИЯ
GNSS
Global Navigation Satellite System (GNSS) позволяет пользователям системы определить их местоположение. GNSS представляет собой сеть из разных спутниковых и наземных систем. Самые известные из них — американский GPS и российский ГЛОНАСС. Еще можно вспомнить Galileo (страны ЕС) и BeiDou (Китай), но они распространены куда меньше.
Для определения местоположения используются три основные группы устройств: космические, пользовательские и другие наземные (сегмент контроля).
Космические устройства — это, как ты догадываешься, спутники. У каждой системы — свои спутники, летающие на разных орбитах. Спутники транслируют данные на разных частотах и в разные промежутки времени, чтобы не мешать друг другу.
Наземные системы отвечают за синхронизацию времени, правильность информации на спутниках, корректируют орбиты и проверяют ключевые функции спутника — вдруг он сломается?
Пользовательский сегмент — это клиентские устройства, которые определяют свое местоположение с использованием GNSS. Самый простой пример — обычный приемник GNSS в твоем телефоне.
Чтобы определить местоположение, любое конечное устройство должно получить данные со спутника и как‑то их обработать. Процесс обработки сигналов и определения местоположения называется триангуляцией (хотя есть и другие методы).
Частоты
В зависимости от конкретной спутниковой системы GNSS использует разные частоты для передачи данных. Пробежимся по трем гигантам, их частотам и назначению этих частот.
GNSS работает на трех основных полосах: L1, L2 и L5. Все они появлялись последовательно, как улучшенные версии навигационной системы. Называется это все «L-диапазон», или диапазон дециметровых волн. Диапазон описывает частоты от 1 до 2 ГГц или от 1000 до 2000 МГц. На одной полосе может работать сразу несколько навигационных систем: к примеру, в полосе L1 работают одновременно GPS, ГЛОНАСС и Galileo.
L1 — самая старая полоса, которую используют почти все спутниковые навигационные системы. Поскольку она древняя, ее могут принять практически все приемники. Единственный минус — сигнал в этом диапазоне частот имеет низкую способность огибать препятствия и проходить сквозь них (стены зданий, листва деревьев или слишком густая облачность).
L2 появилась как замена L1. Сигнал в этой полосе лучше огибает препятствия, ловить его можно даже в труднодоступных местах. Эта полоса считается новой, так что обычно ее используют заодно с L1.
L5 — новейшая технология, используется в основном для нужд авиации, хотя гражданские приемники тоже иногда могут с ней работать.
Подробнее о полосах и частотах
GPS работает во всех трех диапазонах, в то время как альтернативные навигационные системы пока не заняли все доступные частоты. В L1 проживают GPS (1575,42 МГц), ГЛОНАСС (1602 МГц) и Galileo (1575,42 МГц). В L2 GPS работает на частоте 1227,6 МГц, а ГЛОНАСС — на 1246 МГц. В L5 есть Galileo (1207,14 МГц и 1176,45 МГц) и GPS (всего одна частота — 1176,45 МГц).
Частоты для гражданского и военного применения различаются, и в сегодняшней статье мы будем рассматривать только гражданские варианты. Кроме того, сигнал для военного использования куда более точный, но он зашифрован во избежание использования недружественными армиями.
Назначения полос могут меняться в зависимости от навигационной системы.

Частоты, отмеченные как ARNS, обычно используют в авиации, тогда как наземные приемники используют частоты RNSS.
Триангуляция и трилатерация
Спутник не может отправить тебе твое местоположение, потому что местоположение у каждого свое, а твое устройство ничего наружу не передает. То есть координаты нужно вычислять непосредственно на приемнике, а для этого сигнала одного спутника недостаточно, так что приходится ловить сразу несколько (обычно хотя бы три‑четыре). Все они отправляют тебе свои собственные координаты и время. Уже из этих данных по простым формулам можно определить местоположение. Для поиска координат используются два основных способа: триангуляция и трилатерация.
Триангуляция — это определение местоположения точки по трем ориентирам. Ориентирами в этом случае выступают спутники, но, так как космические аппараты летают на высоте около 20 тысяч километров, использовать такой метод весьма сложно из‑за необходимости очень точно знать расстояние до каждого из спутников. Чтобы облегчить процесс, используется трилатерация.
Трилатерация — это метод определения координат точки, который использует систему сфер.

Расстояние до спутников можно определить по времени прохождения сигнала от спутника до приемника, умноженному на скорость света, но для этого нужно знать точное время, в которое сигнал был отправлен.
Простой способ определить координаты
На практике, если у тебя есть, например, микроконтроллер, не нужно самостоятельно решать эту горку линейной алгебры, чтобы просто получить свои координаты. Все это с успехом делают дешевые GNSS-приемники, которые выплюнут тебе координаты и источник их получения (из какой именно спутниковой системы) в формате NMEA.

NMEA — это стандартизированный формат для передачи данных GNSS. То есть если ты захочешь сделать устройство, которое будет работать с GNSS, то нужно будет работать с форматом NMEA, а не искать документацию к формату каждой спутниковой системы.
Чтобы получить эти данные, можно подключиться к приемнику по USB или UART. У меня распаян только UART, так что я соорудил мост из Auduino и вышел на улицу, чтобы собрать данные.
Если использовать готовый приемник GNSS, то на его выходе можно увидеть примерно следующую картину:
$GPRMC,102668.00,A,2565.63860,N,05723.41802,E,44.621,122.82,301122,,,A*54
$GPVTG,122.82,T,,M,44.621,N,82.638,K,A*34
$GPGGA,102669.00,2995.64530,N,05723.40668,E,1,04,2.16,19.7,M,-26.4,M,,*48
$GPGSA,A,3,07,09,04,14,,,,,,,,,6.09,2.16,5.70*05
$GPGSV,2,1,05,04,43,108,34,07,53,338,35,09,73,051,37,14,33,217,28*7B
$GPGSV,2,2,05,16,04,038,*44
$GPGLL,2585.64930,N,05123.40668,E,102608.00,A,A*6E
$GPRMC,107129.00,A,2565.63860,N,05723.41802,E,47.084,123.07,301122,,,A*5C
Это сообщения в формате NMEA, то есть уже обработанные GNSS-приемником данные со спутника. Выглядит не совсем понятно, но на самом деле получить из этого наши координаты довольно просто.
Разберем для примера первое сообщение:
$GPRMC,102668.00,A,2565.63860,N,05723.41802,E,44.621,122.82,301122,,,A*54
Как ты уже заметил, каждое сообщение начинается со знака доллара, за которым следуют пять букв и запятая. Этот заголовок указывает тип данных в сообщении. Первые две буквы (в нашем случае GP) указывают на систему GNSS, из которой получена информация. Наше GP означает GPS. Ты можешь встретить и другие спутниковые системы — вот список возможных ответов:
- GP — только GPS;
- GL — только ГЛОНАСС;
- BD — только BeiDou;
- GA — только Galileo;
- GN — использовано одновременно несколько систем.
Следующие три буквы означают тип данных, например RMC (Recommended Minimum Specific GNSS Data) — минимальные рекомендуемые данные о местоположении и времени. Координаты содержатся в сообщениях RMC, GLL и GGA.
Опустим все поля, кроме координат (описание пропущенных полей можно почитать в документации NMEA). 2565.63860,N — это широта в формате DDMM.MMMMM, где N означает северное полушарие, а 05723.41802,E — это долгота в формате DDDMM.MMMMM, где E означает восточное полушарие. То есть координаты нашей тестовой точки — 25 градусов 65,63860 минуты северной широты и 57 градусов 23,41802 минуты восточной долготы.
Чтобы посмотреть эту точку на картах в интернете, нужно преобразовать GPS-координаты в десятичные градусы. Для этого можно воспользоваться онлайновым калькулятором.
TTFF
TTFF — time to first fix, или время для определения местоположения. Это время, которое нужно устройству, чтобы собрать данные и определить местоположение. Для спуфинга этот параметр очень важен.
Если устройство не имеет никаких данных о спутниках, процесс может занимать до двенадцати минут, но обычно требует всего две‑три минуты.
ПРАКТИКА
Гайдов по спуфингу GPS в сети хватает, но у них есть одна общая черта: в 2023 году они не работают (у меня так точно). Многие телефоны сейчас умеют определять местоположение не только по спутникам — для этого используются Wi-Fi и Bluetooth. Сотовые вышки тоже могут участвовать в процессе. Для начала мы попробуем подменить GPS на смартфоне с Android и посмотрим, какие трудности могут возникнуть при подмене.
Оборудование
В своем эксперименте я использую:
- bladeRF 2.0 Micro Xa4 в качестве передатчика;
- HackRF One в качестве приемника и передатчика;
- антенну RFSPACE;
- Mi A2.




GPS-SDR-SIM
GPS-SDR-SIM позволяет сгенерировать данные для любой локации или траектории. Для этого нужно скачать таблицу эфемерид (координат спутников для определенного времени) и указать локацию.
WWW
GPS-SDR-SIM — один из самых популярных и уж точно самый известный инструмент для подмены GPS-данных. На момент публикации репозиторий насчитывает уже больше 2000 звезд и регулярно обновляется.
Итак, сначала скачаем исходники и соберем программу:
git clone https://github.com/Nuand/gps-sdr-sim
cd gps-sdr-sim
gcc gpssim.c -lm -O3 -o gps-sdr-sim
Подключим bladeRF и сгенерируем файл:
./gps-sdr-sim -e hour3060.22n -l 21.296965,-157.815687,100 -b 16 -o gpssim.bin -t $(date -u +%Y/%m/%d,+%X)
WWW
Данные о спутниках можно скачать с сайта NASA. Тут предоставлены данные за каждый час, что позволит избежать ошибки со временем — она есть почти во всех гайдах, которые я смог найти.
Параметр -t отвечает за время, которое будут передавать «спутники». Этот параметр очень важен, так как новые телефоны не работают с данными, которые отстают по времени всего на два‑три часа.
Using static location mode.
Start time = 2022/11/02,07:21:33 (2234:285693)
Duration = 300.0 [sec]
02 180.0 25.6 22759545.5 6.5
06 54.7 20.9 23631267.8 5.3
11 90.0 38.3 22154769.5 4.3
12 355.4 46.2 21368898.6 4.0
13 163.0 4.3 25471171.1 10.3
15 186.1 19.4 24115672.2 7.7
19 38.7 3.5 25179568.2 5.6
20 119.8 1.4 25729982.2 7.7
24 102.8 78.9 20375053.9 3.1
25 312.8 32.9 22268020.3 5.5
29 231.8 37.9 22208289.9 5.3
32 306.8 14.9 24242464.5 8.5
Time into run = 300.0
Done!
Process time = 46.2 [sec]
Не стоит бояться ошибки Invalid Start Time: она значит, что NASA еще не обновило данные на сайте. Нужно немного подождать, скачать новый файл и повторить генерацию.
Когда файл будет готов, скачиваем на наше тестовое устройство приложение для мониторинга GPS под названием GPS Test, запускаем его и включаем передачу на компьютере:
lll@lll ~/s/gps-sdr-sim (master)> bladeRF-cli -i
bladeRF> set frequency 1575.42M
For best results, it is not recommended to set both RX and TX to the
same frequency. Instead, consider offsetting them by at least 1 MHz
and mixing digitally.
For the above reason, 'set frequency ' is deprecated and
scheduled for removal in future bladeRF-cli versions.
Please use 'set frequency rx' and 'set frequency tx' to configure
channels individually.
RX1 Frequency: 1575419998 Hz (Range: [70000000, 6000000000])
RX2 Frequency: 1575419998 Hz (Range: [70000000, 6000000000])
TX1 Frequency: 1575419998 Hz (Range: [47000000, 6000000000])
TX2 Frequency: 1575419998 Hz (Range: [47000000, 6000000000])
bladeRF> set samplerate 2.6M
Setting RX1 sample rate - req: 2600000 0/1Hz, actual: 2600000 0/1Hz
Setting RX2 sample rate - req: 2600000 0/1Hz, actual: 2600000 0/1Hz
Setting TX1 sample rate - req: 2600000 0/1Hz, actual: 2600000 0/1Hz
Setting TX2 sample rate - req: 2600000 0/1Hz, actual: 2600000 0/1Hz
bladeRF> set bandwidth 2.5M
RX1 Bandwidth: 2500000 Hz (Range: [200000, 56000000])
RX2 Bandwidth: 2500000 Hz (Range: [200000, 56000000])
TX1 Bandwidth: 2500000 Hz (Range: [200000, 56000000])
TX2 Bandwidth: 2500000 Hz (Range: [200000, 56000000])
bladeRF> set gain tx 56
Setting TX1 overall gain to 56 dB
Gain TX1 overall: 56 dB (Range: [-23.75, 66])
dsa: -90 dB (Range: [-89.75, 0])
bladeRF> tx config file=/home/lll/soft/gps-sdr-sim/gpssim.bin format=bin
bladeRF> tx start
bladeRF> tx wait
На экране смартфона отобразятся спутники с хорошим уровнем сигнала.

Тем не менее мы получили No Fix — статус системы, при котором она не может определить свое местоположение. Зеленые линии — это «спутники» (которые в нашем случае подделаны bladeRF). Видно, что система работает и спутники видит, но определять местоположение телефон отказывается. Иногда устройству нужно время, чтобы принять данные и использовать их (TTFF), так что для чистоты эксперимента я перезагрузил телефон и включил передачу на пять минут. Результата не последовало — телефон все так же игнорировал наши «липовые» спутники.
Так как мой файл с координатами был тоже просрочен, я немного отмотал время на телефоне назад и сдвинул локацию на один километр от моей реальной локации. Почему всего на километр? Судя по моим тестам, если резко сменить координаты на большое расстояние, телефон может отбрасывать такие данные как неправдоподобные, так что нужно менять поддельную локацию постепенно:
lll@lll ~/s/gps-sdr-sim (master)> ./gps-sdr-sim -e brdc2022_3060.22n -d 1000 -l 51.296965,124.815687,100 -b 16 -o gpssim.bin -t 2022/11/02,08:00:00
Using static location mode.
Start time = 2022/11/02,08:00:00 (2234:288000)
Duration = 1000.0 [sec]
02 174.0 43.6 21497540.2 3.6
05 140.4 4.3 25351515.3 6.8
06 41.5 11.5 24590008.1 4.2
11 66.9 36.4 22296887.8 3.3
12 20.6 45.8 21422074.0 3.1
15 176.8 7.9 25304780.7 8.2
18 198.6 4.3 25335825.2 10.3
20 104.6 6.7 25172344.8 4.8
22 314.6 4.6 25557500.2 8.9
24 146.6 63.7 20898055.3 2.7
25 332.2 40.0 21745559.7 3.7
29 253.1 49.9 21398805.8 3.4
32 290.3 19.4 23734754.8 6.5
Time into run = 1000.0
Done!
Process time = 142.4 [sec]
Снова запускаем передачу и смотрим результат.

Статус отображается как 3D Fix — локация определена! Время со «спутников» 12:00, что немного отстает от часов телефона, но в пределах нормы. Время жизни данных со спутников может составлять от тридцати минут до четырех часов, в зависимости от устройства. Реальное время смартфона (в верхнем левом углу) 12:34, а погрешность в тридцать четыре минуты считается нормой, в случаях, если недоступны другие спутники.
IPHONE
Та же ситуация и на iPhone, локация подменяется без особых проблем. Давай высадимся в Персидском заливе!

Готово! Это новый телефон, который никогда раньше не видел сигнала GPS, так что он довольно быстро подхватил фейковую локацию. Wi-Fi и подключение к сети сотовой связи не помогли телефону понять, что координаты — подделка.
НА ЧТО ОБРАТИТЬ ВНИМАНИЕ
Вот несколько простых правил, которых стоит придерживаться при спуфинге GPS:
- Следи за данными, которые берешь с сайта NASA, — они часто обновляются.
- Следи за временем, которое «спутники» отправляют на устройство: некоторые девайсы не работают со слишком устаревшими данными.
- Дай устройству время для «сохранения» фейковых спутников.
- Не меняй локацию сразу на далекую — такие неправдоподобные значения будут проигнорированы, а потом потребуется намного больше времени на обработку нормальных сигналов.
- Обрати внимание на Wi-Fi и сотовую связь: иногда они могут использоваться для определения локации, но на «чистых» устройствах даже они не помогут.
- Используй правильную антенну.
- Если используешь HackRF, проверь, есть ли у тебя внешний кварцевый резонатор, иначе время будет плавать.
Приведу еще несколько моих наблюдений и предположений:
- В разных частях Земли работают разные спутники, так что, если подменить только спутники, которые чаще всего встречаются в текущей локации, шанс на успех будет больше.
- Некоторые карты используют сторонние источники для определения локации. Данные с Apple Maps и Google Maps иногда отличаются. У Google локация была точнее.
- Очистка старых данных GPS поможет обмануть практически любое устройство.
- Шансы повышает установка максимально близкого к реальности времени (в данных с сайта NASA), и, если это не помогает, можно дать устройству несколько минут (до десяти‑пятнадцати), чтобы обработать новые данные. На новом устройстве это ожидание потребуется почти наверняка.
ВЫВОДЫ
Несмотря на то что производители устройств предпринимают разные шаги для того, чтобы предотвратить спуфинг, он при определенных условиях все же возможен. И чем больше на свете автономных устройств, тем большей проблемой это может стать. Одно дело — разыграть приятеля, «отправив» его телефон в Сенегал, другое — когда кто‑то заставит «Теслу» с автопилотом свернуть не туда.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei