Выбрасывая мусор, удалось заметить в куче электронного хлама плоттер Cricut Maker. Беглый осмотр показал, что устройство в целом в неплохом состоянии, за исключением сгнивших роликов подачи материала. По всей видимости, именно из-за роликов машину и списали в утиль — это стало поводом забрать находку домой и разобраться, что с ней можно сделать. Было известно, что Cricut довольно агрессивно блокирует устройства программно, но попробовать всё равно стоило. Как и ожидалось, машина оказалась заблокирована. Однако после небольшого хакинга удалось вернуть ей полную работоспособность. Скорее всего, предыдущий владелец получил замену по гарантии или скидку на новую модель.
Alex быстро нашёл, что сменные ролики продаются за копейки. Даже при питании от 12В вместо требуемых по спецификации 18В устройство подавало признаки жизни: проходило самотестирование и связывалось с программным обеспечением — правда, при подключении неизменно появлялось зловещее сообщение «Machine deactivated» («Устройство отключено»).
Первым делом захотелось проверить, нет ли на материнской плате EEPROM, в которую можно было бы просто перезаписать серийный номер. Разборка устройства — занятие не для слабонервных, процесс довольно сложный, но её всё равно нужно было проводить ради замены роликов. EEPROM найти не удалось, а используемый в устройстве микроконтроллер оказался из числа тех, для которых под рукой не было отладчика.
Вторая идея заключалась в перехвате сетевого соединения с подменой серийного номера или ответа сервера на «успешный». Однако различные механизмы защиты приложения сделали отключение certificate pinning более муторным занятием, чем хотелось бы тратить на это время. Это не значит, что задача невыполнима — просто быстрого решения найти не получилось.
Фокус сместился на перехват обмена данными между самим устройством и компьютером. Wireshark захватил USB-трафик между Cricut и компьютером. Обмен идёт через USB CDC, и довольно быстро нашлись пакеты, отвечающие за передачу серийного номера. Никакой контрольной суммы или криптографии в них не оказалось. Для дальнейшей работы у Droppy был одолжен Raspberry Pi RP2040, способный одновременно выступать в роли USB Host и USB Client.
Взяв за основу примеры TinyUSB для Arduino (USB Host и простое эхо CDC), удалось собрать несложное устройство-прокси с функцией подмены данных. Ничего сверхъестественного в этом нет, хотя пришлось потратить время, чтобы выяснить: USB Host корректно работает только при разгоне до 240 МГц. Также были настроены все метаданные USB — vendor/product id и описания — так, чтобы совпадать с оригинальным устройством. Когда устройство обнаруживает пакет от плоттера нужной длины, содержащий команду с серийным номером, оно подменяет его на другой. Серийные номера, судя по всему, выдаются последовательно, и статус всех выпущенных устройств можно посмотреть на официальной странице Cricut.
Поскольку устройство-подмена меняет серийный номер на аппаратном уровне, программное обеспечение об этом попросту не догадывается. Плоттер появился в аккаунте, при этом получилось даже зарегистрировать серийные номера, которых на странице статуса Cricut не существует.
Разумеется, возникает вопрос: смогут ли посторонние люди точно так же заблокировать чужие серийные номера Cricut или привязать их к своим аккаунтам…
После чистки устройства, замены роликов (совет: перед установкой размягчить новые ролики в горячей воде), сборки Cricut обратно и печати небольшого корпуса для RP2040 плоттер заработал так, будто был совершенно новым.
Использованный способ возврата Cricut к жизни, вероятно, далеко не самый удобный для пользователя — наверняка существуют и чисто программные решения. Среди возможных альтернатив:
- Перехват сетевого трафика или патч приложения для подмены серийного номера
- Драйвер, эмулирующий USB CDC-подключение Cricut и проксирующий серийный номер
- Драйвер, эмулирующий USB CDC-подключение Cricut, но связывающийся с устройством по Bluetooth
- Разбор процесса обновления прошивки и использование его для патча серийного номера в рамках апдейта
- Устройство-прокси для Bluetooth-трафика
- Дополнительный микроконтроллер между Bluetooth-чипом и основным MCU Cricut для подмены серийного номера перед передачей на Bluetooth-чип
Ни один из этих вариантов дальше рассматривать не планируется — рабочее решение уже есть, но все перечисленные пути вполне заслуживают внимания. Код для изменения серийного номера публиковаться не будет, поскольку это может не подпадать под исключения австралийского законодательства об авторском праве (не является юридической консультацией), но по сути он очень близок к примерам из библиотеки TinyUSB для Arduino.