D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
Автор merdock
Статья написана для Конкурса статей #10
Аналог flipper zero или железом по лапкам
Предисловие (долгий путь начинается со слов: я знаю короткую дорогу)
Зашел, увидел что очень на нашем форуме не хватает статей по хаку с использованием железа и решил написать статью с моим опытом выживания в этом страшном мире. Как зимним вечером один из отпрысков который учится в другом городе, посетовал мне о том, что ему недают парковаться во дворе дома рядом с учебным заведением - мешает шлагбаум. Попытки договориться с местными аборегенами не привели к желаемому результату. Эта несправедливость затронула все струнки моей ранимой души и я решил помочь. Вспомнил о такой игрушки как flipper zero, НО цена пошатнула мой мир. Поискал аналоги и был разочарован, в итоге решил по быстрому написать свой супер гаджет. Немного покопавшись я выяснил что мне нужен был перехват статических кодов, ломать авто сигнализации и анализ их протоколов передачи данных сложно, долго и не надо мне. Хорошая статья с анализом перехвата динамического ключа опубликована на хабре линк, так же наткнулся на статью со списком автосигнализаций которые уже ломают линк
Ловим сигнал(суть, не суть в песок)
Большинство брелков со статическим кодом используют ASK/OOK модуляцию на частоте 433.92 МГц(просто примите это и живите с этим). Наша задача перехватить сигнал, конвертировать, сравнить с протоколом, если подходит - декодировать, и вывести декодированную строку которую потом возможно воспроизвести после кодирования. Для начала использовал даташит от чипа ev1527, т.к. он был в наличии и на нем можно было проводить тесты работоспособности.
Брелок для теста с управляющим модулем ev1527
Протокол передачи данных ev1527
Детально протокол описывать не буду, но суть такая - cc1101 отдает импульсы, мы замеряем время между импульсами, переводим в бинарную систему, потом перекодируем исходя из протокола.
Путь решения задачи (у хакера нет цели - есть только путь)
Базовый подход к решению задачи по созданию софта и/или устройства у меня выработался за несколько десятка лет однозначный:
1) определение характеристик которые мне нужны
Наиболее важные характеристики: язык программирования, подходящее ide, открытый исходный код, универсальность и простота, цена, затраты времени
2) поиск подходящего аналога решения в виде исходников
Огромная трата времени,т.к. натыкаешься на нерабочие решения, решения описаны на разных языках и переводчик не поможет
3) компиляция, реализация, тестирование аналогов как есть
Самое сложно, т.к. приходится использовать разные ide, разные язык программирования, заказывать разное железо
4) выбор наиболее подходящего решения с точки зрения определенных характеристик
В итоге остаются несколько решений, которые работают, но имеют свои недостатки, остается выбрать удобный
5) глубокий рефакторинг выбранного аналога или его части решения под свои цели
Переделываю все как надо - чаще всего удаляю 95% всего не нужного. Далее создаю все нужное и красивое.
6) profit!
Показываю всем и заставляю всех восхищаться своей крутизной, далее продаю или использую.
Выбор железа, софта, языка программирования(сложный выбор таблетки)
Выбор IDE для железа пал на Arduino IDE по причине того что я его знаю и он неоднократно любимый во всех позах - си, соответственно выбор железа ушел в сторону адруинки, но после поиска подобных проектов стало понятно, что надо что то по мощнее. И вот тут наткнулся на то что Arduino IDE поддерживает работу с Rasspberry Pi Pico, т.е. это дало определение железа и среды разработки для него. Железо радио связи с трансивером на нужной частоте как оказалось на текущий момент не так то и много, оно или дорогое и профессиональное, как итог выбор пал на беспроводной модуль CC1101(этот же модуль и во flipper zero вставляют). Нашел много примеров(недоделанных) на основе модуля NRFL01, но он меня не устроил, т.к. снижает вариативность в будущем использования модуля для других целей. Так же существуют простенькие двойные модули приема и передачи FS1000A[tx] + MX-RM-5V[rx], SYN115[tx] + SYN480R[rx] и готовые ардуино библиотеки для работы с ними RadioHead, RCSwitch, я не стал использовать их по той же причине. Плюсы использования CC1101 - это программная поддержка разных частот 300-348, 387-464, 779-928 МГц и разных модуляций FSK, GFSK, ASK/OOK, MSK. Покопавшись в тоннах гигаинформации поисковика нашел несколько проектов которые подходили по выбранному ide, самый интересный оказался cc1101-wizzard. Данный проект имеет второй релиз и спасибо автору, выложил исходники и очень доходчиво все описал. В данном проекте самое важное было - это реализация стандарта радио протоколов для односторонней передачи данных, что нас и интересует. Заказал платы и начал эксперименты.
Технические характеристики CC1101:
Дальность действия: 300…500 м
Напряжение питания: 2,7…5,5 В постоянного тока (рекомендуется от 4,5 до 5,5 В)
Рабочая частота: от 300 до 348, от 387 до 464 и от 779 до 928 МГц
Скорость передачи данных: 500 кбит/с (по умолчанию)
Поддержка модуляций: 2-FSK, GFSK и MSK
Потребление тока: 20…30 мА
Технические характеристики Raspberry Pi Pico RP2040:
Характеристики
Микроконтроллер: RP2040;
Ядро: 2 x ARM Cortex-M0+ (32 бита);
Тактовая частота: 133 МГц;
Оперативная память: 264 КБ;
Flash-память: 2 МБ;
Контакты ввода-вывода: 26;
Контакты с АЦП: 3 (12 бит);
Контакты с ШИМ: 16;
Каналы DMA: 12;
Аппаратные интерфейсы: 2 x UART, 2 x I2C, 2 x SPI;
Периферийные устройства: RTC, датчик температуры;
Напряжение логических уровней: 3.3 В;
Напряжение питания: через USB (5 В), через пин VSYS (1.8…5.5 В);
Потребляемый ток: до 140 мА.
Размеры: 51x21x4 мм.
Хьюстон, у нас проблемы
После доставки плат, спаял их исходя из даташита, используя шину и протокол SPI, подключил по USB к компу, загрузил Arduino IDE, скомпилировал софт, залил прошивку на плату RP2040 и НИХ*Я НЕ ЗАРАБОТАЛО! Я был очень расстроен и потратил неделю на поиски проблемы, проверил пины, проверил сами платы - все работает, как только малинка пытается подключиться к cc1101 уходит в бесконечное ожидание. По итогу я не смог найти причину, сложилось впечатление что даташит и модуль предоставленный ide не соответствует cc1101, ревизия может какая та новая, но это не брак - проверил на 5 запасных картах. После смены Board в IDE и рефакторе модуля связи с cc1101 произошло чудо и все заработало. Тут я понял, что прошел месяц.
Начальная схема
Конечная настройка
Настройка Board в Arduino IDE - "Arduino Mbed OC 2040 Board", в проекте McGr3g0r/cc1101-wizzard использовался другой Board - "Raspberry Pi Pico/RP2040/RP2350".
Выбор McGr3g0r более практичен, т.к. там более гибкая настройка и простая работа с внешними устройствами, НО я так и не смог добиться нормальной работы CC1101 в ней.
Пины Raspberry Pi Pico
По итогу релизовал подключение SPI по данным пинам и питание:
//RP2040 pins SPI0
sck = 18
miso = 16
mosi = 19
ss = 17
gdo0 = 20
gdo2 = 21
Пины СС1101
Питание платы взял с малины на пинах:
//Power 3.3v
gnd = 38
vcc = 36
Реализация
Следующий месяц я потратил на то чтобы написать софт. В итоге из проекта cc1101-wizzard был с корнем вырван только код радио протоколов для чипов somfy, ev1527, hcs200, db200, pt2240, retekess. Остальное я посчитал излишним, так же было понятно что делать экран как у flipper zero я не собираюсь, считаю такой подход не очень удобен. Был выбран подход подключения и питания от смартфона через USB OTG. Данный подход дает ряд преимуществ:
1) цена реализации в железе, не жалко
2) простота реализации в железе, по факту 2 плата и корпус
3) простота реализации интерфейса на смартфоне
4) возможность удобного масштабирования проекта
Для создания интерфейса управления нашей малинкой через USB OTG на смартфоне с Android'ом была выбрана IDE QTCreator и язык программирования с++ с кроссплатформенным фреймворком Qt, потому что опенсорс, есть огромное сообщество, есть куча примеров, есть удобная документация, кроссплатформенность (просто было лень изучать Kotlin).
Пое**лся я с установкой и настройкой QTCreator+QT - последнии версии стали не доступны для нашей русской братии, компилированные версии вообще убрали, короче тремор головного мозга у разработчиков QT начался. По итогу взял старую версию 5.14.2 которую можно установить с одного файла, нажав пять кнопок. А вообще в будущем тем кто захочет писать под Android советую сразу Kotlin изучать и не отвлекаться на полуфабрикаты - время и нервы сэкономите.
И вот опять страдания в андройде не эмулируется COM порт если через USB OTG подключаешься, после долгого полета по прерии троллей я нашел в лесу эльфа который расписал как в QT работать с USB OTG. Если коротко то надо использовать библиотеку QtAndroidExtras с классом QAndroidJniObject, эта хр*нь позволяет из программы написанной на QT обращаться к нужному файлу с классом в java. После написания небольшого java файла с классом для работы с USB OTG и подключения его в QT, моя apk'шечка заработала! Далее начались обычные рабочие будни разработки интерфейса, протокола взаимодействия с малинкой, протокола взаимодействия малинки с трансивером, тесты, тесты и еще раз тесты.
Результат
Вот что получилоcь:
Сам гаджет в корпусе напечатанном на 3d принтере
Тесты на смартфоне с андройдом
Тесты на компьютере с виндой
Эпилог(fatality)
Данный проект несет большей части познавательную суть - узнать как это работает, понять и воплотить в виде готового примера.
Для понимания решения задачи в проекте использовалось:
1) IDE QTCreator+QT для создания софта на Android
2) IDE Arduino для создания софта на Raspberry Pi Pico
3) программирование на с/с++
4) IDE UltiMaker Cura для 3D печати
5) знание железа
6) понимание протоколов взаимодействия usb otg, com, isp
7) инструменты паяльник, компьютер, смартфон, 3D принтер
8) ну и самое важно голова, опыт, прямые руки
Что хотелось бы добавить в данный проект
1) добавление raw протокола для любых данных
2) доработка интерфейса и добавление юзабилити
3) добавление протоколов с динамическим ключом
4) добавление спектрометра
5) добавление усилителя сигнала
6) создание другого корпуса
Пароль: xss.is
Исходники для Raspberry Pi Pico: link_ino
Корпус для 3D принтера: link_3mf
Бинарники: link_apk link_exe
ToDo
На вопросы "А как скомпилировать?", "Какой паяльник купить?", "А как подключить?" - шлю на ютуб и в гугл.
Проект делался в торопях, если нашли ошибку и знаете как ее исправить напишите в лс.
Продолжать данный проект наверное не буду, т.к. основную задачу он выполнил, а сильно много тратить время на него не могу. Если кто то захочет профинансировать - пишим в лс, готов выслушать любые предложения.
Статья написана для Конкурса статей #10

Предисловие (долгий путь начинается со слов: я знаю короткую дорогу)
Зашел, увидел что очень на нашем форуме не хватает статей по хаку с использованием железа и решил написать статью с моим опытом выживания в этом страшном мире. Как зимним вечером один из отпрысков который учится в другом городе, посетовал мне о том, что ему недают парковаться во дворе дома рядом с учебным заведением - мешает шлагбаум. Попытки договориться с местными аборегенами не привели к желаемому результату. Эта несправедливость затронула все струнки моей ранимой души и я решил помочь. Вспомнил о такой игрушки как flipper zero, НО цена пошатнула мой мир. Поискал аналоги и был разочарован, в итоге решил по быстрому написать свой супер гаджет. Немного покопавшись я выяснил что мне нужен был перехват статических кодов, ломать авто сигнализации и анализ их протоколов передачи данных сложно, долго и не надо мне. Хорошая статья с анализом перехвата динамического ключа опубликована на хабре линк, так же наткнулся на статью со списком автосигнализаций которые уже ломают линк
Ловим сигнал(суть, не суть в песок)
Большинство брелков со статическим кодом используют ASK/OOK модуляцию на частоте 433.92 МГц(просто примите это и живите с этим). Наша задача перехватить сигнал, конвертировать, сравнить с протоколом, если подходит - декодировать, и вывести декодированную строку которую потом возможно воспроизвести после кодирования. Для начала использовал даташит от чипа ev1527, т.к. он был в наличии и на нем можно было проводить тесты работоспособности.
Брелок для теста с управляющим модулем ev1527
Протокол передачи данных ev1527
Детально протокол описывать не буду, но суть такая - cc1101 отдает импульсы, мы замеряем время между импульсами, переводим в бинарную систему, потом перекодируем исходя из протокола.
Путь решения задачи (у хакера нет цели - есть только путь)
Базовый подход к решению задачи по созданию софта и/или устройства у меня выработался за несколько десятка лет однозначный:
1) определение характеристик которые мне нужны
Наиболее важные характеристики: язык программирования, подходящее ide, открытый исходный код, универсальность и простота, цена, затраты времени
2) поиск подходящего аналога решения в виде исходников
Огромная трата времени,т.к. натыкаешься на нерабочие решения, решения описаны на разных языках и переводчик не поможет
3) компиляция, реализация, тестирование аналогов как есть
Самое сложно, т.к. приходится использовать разные ide, разные язык программирования, заказывать разное железо
4) выбор наиболее подходящего решения с точки зрения определенных характеристик
В итоге остаются несколько решений, которые работают, но имеют свои недостатки, остается выбрать удобный
5) глубокий рефакторинг выбранного аналога или его части решения под свои цели
Переделываю все как надо - чаще всего удаляю 95% всего не нужного. Далее создаю все нужное и красивое.
6) profit!
Показываю всем и заставляю всех восхищаться своей крутизной, далее продаю или использую.
Выбор железа, софта, языка программирования(сложный выбор таблетки)
Выбор IDE для железа пал на Arduino IDE по причине того что я его знаю и он неоднократно любимый во всех позах - си, соответственно выбор железа ушел в сторону адруинки, но после поиска подобных проектов стало понятно, что надо что то по мощнее. И вот тут наткнулся на то что Arduino IDE поддерживает работу с Rasspberry Pi Pico, т.е. это дало определение железа и среды разработки для него. Железо радио связи с трансивером на нужной частоте как оказалось на текущий момент не так то и много, оно или дорогое и профессиональное, как итог выбор пал на беспроводной модуль CC1101(этот же модуль и во flipper zero вставляют). Нашел много примеров(недоделанных) на основе модуля NRFL01, но он меня не устроил, т.к. снижает вариативность в будущем использования модуля для других целей. Так же существуют простенькие двойные модули приема и передачи FS1000A[tx] + MX-RM-5V[rx], SYN115[tx] + SYN480R[rx] и готовые ардуино библиотеки для работы с ними RadioHead, RCSwitch, я не стал использовать их по той же причине. Плюсы использования CC1101 - это программная поддержка разных частот 300-348, 387-464, 779-928 МГц и разных модуляций FSK, GFSK, ASK/OOK, MSK. Покопавшись в тоннах гигаинформации поисковика нашел несколько проектов которые подходили по выбранному ide, самый интересный оказался cc1101-wizzard. Данный проект имеет второй релиз и спасибо автору, выложил исходники и очень доходчиво все описал. В данном проекте самое важное было - это реализация стандарта радио протоколов для односторонней передачи данных, что нас и интересует. Заказал платы и начал эксперименты.
Технические характеристики CC1101:
Дальность действия: 300…500 м
Напряжение питания: 2,7…5,5 В постоянного тока (рекомендуется от 4,5 до 5,5 В)
Рабочая частота: от 300 до 348, от 387 до 464 и от 779 до 928 МГц
Скорость передачи данных: 500 кбит/с (по умолчанию)
Поддержка модуляций: 2-FSK, GFSK и MSK
Потребление тока: 20…30 мА
Технические характеристики Raspberry Pi Pico RP2040:
Характеристики
Микроконтроллер: RP2040;
Ядро: 2 x ARM Cortex-M0+ (32 бита);
Тактовая частота: 133 МГц;
Оперативная память: 264 КБ;
Flash-память: 2 МБ;
Контакты ввода-вывода: 26;
Контакты с АЦП: 3 (12 бит);
Контакты с ШИМ: 16;
Каналы DMA: 12;
Аппаратные интерфейсы: 2 x UART, 2 x I2C, 2 x SPI;
Периферийные устройства: RTC, датчик температуры;
Напряжение логических уровней: 3.3 В;
Напряжение питания: через USB (5 В), через пин VSYS (1.8…5.5 В);
Потребляемый ток: до 140 мА.
Размеры: 51x21x4 мм.
Хьюстон, у нас проблемы
После доставки плат, спаял их исходя из даташита, используя шину и протокол SPI, подключил по USB к компу, загрузил Arduino IDE, скомпилировал софт, залил прошивку на плату RP2040 и НИХ*Я НЕ ЗАРАБОТАЛО! Я был очень расстроен и потратил неделю на поиски проблемы, проверил пины, проверил сами платы - все работает, как только малинка пытается подключиться к cc1101 уходит в бесконечное ожидание. По итогу я не смог найти причину, сложилось впечатление что даташит и модуль предоставленный ide не соответствует cc1101, ревизия может какая та новая, но это не брак - проверил на 5 запасных картах. После смены Board в IDE и рефакторе модуля связи с cc1101 произошло чудо и все заработало. Тут я понял, что прошел месяц.
Начальная схема
Конечная настройка
Настройка Board в Arduino IDE - "Arduino Mbed OC 2040 Board", в проекте McGr3g0r/cc1101-wizzard использовался другой Board - "Raspberry Pi Pico/RP2040/RP2350".
Выбор McGr3g0r более практичен, т.к. там более гибкая настройка и простая работа с внешними устройствами, НО я так и не смог добиться нормальной работы CC1101 в ней.
Пины Raspberry Pi Pico
По итогу релизовал подключение SPI по данным пинам и питание:
//RP2040 pins SPI0
sck = 18
miso = 16
mosi = 19
ss = 17
gdo0 = 20
gdo2 = 21
Пины СС1101
Питание платы взял с малины на пинах:
//Power 3.3v
gnd = 38
vcc = 36
Реализация
Следующий месяц я потратил на то чтобы написать софт. В итоге из проекта cc1101-wizzard был с корнем вырван только код радио протоколов для чипов somfy, ev1527, hcs200, db200, pt2240, retekess. Остальное я посчитал излишним, так же было понятно что делать экран как у flipper zero я не собираюсь, считаю такой подход не очень удобен. Был выбран подход подключения и питания от смартфона через USB OTG. Данный подход дает ряд преимуществ:
1) цена реализации в железе, не жалко
2) простота реализации в железе, по факту 2 плата и корпус
3) простота реализации интерфейса на смартфоне
4) возможность удобного масштабирования проекта
Для создания интерфейса управления нашей малинкой через USB OTG на смартфоне с Android'ом была выбрана IDE QTCreator и язык программирования с++ с кроссплатформенным фреймворком Qt, потому что опенсорс, есть огромное сообщество, есть куча примеров, есть удобная документация, кроссплатформенность (просто было лень изучать Kotlin).
Пое**лся я с установкой и настройкой QTCreator+QT - последнии версии стали не доступны для нашей русской братии, компилированные версии вообще убрали, короче тремор головного мозга у разработчиков QT начался. По итогу взял старую версию 5.14.2 которую можно установить с одного файла, нажав пять кнопок. А вообще в будущем тем кто захочет писать под Android советую сразу Kotlin изучать и не отвлекаться на полуфабрикаты - время и нервы сэкономите.
И вот опять страдания в андройде не эмулируется COM порт если через USB OTG подключаешься, после долгого полета по прерии троллей я нашел в лесу эльфа который расписал как в QT работать с USB OTG. Если коротко то надо использовать библиотеку QtAndroidExtras с классом QAndroidJniObject, эта хр*нь позволяет из программы написанной на QT обращаться к нужному файлу с классом в java. После написания небольшого java файла с классом для работы с USB OTG и подключения его в QT, моя apk'шечка заработала! Далее начались обычные рабочие будни разработки интерфейса, протокола взаимодействия с малинкой, протокола взаимодействия малинки с трансивером, тесты, тесты и еще раз тесты.
Результат
Вот что получилоcь:
Сам гаджет в корпусе напечатанном на 3d принтере
Тесты на смартфоне с андройдом
Тесты на компьютере с виндой
Эпилог(fatality)
Данный проект несет большей части познавательную суть - узнать как это работает, понять и воплотить в виде готового примера.
Для понимания решения задачи в проекте использовалось:
1) IDE QTCreator+QT для создания софта на Android
2) IDE Arduino для создания софта на Raspberry Pi Pico
3) программирование на с/с++
4) IDE UltiMaker Cura для 3D печати
5) знание железа
6) понимание протоколов взаимодействия usb otg, com, isp
7) инструменты паяльник, компьютер, смартфон, 3D принтер
8) ну и самое важно голова, опыт, прямые руки
Что хотелось бы добавить в данный проект
1) добавление raw протокола для любых данных
2) доработка интерфейса и добавление юзабилити
3) добавление протоколов с динамическим ключом
4) добавление спектрометра
5) добавление усилителя сигнала
6) создание другого корпуса
Пароль: xss.is
Исходники для Raspberry Pi Pico: link_ino
Корпус для 3D принтера: link_3mf
Бинарники: link_apk link_exe
ToDo
На вопросы "А как скомпилировать?", "Какой паяльник купить?", "А как подключить?" - шлю на ютуб и в гугл.
Проект делался в торопях, если нашли ошибку и знаете как ее исправить напишите в лс.
Продолжать данный проект наверное не буду, т.к. основную задачу он выполнил, а сильно много тратить время на него не могу. Если кто то захочет профинансировать - пишим в лс, готов выслушать любые предложения.
Оригинал: https://xss.is
Конкурс 2025
Нажмите, чтобы раскрыть...
View hidden content is available for registered users!