статья про перехват радиосигналов


Предыдущая |

Интересная статья про перехват радиосигналов: https://habr.com/ru/post/578670/

Достаточное железо: USB DVB-тюнер на чипе RTL2832U (радиочастотная и цифровая часть), RTL-SDR-свисток на старом тюнере Elonics E4000 (аналоговая часть), старый компьютер и обычная телевизионная антенна :)

Использемое ПО из статьи: 
- SDR# (SDRSharp) (https://airspy.com/download/) известная программа для работы приемника RTL-SDR.
- Zadig (https://zadig.akeo.ie/) - это приложение для Windows, которое устанавливает общие драйверы USB.
- DSDPlus (https://www.dsdplus.com/dsdplus-1-101-released/) - программа, предназначенная для декодирования цифровых форматов передачи данных.
- VB-CABLE Virtual Audio Device (https://vb-audio.com/Cable/) - Программа, позволяющая передавать аудиопотоки между различными приложениями и устройствами.
- Плагин DSD Interface (http://rtl-sdr.ru/page/plagin-dsd-interface) - добавление к SDR# дополнительного аудиовыхода для подключения через виртуальный аудио кабель программ декодирования цифровых видов связи (DSDPlus).
- Плагин менеджер частот из комплекта SDRSharp со сканером (http://rtl-sdr.ru/page/menedzher-chastot-iz-komplekta-sdrsharp-so-skanerom) - позволяет проверить наличие передачи на интересующих вас частотах.
- Плагин сканер + поиск новых частот (http://rtl-sdr.ru/page/skaner-poisk-novyh-chastot) - наблюдает за широким спектром, и как только на какой-то из частот появляется сигнал выше определенного уровня на определенное время, он переключается на эту частоту, и заодно ведет статистику времени передачи по разным частотам.
- srt2cue (https://github.com/uprt/srt2cue) утилита, которая конвертит .srt-файлы от DSDPlus в обычные CUE Sheets, группируя записи по длине пауз между ними.
-  UniTrunker (http://www.unitrunker.com/) - софт для работы транкинговой цифровой связью.
- Плагин для UniTrunker (https://github.com/walczakp/serial-controller) - позволяет передать SDR# данные о частоте, на которую необходимо перенастроиться.
-------------------
Друзья, чтите уголовный кодекс. Данный материал представлен сугубо в ознакомительных целях на собственный страх и риск.

Давным-давно, в далекой-далекой заднице мира...

Шел апрель 2020 года, ковидная пандемия набирала обороты. Мы с женой, пользуясь тем, что оба стали работать целиком и полностью удаленно, временно улетели из Санкт-Петербурга в свой родной город, чтобы быть рядом с родителями, которым была нужна помощь в эти непростые времена. Местные власти объявили "карантин", и от скуки сидения дома в один из дней мне пришла в голову мысль разобрать завалы хлама в старой квартире. В одной из коробок мне попался ноунеймовый USB DVB-тюнер на чипе RTL2832U с Алиэкспресса, который я когда-то давно заказал за 10$, и тут я призадумался. Вспомнилось, что много-много лет назад я игрался с ним, и в эфире можно было услышать много интересного. "А почему бы не поиграться еще раз?" — возникла в голове мысль, которая и положила начало этой истории.

 

Железо

В качестве станции наблюдения был использован старенький ноутбук Lenovo G430, который нашелся в том же шкафу и старенький монитор ViewSonic оттуда же (на самом деле, я не перестаю удивляться, что же только можно найти в этом самом шкафу, но это уже отдельная история). Жесткий диск у машинки сдох окончательно и бесповоротно, поэтому в качестве системного носителя была использована обычная USB-флешка на 32 гигабайта, с которой его родная Windows 8.1 работала вполне себе сносно.

В качестве антенны была использована обычная телевизионная антенна, тут все банально. С одной стороны, не самая лучшая штука по тактико-техническим характеристикам и чувствительности, с другой стороны — покупается за 200 рублей в любом магазине электроники или находится бесплатно в том же шкафу, а частотный диапазон у таких антенн довольно широкий, от 80 до 800 МГц, что уже дает определенный простор для экспериментов.

Антенна и RTL-SDR-свисток с алиэкспресса
Антенна и RTL-SDR-свисток с алиэкспресса

"Круглая часть" антенны (на фото), предназначенная, по логике, для дециметровых волн, как выяснилось после разборки антенны, была на деле чисто декоративной — к ней не было припаяно вообще никакого провода. Зато "усы" действительно работали, в том числе в дециметровом диапазоне, и регулирование их на размер, равный половине рассчитанной длины волны давало еще немного децибел в нужном диапазоне на анализаторе спектра.

RTL-SDR-свисток у меня был на старом тюнере Elonics E4000, что тоже внесло небольшой отпечаток на происходящее, но об этом позже.

Софт и начало работы

В качестве SDR-тулы был выбран SDR# (сейчас у них появилась версия для .Net Core, не знаю, совместима ли она со старыми плагинами, но ссылка на версию для .Net 4.x там тоже есть). Началось все с установки софта и базовой настройки и проверки. Установка драйверов для свистка делалась по стандартной инструкции с помощью прилагаемой утилитки Zadig и никаких проблем не вызвала.

 

Проверка работоспособности свистка (многие люди говорят, что эти свистки легко умирают из-за статических разрядов со стороны антенны) свелась к простому: что у нас вещает всегда, на известных частотах, и с хорошим уровнем сигнала? FM-радиостанции! Поэтому накрутив шкалу на нужный диапазон, я ткнул в самый сильный сигнал на спектрометре, и в течение полуминуты пришлось слушать, как какой-то мужик с хриплым голосом пел трагичную историю про некоего социально безответственного типа, которому "светила звезда Магадана". Убедившись, что все работает как надо, я отправился исследовать радиоэфир родного города.

В авиадиапазоне не нашлось ничего интересного, то ли потому что я был далековато от аэропорта, то ли просто самолетов в этот момент мимо не пролетало (глянуть на Flightradar24 я как-то не догадался). Послушав немного охранников торгового центра неподалеку, я отправился рыскать по эфиру дальше. И вот, в одном частотном диапазоне, я услышал что-то похожее на звук модема, однако характер передачи (короткими отрезками по 3-10 секунд с длинными паузами) говорил о том, что это, скорее всего, голосовая связь, только с цифровым кодированием. А значит, нужно попробовать ее декодировать, чем мы и займемся.

 

Декодируем

Для декодирования цифровых форматов передачи существует программа DSDPlus. Существует она в разных инкарнациях: публичная версия 1.101, которая была выпущена в 2015 году и с тех пор не обновлялась, а ее более новые версии распространяются только среди владельцев платной подписки (10 долларов в год, 25 долларов навсегда), хотя одну из относительно свежих версий можно спокойной скачать из раздела загрузок с известного сайта радиолюбителей, правда, вопрос моральной и юридической стороны такого дела остается открытым.

DSDPlus может интегрироваться с SDR# двумя способами.

Первый способ классический: в Windows устанавливается так называемый Virtual Audio Cable, регистрирующий в системе дополнительное мультимедийное устройство для записи и воспроизведения звука и создающий "бридж" между ними. SDR# выводит звук радиоэфира на VAC, а DSDPlus с другой стороны VAC слушает звук и декодирует его.
Я тестировал два вида VAC-софта, первый c https://vb-audio.com/Cable/ и второй c https://vac.muzychenko.net/, оба работают вообще без проблем.

Второй способ: обходимся без велосипедов, SDR# будет лить поток сразу в DSDPlus на localhost через TCP.

Так вот... Публичная версия 1.101 вполне себе хорошо работает с TCP, в более новых версиях протокол поменялся, и автор DSDPlus не поделился его описанием с разработчиком SDR#-плагина, поэтому если вы используете более новую версию DSDPlus, то это получится делать только через виртуальный аудиокабель. А жаль.

Итак, если мы используем DSDPlus через аудиоустройство, то будет удобно использовать DSD Interface плагин для SDR# (инструкция есть тут). Если мы работаем через TCP, то плагин уже точно необходим, и называется он DSDTcp.
Устанавливаются плагины киданием их в папку SDR# и прописыванием DLL'ки в файл Plugins.xml. Сам DSDPlus должен лежать тоже где-нибудь неподалеку.

Плагин предоставляет интерфейс конфигурирования DSDPlus, который выглядит примерно так:

 

Первым делом задается путь до экзешника DSDPlus. Если вы работаете через виртуальный кабель, то задаются индексы (порядковые номера) аудиоустройств для входа и выхода. Вы их, скорее всего, не знаете, поэтому достаточно просто запустить DSDPlus вручную и посмотреть, что он пишет в консоль — там будет список системных аудиоустройств с их номерами, это поможет задать правильные настройки:

 

Там же есть настройки записи файлов (и с этим связан один странный баг, но об этом позже). На второй вкладке можно оставить все по умолчанию, ведь мы пока еще не знаем, какого именно типа радиосигнал мы будем слушать:

 

Не забываем обязательно нажать на "Create command line", иначе ничего не сохранится. Если DSDPlus при старте ругается на нераспознанные аргументы командной строки, то просто удаляем их. Мне помогло, ничего не сломалось :)

После этого запускаем DSDPlus кнопкой из плагина, и если все сделано правильно, то как только начнется передача и SDR# начнет принимать радиосигнал, в окошке DSDPlus побегут логи, а из колонок мы услышим декодированный звук:

 

Казалось бы, хэппи энд? Нет, не совсем. Очень скоро я заметил, что переговоры "прыгали" по частотам. Несколько секунд на одной частоте, спустя пол минуты следущий сеанс связи — на другой, и так далее, и таких частот набирался чуть ли не десяток. Знающие люди, наверное, прочитав это, поняли, в чем дело, но я в тот момент понял, что мне нужен сканер частот.

Сканируем

И такой плагин для SDR# был. Точнее, есть два плагина. Первый — менеджер частот со сканером: вы забиваете интересующие вас частоты в список, и он поочередно перебирает их, проверяя, ведется ли передача на какой-либо. Второй — именно сканер с поиском частот, он наблюдает за широким спектром, и как только на какой-то из частот появляется сигнал выше определенного уровня на определенное время, он переключается на эту частоту, и заодно ведет статистику времени передачи по разным частотам. Именно им я и воспользовался. Ширина полосы моего RTL-SDR позволила мне встать как раз "в середину" нужного диапазона, чтобы была возможность охватить все интересующие частоты без перестройки тюнера.

Выглядит интерфейс сканера примерно так:

 

Кнопками вверх-вниз можно установить уровень срабатывания сканера — если сигнал на какой-то частоте выше этого уровня, сканер встанет на эту частоту. Всё что ниже заданного уровня считается шумом. Двойным кликом мыши по полоске частоты можно также занести ее в список игнорируемых.

Сканер имеет дополнительное окошко настроек, можно задать, например, автопропуск каналов где активность длится слишком долго или даже внесение таких каналов в список исключений, автоматическое удаление из списка каналов, на которых было слишком мало переговоров, и т.д.

 

Запись

Я не нахожусь за компьютером круглосуточно, но было весьма интересно знать, о чем говорили в эфире в мое отсутствие. Соответственно, встал вопрос записи. Первая идея была проста: устанавливаем еще один виртуальный аудиокабель и перенаправляем вывод звука DSDPlus на какую-нибудь программу-рекордер. Правда, как оказалось, очень нелегко стабильно найти программу-рекордер, которая бы соответствовала простому набору требований: умела записывать сразу в mp3 или ogg и умела автоматически разделять запись на файлы при паузах в звуке длиннее заданного количества секунд. Хорошо подошел MP3 Recorder Studio, если бы не одно НО — он shareware, бесплатная версия ограничена записью в 30 секунд, и когда переговоры длились более 30 секунд без пауз, программа выплевывала окошко с предложением купить платную версию и запись останавливалась, было необходимо ее перезапускать вручную, что, само собой, было неприемлемо. От покупки полной версии меня остановил тот факт, что на сайте разработчика можно было купить не одну программу, а только целый пакет из кучи утилит за 60$, и тут меня, прямо скажем, задушила жаба.

А потом в голову пришло очевидное: у DSDPlus есть встроенная функция записи. Но и тут все не так уж и гладко. Публичная версия DSDPlus 1.101 имеет весьма странный баг при записи в MP3: запись как будто ведется с ускорением в 2 раза. И это не неправильная частота дискретизации, а именно ускорение: частота дискретизации для самого файла — 8000 герц, и когда в аудиоредакторе ты изменяешь скорость файла на нормальную, фактически происходит срез частот еще в два раза — речь хоть и все еще разборчива, но слушать такое очень неприятно. В непубличной версии DSDPlus этот баг исправлен.

А для пользователей публичной версии есть простой выход: записывать эфир в несжатые WAV-файлы и настроить периодический запуск .bat- или powershell-скрипта, который будет натравливать на них LAME или OGG энкодер и удалять оригиналы.

DSDPlus так же умеет разбивать запись на файлы чтобы не превышать определенную длительность, и писать в отдельный файл таймкоды о том, в какое именно время и откуда именно была произведена запись. Правда, форматом файла почему-то был выбран .srt — в таком формате, например, часто хранятся субтитры к фильмам и сериалам. Для меня это было не очень удобно, поэтому я за один вечер набросал небольшую утилику, которая конвертит эти .srt-файлы от DSDPlus в обычные CUE Sheets, группируя записи по длине пауз между ними, и в результате записанный длинный wav/mp3 файл можно легко разбить на отдельные файлы какой-нибудь программой для split'а аудио, например, mp3splt.

Утилитку можно стащить с моего Github: https://github.com/uprt/srt2cue
Писалось, как я уже сказал, за один вечер и чисто для себя, поэтому код местами кривоват, но работает. Ставьте звездочки, присылайте пулл-реквесты, ага.

А как было правильно?

На самом деле, то, на что я наткнулся — это не просто цифровая, а еще и транкинговая связь. Если говорить очень упрощенно, то в эфире кроме ряда голосовых каналов есть специальный служебный канал, и когда кто-то выходит на связь, там передается информация о том, на какой частоте производится передача. Я, по сути дела, на это забил, просто прикрутив к SDR# сканер частот, но если вы хотите узнать, как же это сделать правильно, то читайте дальше.

Для работы с транкинговой цифровой связью существует специальный софт: UniTrunker. Он как раз умеет слушать и декодировать служебный канал и понимать, на какую частоту нужно перенастроиться в конкретный момент времени. Подробный мануал можно найти вот тут.

Работать он может по-разному:

  1. У вас 2 RTL-SDR приемника, один слушает служебный канал, другой настраивается на нужную частоту для приема.

  2. И служебный, и голосовые каналы влезают в принимаемую полосу вашего приемника — тогда можно обойтись только одним RTL-SDR-свистком.

    Выход точно так же можно направить на DSDPlus, хотя я встречал упоминания, что новые версии юнитранкера умеют декодировать голос сами (но могу ошибаться).

Почему я этим не воспользовался? У меня был тюнер на старом чипе Elonics E4000, а UniTrunker умеет работать только с более новыми приемниками на базе R820T.

Впрочем, решение все равно было. Например, мне попалась на глаза схема, когда
- или запускается сразу два SDR# с двумя тюнерами, один из которых слушает служебный канал, а второй настраивается на голос;
- или когда запускается один SDR# но со специальным плагином, позволяющему ему настраиваться сразу на две частоты в пределах полосы тюнера, выводя оба сигнала на разные аудиоустройства и передавая звук с одной частоты через виртуальный аудикабель в UniTrunker, а звук с другой в DSDPlus.
В этих схемах UniTrunker должен каким-то образом сообщать SDR#, на какую именно частоту надо перенастроиться, и для этого есть специальный плагин для него. Сайт плагина давно уже умер, но хвала web.archive.org (ссылка раз, ссылка два). А сам плагин остался на github'е: https://github.com/walczakp/serial-controller. Для коммуникации между UniTrunker и SDR# разработчик почему-то выбрал виртуальный COM-порт. Я, конечно, не очень понимаю, зачем (что мешало обойтись тем же tcp-сокетом?), но, видимо, так захотелось :)

Что можно услышать

Вопрос, который, наверное, интересует всех: что же там можно услышать? Да много чего разного. Для меня основной интерес составили переговоры местных дорожных полицейских. Обычно там все было вполне стандартно: один стоит на горе и высматривает нарушителей, передавая номера и приметы экипажу, стоящему чуть ниже; сообщения о разных ДТП; классическое "тут реверсивное движение забыли на мосту переключить, уже два часа как светофор неправильно горит", и подобное. Правда, пару раз удалось наткнуться на погони в прямом эфире, когда очередной лихач на дорогой машине не остановился по требованию ДПС и в итоге за ним гонялись через весь город. Конец был не героический: у одной машины полицейских кончился бензин, а от другой машины нарушитель ушел по сельхозполям в пригороде. Учитывая, что он был на лендкрузере, а преследователи на чем-то легковом, то, в принципе, не удивительно.

Потом выяснилось, что очень-очень рядом на соседней частоте сидят еще другие представители органов порядка. Переговоры у них слышно нечасто, но, в принципе, бывает тоже интересно послушать. То школьники ночью разбили стекло в алкомагазине, то наркоман выламывает кому-то квартирную дверь топором, то жильцы дома устроили массовую драку из-за занятого кем-то "чьего-то" парковочного места во дворе. В общем, нормальная жизнь российского провинциального города.

Legal disclaimer

И самый главный вопрос: законно ли это? Долгое время существовал проект DPS-FM, который занимался ничем иным, как трансляцией в интернет переговоров ДПС в Петербурге. Они изучали российское законодательство и сделали простой вывод: явного запрета на прослушивание радиопереговоров, передаваемых в открытом (не шифрованном виде) в законах нет, следовательно, это разрешено. Более того, парни даже сделали запрос в Роскомнадзор о легальности такой деятельности и получили такой ответ:

 

Другое дело, что на некоторых радиолюбительских форумах я встречал упоминания, что незаконно публиковать конкретные частоты, на которых вы услышали что-либо интересное. Обоснование было простое: в ряде документов силовых структур эти частоты перечислены в документах "для служебного пользования", и если вы "разгласите" эту информацию, то могут возникнуть проблемы. С одной стороны, притянуто за уши, а с другой стороны, не забывайте, что это все-таки Россия и ожидать от государства можно всего чего угодно, лучше не ходить по тонкому льду.

Ну и последний вопрос о моральной составляющей вопроса. Я считаю, что это хорошо и правильно. Переговоры изначально передаются в открытом и незашифрованном виде — если бы надо было скрыть от наблюдателей, зашифровали бы. Граждане имеют конституционное право на свободу получения и распространения информации. В конце концов, это общественный контроль над структурами, которые работают на налоги граждан и должны работать на благо граждан.

Удачных исследований радиоэфира!