Представим, что ты поймал, перехватил и расшифровал сигнал управления каким-то устройством. Теперь настала пора его подделать! А для этого нужно научиться передавать любые сигналы. Готовим радиопередатчик — и вперед к победе!
 

Железо

В качестве примера будем рассматривать сигналы от пульта, работающего на частоте 434 МГц.

Беспроводной пульт
Беспроводной пульт

Такой пульт для наших целей хорош по двум причинам:

  1. Его сигнал очень прост для изучения и представляет собой модулированный нужной частотой бинарный код (так называемая модуляция OOK — On-Off Keying).
  2. По такому принципу работают многие устройства, так что, разобравшись с одним, нетрудно управлять и другими.

Для приема сигнала мы пользовались дешевым приемником RTL SDR V3, купить который можно за 30 долларов. Он хорош для приема и анализа сигналов, но вот передавать, увы, RTL SDR не умеет. Тут нам пригодится что-нибудь более функциональное, например LimeSDR или HackRF.

 

Софт

Главное отличие Software Defined Radio от радио обычного в том, что вся обработка сигнала выполняется в «цифре». Задача самого устройства сводится к тому, чтобы передать цифровой поток на ЦАП, который транслирует все в эфир. Скорость оцифровки и ширина полосы пропускания связаны теоремой Шеннона — Котельникова: чем больше число отсчетов в секунду, тем более широкополосный сигнал можно передать.

Скорости современных ЦАП и АЦП таковы, что SDR может записывать одновременно весь эфир FM в диапазоне от 88 до 108 МГц целиком. Или передавать сразу несколько сигналов одновременно на разных частотах — главное, эти сигналы правильно сформировать программно.

 

Привет из Голландии

В качестве примера возможностей SDR хочу поделиться записью, которую я сделал в Амстердаме. Она содержит все FM-радиостанции сразу в диапазоне от 91 до 105 МГц, десять секунд такой записи занимают 660 Мбайт. Можешь скачать этот файл и послушать, что играется на голландском радио.

Проиграть файл можешь в бесплатной программе SDR# — в ней можно открыть запись и слушать любую станцию, как с обычного приемника. Но в отличие от приемника все декодирование идет в «цифре», а на входе лишь цифровой поток. Думаю, теперь ты представляешь, какая вычислительная мощность у современных SDR.

Вернемся к беспроводному пульту. Наша задача — сформировать нужный нам сигнал, а SDR передаст его в эфир. Классикой для цифровой обработки сигналов считается программа GNU Radio. Это не просто программа, а целый фреймворк с огромным количеством компонентов для работы с сигналами и возможностью добавлять собственные модули. Раньше эта программа была доступна только в Linux, но последние версии работают и в 64-битных версиях Windows. Пользователи macOS могут установить GNU Radio с помощью brew.

В общем, устанавливаем GNU Radio, подключаем SDR и приступаем к работе с сигналами.

 

Прием

Чтобы передать сигнал, сначала нужно его принять и сохранить как образец. Запускаем GNU Radio Companion и собираем из блоков схему.

Прием в GNU Radio
Прием в GNU Radio

GNU Radio ориентирована на поточную обработку данных, в ней можно создавать из блоков схему, которая будет выполнять операции. В данном случае мы имеем только два блока: Source (источник) и Sink (приемник, буквально «слив»). Я использую SDR USRP, поэтому в качестве источника — USRP Source. В твоем случае устройство может быть другим — ищи в документации к твоему SDR. В качестве приемника используется FFT Sink — блок визуализации данных, который позволит нам увидеть наличие сигнала. Он не обязателен для записи, но без него будет непонятно, принимаем мы сигнал или нет.

В свойствах приемника я также указал частоту, на которой мы хотим принимать, — 434 МГц. Частоту дискретизации (sample rate) я установил равной 128 000, этого достаточно для записи сигнала. Запускаем проект в GNU Radio, подносим пульт поближе к антенне, нажимаем на нем любую кнопку, и, если все было сделано правильно, мы увидим хорошо заметный всплеск сигнала на спектре.

Спектр сигнала в GNU Radio
Спектр сигнала в GNU Radio

Если сигнал виден нормально, мы можем его записать. Добавляем блок File Sink.

Схема в GNU Radio с блоком записи
Схема в GNU Radio с блоком записи

GNU Radio для Windows требует абсолютные пути файлов, иначе ничего не работает. В Linux такой проблемы нет.

Запускаем программу, нажимаем кнопку на пульте, закрываем программу. В указанной нами папке должен появиться файл 433_signal.iq размером примерно 5 Мбайт, содержащий наш сигнал. Его можно открыть в любом аудиоредакторе, например в Cool Edit, если выбрать тип файла «стерео» (в SDR пишутся два канала, называемых I и Q) и тип данных float. Мы же откроем его с помощью Python и библиотеки для научных расчетов NumPy.

import numpy as np
import matplotlib.pyplot as plt

data = np.fromfile('433_signal.iq', dtype=np.float32)
data_2ch = np.reshape(data, (-1, 2))
data_left = data_2ch[:, -1]
rate = 128000

plt.figure(1)
time = np.linspace(0, len(data_left)/rate, num=len(data_left))
plt.plot(time, data_left)
plt.tight_layout()
plt.show()

Записанный файл не имеет заголовка wav, а содержит непосредственно данные float, так что частоту дискретизации и тип данных необходимо указать вручную. Также с помощью np.reshape входной одномерный массив преобразуется в двумерный: запись у нас содержит два канала. Для удобства отображения я вывожу только один канал.

Запускаем программу и видим наш сигнал.

Сигнал в Matplotlib
Сигнал в Matplotlib

Чтобы избежать искажения, уровень записи не должен быть слишком высоким и упираться в 1.0. При этом он не должен и быть слишком низким, иначе качество передаваемого сигнала будет плохим. Уровень сигнала между 0.5 и 1.0 — оптимальный. В моем случае было достаточно держать пульт при записи в нескольких сантиметрах от антенны.

Если ты не видишь ничего, а вместо этого выдается ошибка отсутствия библиотеки NumPy или Matplotlib, то нужно их установить:

  • в Windows: C:\Python3\Scripts\pip.exe install numpy matplotlib;
  • в Linux: $ sudo pip install numpy scipy matplotlib;
  • в последних версиях macOS: $ pip3 install numpy scipy matplotlib --user.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии