
При обсуждении взлома оборудования не стоит забывать о старой, но по-прежнему распространенной технологии передачи данных — инфракрасных сигналах. Они до сих пор используются в наших домах, офисах и даже на производстве.
Этот способ связи имеет свои недостатки: ограниченную дальность, чувствительность к внешнему освещению, невысокую скорость передачи данных, а также уязвимость к перехвату и атакам, включая повторное воспроизведение сигналов. С другой стороны, он дешев в производстве и прост в применении, а еще он обеспечивает долгую работу пультов управления от батареек, ведь потребляет электричество только во время работы.
В статье поговорим о реверс-инжиниринге и аппаратном хакинге протоколов дистанционного ИК-управления: от подготовки необходимого оборудования до перехвата и декодирования сигналов. Взломаем пульт от телевизора Samsung и поделимся библиотекой ИК-сигналов, которая позволит вам с легкостью декодировать передачи для других устройств — например, камина Electrolux и кондиционера Funai.
Подготовка
Сначала подготовим необходимое оборудование и ПО. Основное приложение, которое мы будем использовать — цифровой осциллограф. Существует как минимум две такие программы: Logic 2 и PulseView. Обе совершенно бесплатны, их можно свободно скачать и установить на ПК или Mac.
К слову о PulseView: его можно также установить на Linux и он полностью опенсорсный, в отличие от проприетарного Logic 2. Кроме того, в PulseView «из коробки» есть как минимум три анализатора инфракрасных сигналов (NEC, RC-5, RC-6), а в Logic 2 их нет.
Разумеется, можно установить дополнительные модули из интернета, но это лишняя головная боль: придется искать подходящий вариант (повезет, если в нем нет троянов), устанавливать все игры все библиотеки и надеяться, что всё заработает.
В рамках этой статьи будем работать преимущественно с Logic 2: он удобнее и в нем нет критических ошибок, заставляющих перезапускать приложение после каждого измерения.

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

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

В этом проекте будем использовать ИК-приемник из набора датчиков Elegoo 37 Sensor Kit. У него есть три контакта: G — земля, R — питание Vcc (в нашем случае до 5 В) и Y — вывод (для передачи полезной нагрузки). Схему подключения ИК-приемника можно найти на странице 107 этого туториала.

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

Еще нам понадобится логический анализатор. Это отладочный инструмент, предназначенный для перехвата, анализа и визуализации цифровых сигналов в цепи. Логический анализатор помогает диагностировать проблемы, выполнять мониторинг протоколов связи (например, I2C, SPI или UART), а также проверять соотношения таймингов между множественными сигналами.

Последний элемент в нашей схеме — внешний источник постоянного тока, способный выдавать не менее 3,3 В. Можно использовать любой подходящий вам, но в нашем случае это будет Raspberry Pi 4B. Этот малыш имеет восемь контактов заземления, два контакта на 5 В и один контакт на 3,3 В.
Главное преимущество Pi 4B в том, что все эти контакты определены заранее и их не нужно программировать — это особенно удобно для новичков. Если у вас есть, например, Orange Pi или Arduino, то они тоже подойдут, но придется искать подходящие контакты для подключения.

Соединяем всё вместе
Итак, у нас есть все необходимые компоненты, чтобы приступить к реверс-инжинирингу ИК-сигналов. Соберем их в единую схему.
Сначала возьмем ИК-приемник и подключим его к макетной плате.
Обратите внимание на порядок размещения: контакты ИК-приемника должны подключаться горизонтально, поперек нумерованных вертикальных линий. Особенность платы заключается в том, что все пять отверстий в каждом нумерованном столбце соединены друг с другом. При вертикальном подключении все контакты будут соединены между собой, и схема не заработает. Корректный способ показан на фото ниже: здесь контакты датчика подключены к отверстиям на линиях 33–35.
Теперь возьмите два джампера «папа-папа» и соедините их в следующем порядке: линию 33 (заземление датчика) с синей линией над основной цепью, линию 34 (Vcc датчика) с красной линией над основной цепью. Если сделаете все правильно, у вас получится схема, похожая на эту:

Далее нужно подать питание на плату. Возьмем Raspberry Pi (или любой другой внешний источник питания) и два джампера «папа-мама». Подключим «маму» первого джампера к первому контакту Raspberry Pi (тот, где 3,3 В), а другой конец — к красной линии над основной цепью. Затем подключим «маму» второго джампера к шестому контакту RPi (это тот, где находится заземление), а другой конец к синей линии над основной цепью. Итоговый результат будет выглядеть так:

Теперь подключим Raspberry Pi к кабелю питания. На плате замигают светодиоды, сигнализируя, что устройство включено и загружается. Но для нас это неважно, ведь сразу после подключения RPi к питанию ИК-приемник сразу же начинает работать.
Затем возьмем ИК-передатчик (в нашем случае это пульт от телевизора Samsung) и нажмем на любую кнопку — например, кнопку питания. Небольшой светодиод на плате ИК-приемника должен замигать, показывая, что передача происходит успешно.

Теперь нам нужно подключить логический анализатор. Перед подключением его к ПК возьмем два джампера «папа-мама». Подключим первый джампер к каналу 0 (или 1, в зависимости от маркировки на логическом анализаторе) или к любому другому; другой конец джампера подключим к линии 35 макетной платы (к ней же подключен контакт Y ИК-приемника).
Далее подключим второй джампер к заземлению логического анализатора, а другой его конец — к синей линии над основной цепью. Затем соединим USB-кабелем логический анализатор и ПК. Теперь мы сможем передавать перехватываемый сигнал на наш компьютер.

Перехват и анализ
Отлично, ИК-приемник подключен и работает (по крайней мере, реагирует на пульт от телевизора), а логический анализатор подключен к ПК. Схема готова, настало время творить магию!
Запустим цифровой осциллограф. При работе с Logic 2 не возникает вообще никаких проблем: после запуска он автоматически распознает оборудование и самостоятельно всё настроит.

При работе с PulseView всё уже не так просто. После запуска приложения нужно выбрать устройство, нажав кнопку <No Device>.

На этапе Step 1: Choose the driver выберите fx2lafw (общий драйвер для логических анализаторов на основе FX2).

На этапе Step 2 оставьте настройку по умолчанию (USB interface).
На этапе Step 3 нажмите кнопку Scan for devices using driver above. Если логический анализатор подключен, то во время Step 4 приложение автоматически обнаружит оборудование.

Остальные действия практически идентичны для обоих приложений, поэтому дальше сосредоточимся только на Logic 2: как говорилось выше, работать с ним удобнее.
Прежде чем приступить к записи сигналов, нужно настроить скорость передачи битов и размер записи. Для ИК-передачи более чем достаточно скорости в 1 мегабит в секунду (MS/s) и 1 ГБ памяти.
На самом деле, если мы говорим о распространенных ИК-протоколах наподобие NEC или RC5, то обычно используется несущая частота 38 и 36 кГц, и такой скорости будет достаточно. Но для страховки лучше использовать 1 MS/s.

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

Отлично, мы перехватываем ИК-сигнал, поступающий с телевизионного пульта. Теперь нам нужно понять, как он работает, и декодировать его.
Во-первых, у сигнала есть заголовок (header) — начальный импульс и пауза, которые предшествуют передаче данных. Начальный импульс используется приемником для настройки усиления под сигнал. Обычно он довольно долгий (несколько миллисекунд).
В случае стандарта NEC начальный импульс длится 9 мс, затем следует пауза в 4,5 мс. Но в нашем случае (телевизор Samsung) начальный импульс длится 4,5 мс, а пауза — 4,4 мс. Эти временные промежутки могут иметь небольшие погрешности, так что при замерах мы каждый раз будем получать немного разные числа.

На картинке ниже мы видим два схожих сигнала, но которые немного отличаются по длительности.

После заголовка идет слово данных — полезная нагрузка сигнала, управляющая телевизором. Короткий импульс с последующей длинной паузой — это, по сути, один бит, равный 1, или TRUE. Короткий импульс, за которым следует короткая пауза — это 0, или FALSE.

Опираясь на этот паттерн, попробуем определить полный сигнал кнопки питания нашего пульта.

Раскрасив каждый бит, подсчитаем их: три красных (то есть 111), за которыми следуют пять зеленых (00000), затем снова три красных (111), 6 зеленых (000000), и так далее. Вот что получится, если соединить их все вместе:
11100000111000000100000010111111
Не очень удобное представление. Давайте попробуем его улучшить.
Для начала разобьем эти данные на блоки по 8 бит (то есть по одному байту):
11100000 11100000 01000000 10111111
Отлично, такое представление гораздо лучше, и мы видим паттерн: первые 2 байта одинаковы.
Это здорово, но обычно никто не использует сырой двоичный код, потому что он длинный и его сложно читать. Обычно мы преобразуем двоичный код в шестнадцатеричный или десятичный.
Как выполнить преобразование
Во-первых, можно использовать онлайн-калькулятор CyberChef, задав перевод из двоичного и в шестнадцатеричный. Результат будет таким: E0 E0 40 BF.

Во-вторых, можно использовать калькулятор на компьютере:

Еще один конвертер можно использовать в командной строке. В Linux есть приложение bc — язык и калькулятор десятичной арифметики с произвольной точностью. В качестве атрибутов он получает входное (-I) и выходное (-O) значения, а также число для декодирования (-e).

В данном случае мы попросили преобразовать нашу двоичную (-I 2) полезную нагрузку (-e) в десятичную (-O 10) и шестнадцатеричную (-O 16). Как видите, этим способом можно добиться тех же результатов.
Окончательный результат для кнопки питания пульта телевизора Samsung выглядит так:
Кнопка | BIN | DEC | HEX |
Power | 11100000 11100000 01000000 10111111 | 3772793023 | E0E040BF |
Этим же способом можно перехватывать и декодировать другие кнопки.
Библиотека сигналов
В ходе эксперимента мы пробовали искать базы данных ИК-сигналов от устройств крупных производителей. К сожалению, за исключением репозиториев flipper zero и probonopd в Github ничего конкретного найти не удалось.
Более того, сигналы записаны необычным образом, который можно понять только конкретному устройству. Например, вот что можно найти про кнопку Power от нашего пульта в базе данных Flipper:
Name | Type | Protocol | Address | Command |
Power | Parsed | Samsung32 | 07 00 00 00 | E6 00 00 00 |
А вот что про ту же кнопку можно найти во втором репозитории:
functionname | protocol | device | subdevice | function |
KEY_POWER NECx2 | NECx2 | 7 | 7 | 2 |
Как видите, данные по одной и той же кнопке из двух разных источников не имеют между собой ничего общего, кроме числа 7. Здесь нет четкого сырого сигнала, который мог бы считать и понять инженер.
Чтобы исправить это недоразумение, мы создали на GitHub новый проект, где можно найти все сигналы как в двоичном виде, так и в форматах DEC и HEX. Перехваченный сигнал также сохранен в формате .SAL, чтобы пользователи могли считывать его в приложении Saleae. Кроме того, мы решили разобрать пульты, чтобы каждый, кто интересуется темой, мог понять их внутреннее устройство и способ работы, в том числе спецификации чипов.
Полный адрес нашего репозитория:
Репозиторий структурирован по названиям поставщиков и типам устройств (телевизоры, обогреватели, вентиляторы и так далее). В последнем каталоге находятся папки Datasheet, Remote Pictures и Samples.

Кстати, по этой ссылке можно найти декодированные сигналы от того самого пульта Samsung:

Заключение
Перехват и анализ ИК-протоколов — весьма увлекательное занятие, но не стоит забывать, что самые интересные возможности раскрываются в момент, когда вы начинаете использовать декодированные сигналы для хаков и экспериментов. В этот момент можно не только управлять бытовой техникой, но и проводить тесты на уязвимости, а также разрабатывать нестандартные сценарии для взаимодействия с устройствами.
Мы не смогли найти в открытом доступе качественные стандартизованные библиотеки ИК-сигналов, поэтому решили создать свою собственную на GitHub. При должной доработке этот репозиторий мог бы стать полезным инструментом для исследователей безопасности и начинающих реверс-инженеров, предоставляя удобный и доступный набор данных для работы с инфракрасными протоколами.
Если вы хотите внести вклад в этот репозиторий, добро пожаловать! Но пожалуйста, сохраняйте формат и структуру.

PURP — телеграм-канал, где кибербезопасность раскрывается с обеих сторон баррикад
t.me/purp_sec — инсайды и инсайты из мира этичного хакинга и бизнес-ориентированной защиты от специалистов Бастиона