Реверс-инжиниринг некоторых перезаряжаемых одноразовых электронных сигарет с небольшим цветным TFT-дисплеем (Raz TN9000/Kraze HD7K/и т. д.).
Дальнейшие обновления можно найти по адресу https://github.com/ginbot86/ColorLCDVape-RE.
Некоторые одноразовые электронные сигареты, представленные на рынке, включают в себя такие аксессуары, как цветной ЖК-экран и возможность перезарядки USB-C, но при этом являются одноразовыми устройствами; это делает такие устройства весьма экологически вредными. С другой стороны, это открывает возможности для восстановления оборудования любителями/инженерами, повторного использования вейпа как есть, наполняя его свежим вейп-соком и сбрасывая внутренний счетчик, или даже настраивать, редактируя встроенные изображения.
Конкретный вейп, исследуемый в этом проекте, имеет разные названия, но тот, который исследовался конкретно, назывался Kraze HD7K. Однако этот вейп также встречался под торговой маркой «РАЗ», как и RAZ TN9000.
В одноразовых электронных сигаретах обычно используются литий-ионные аккумуляторы без каких-либо защитных схем. Короткие замыкания могут привести к неконтролируемому рассеиванию энергии, что может привести к травмам и/или материальному ущербу. Любая работа с этими вейпами выполняется на ваш страх и риск.
Было установлено, что существует несколько версий схем этих электронных сигарет, которые могут иметь несовместимости, которые могут привести к повреждению устройства, если версии не совпадают. Прежде чем приступать к каким-либо изменениям, проверьте соединения и совместимость прошивки.
Кроме того, сок для вейпа/жидкость для электронных сигарет может содержать высокие концентрации никотина, который впитывается через кожу. Работать с внутренними частями вейпа следует в перчатках до тех пор, пока внутренние части не будут очищены от сока и/или остатков.
Работы других людей над этими вейпами включают, помимо прочего:
Работа, выполненная в вышеупомянутых репозиториях, может быть основана или не основана на работе, выполненной в этом проекте; он предназначен для объединения аналогичных проектов в надежде, что в отношении этих вейпов можно будет предпринять больше усилий сообщества.
Вейп использует следующее оборудование:
В вейпе используется 0,96-дюймовый ЖК-дисплей IPS с разрешением 80x160 и 13-контактный плоский гибкий кабель (FPC) с шагом 0,7 мм, который припаян к материнской плате вейпа. Он подключается через 4-проводной SPI (данные, часы, данные/команда, выбор чипа) и, по-видимому, использует контроллер ST7735S. Он даже использует ту же распиновку для имеющихся в продаже дисплеев, например, Smart Prototyping #102106.
Приколоть | Имя | Функция |
---|---|---|
1 | ТП0/НЗ | Неиспользованный |
2 | ТП1/НЗ | Неиспользованный |
3 | СДИН | Данные SPI на ЖК-дисплей |
4 | СКЛК | Часы SPI |
5 | РС | Низкий логический уровень = команда, высокий = данные |
6 | /RST | Сброс (активный низкий уровень) |
7 | /CS | Выбор чипа (активный-низкий) |
8 | Земля | Источник питания/сигнальная земля |
9 | Северная Каролина | Не подключено |
10 | ВДД | Источник питания (3,3 В) |
11 | ЛЕДК | Катод светодиодной подсветки |
12 | ЛЕДА | анод светодиодной подсветки |
13 | Земля | Источник питания/сигнальная земля |
В вейпе есть две формы флэш-памяти: внутренняя флэш-память на микроконтроллере и 1 мегабайт (8 мегабит) внешней флэш-памяти SPI NOR. Первый содержит прошивку, а второй — все изображения, отображаемые на ЖК-дисплее, а также общее время использования нагревательной катушки для вейпа; этот счетчик используется для определения количества «полосок», отображаемых на счетчике жидкости для вейпа. Анализ шины данных ЖК-дисплея (см. захват логики .dsl с помощью DreamSourceLab DSView) предполагает, что микроконтроллер использует DMA (прямой доступ к памяти) для потоковой передачи данных изображения с внешней флэш-памяти на ЖК-дисплей, поскольку передача данных происходит в виде последовательных фрагментов по 4096 байт. , соответствующий одной странице NOR Flash. Анализ памяти микроконтроллера показывает, что буфер памяти DMA находится в адресах ОЗУ 0x2000022C-0x2000062B.
Все изображения сохраняются на внешней флэш-памяти в виде необработанных 16-битных растровых изображений RGB565 (т. е. каждый пиксель занимает 2 байта данных). Инструменты преобразования, такие как ImageConverter565 из библиотеки UTFT компании Rinky-Dink Electronics, можно использовать для преобразования форматов изображений, таких как JPEG/PNG, в необработанный двоичный файл, который можно вставить во внешнюю Flash-память с соответствующим смещением. В необработанных изображениях метаданные не хранятся, поэтому размеры изображения необходимо указывать вручную, как показано в таблице ниже.
Индекс (#) | Смещение (шестнадцатеричное) | Длина (шестигранник) | Кадр H (пикселей) | Кадр V (пикселей) | Категория | Неиспользованный? | Последовательность (#) | Примечания |
---|---|---|---|---|---|---|---|---|
0 | 0 | 6400 | 80 | 160 | Фон | 0 | ||
1 | 6400 | 2880 | 72 | 72 | Значок батареи | 0 | ||
2 | 8С80 | 2880 | 72 | 72 | Значок батареи | 1 | ||
3 | Б500 | 2880 | 72 | 72 | Значок батареи | 2 | ||
4 | ДД80 | 2880 | 72 | 72 | Значок батареи | 3 | ||
5 | 10600 | 2880 | 72 | 72 | Значок батареи | 4 | ||
6 | 12Э80 | 2880 | 72 | 72 | Значок батареи | 5 | ||
7 | 15700 | 2880 | 72 | 72 | Значок батареи | 6 | ||
8 | 17F80 | 2880 | 72 | 72 | Значок батареи | 7 | ||
9 | 1А800 | 2880 | 72 | 72 | Значок батареи | 8 | ||
10 | 1D080 | 2880 | 72 | 72 | Значок батареи | 9 | ||
11 | 1F900 | 2880 | 72 | 72 | Значок батареи | 10 | ||
12 | 22180 | 2880 | 72 | 72 | Иконка сок | 0 | ||
13 | 24А00 | 2880 | 72 | 72 | Иконка сока | 1 | ||
14 | 27280 | 2880 | 72 | 72 | Иконка сок | 2 | ||
15 | 29B00 | 2880 | 72 | 72 | Иконка сока | 3 | ||
16 | 2С380 | 2880 | 72 | 72 | Иконка сок | 4 | ||
17 | 2EC00 | 2880 | 72 | 72 | Иконка сок | 5 | ||
18 | 31480 | 2880 | 72 | 72 | Иконка сока | 6 | ||
19 | 33D00 | 6400 | 80 | 160 | Вейп-анимация | 0 | ||
20 | 3А100 | 6400 | 80 | 160 | Вейп-анимация | 1 | ||
21 | 40500 | 6400 | 80 | 160 | Вейп-анимация | 2 | ||
22 | 46900 | 6400 | 80 | 160 | Вейп-анимация | 3 | ||
23 | 4CD00 | 6400 | 80 | 160 | Вейп-анимация | 4 | ||
24 | 53100 | 6400 | 80 | 160 | Вейп-анимация | 5 | ||
25 | 59500 | 6400 | 80 | 160 | Вейп-анимация | 6 | ||
26 | 5Ф900 | 6400 | 80 | 160 | Вейп-анимация | 7 | ||
27 | 65Д00 | 6400 | 80 | 160 | Вейп-анимация | 8 | ||
28 | 6С100 | 6400 | 80 | 160 | Вейп-анимация | 9 | ||
29 | 72500 | 6400 | 80 | 160 | Вейп-анимация | 10 | ||
30 | 78900 | 6400 | 80 | 160 | Вейп-анимация | 11 | ||
31 | 7ED00 | 6400 | 80 | 160 | Вейп-анимация | 12 | ||
32 | 85100 | 6400 | 80 | 160 | Вейп-анимация | 13 | ||
33 | 8Б500 | 6400 | 80 | 160 | Вейп-анимация | 14 | ||
34 | 91900 | 6400 | 80 | 160 | Вейп-анимация | 15 | ||
35 | 97D00 | 6400 | 80 | 160 | Фон плагина 1 | Неиспользованный | 16 | 1 |
36 | 9Э100 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 0 | 1 |
37 | 9F8CA | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 1 | 1 |
38 | А1094 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 2 | 1 |
39 | А285Е | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 3 | 1 |
40 | А4028 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 4 | 1 |
41 | А57Ф2 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 5 | 1 |
42 | A6FBC | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 6 | 1 |
43 | А8786 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 7 | 1 |
44 | А9Ф50 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 8 | 1 |
45 | АБ71А | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 9 | 1 |
46 | ACEE4 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 10 | 1 |
47 | АЕ6АЕ | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 11 | 1 |
48 | АФЕ78 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 12 | 1 |
49 | Б1642 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 13 | 1 |
50 | Б2Е0С | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 14 | 1 |
51 | Б45Д6 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 15 | 1 |
52 | B5DA0 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 16 | 1 |
53 | Б756А | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 17 | 1 |
54 | Б8Д34 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 18 | 1 |
55 | BA4FE | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 19 | 1 |
56 | BBCC8 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 20 | 1 |
57 | BD492 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 21 | 1 |
58 | BEC5C | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 22 | 1 |
59 | C0426 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 23 | 1 |
60 | C1BF0 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 24 | 1 |
61 | C33BA | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 25 | 1 |
62 | C4B84 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 26 | 1 |
63 | C634E | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 27 | 1 |
64 | C7B18 | 17КА | 35 | 87 | Удаление логотипа | Неиспользованный | 28 | 1 |
65 | C92E2 | 6400 | 80 | 160 | Фон плагина 2 | Неиспользованный | 0 | 1 |
66 | CF6E2 | Ф80 | 31 | 64 | Анимация батарейных полосок | Неиспользованный | 0 | 1 |
67 | D0662 | Ф80 | 31 | 64 | Анимация батарейных полосок | Неиспользованный | 1 | 1 |
68 | Д15Е2 | Ф80 | 31 | 64 | Анимация батарейных полосок | Неиспользованный | 2 | 1 |
69 | Д2562 | Ф80 | 31 | 64 | Анимация батарейных полосок | Неиспользованный | 3 | 1 |
70 | Д34Е2 | Ф80 | 31 | 64 | Анимация батарейных полосок | Неиспользованный | 4 | 1 |
71 | Д4462 | Ф80 | 31 | 64 | Анимация батарейных полосок | Неиспользованный | 5 | 1 |
72 | Д53Е2 | 6400 | 80 | 160 | Фон плагина 3 | 0 | ||
73 | DB7E2 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 0 | ||
74 | DC67C | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 1 | ||
75 | ДД516 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 2 | ||
76 | DE3B0 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 3 | ||
77 | DF24A | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 4 | ||
78 | E00E4 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 5 | ||
79 | E0F7E | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 6 | ||
80 | E1E18 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 7 | ||
81 | E2CB2 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 8 | ||
82 | E3B4C | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 9 | ||
83 | E49E6 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 10 | ||
84 | Е5880 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 11 | ||
85 | Е671А | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 12 | ||
86 | E75B4 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 13 | ||
87 | E844E | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 14 | ||
88 | Е92Е8 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 15 | ||
89 | EA182 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 16 | ||
90 | EB01C | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 17 | ||
91 | ЕВЕВ6 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 18 | ||
92 | ECD50 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 19 | ||
93 | ЭДБЕА | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 20 | ||
94 | ЕЭЗ84 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 21 | ||
95 | EF91E | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 22 | ||
96 | F07B8 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 23 | ||
97 | F1652 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 24 | ||
98 | F24EC | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 25 | ||
99 | F3386 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 26 | ||
100 | F4220 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 27 | ||
101 | F50BA | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 28 | ||
102 | F5F54 | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 29 | ||
103 | F6DEE | Е9А | 21 | 89 | Удаление логотипа зарядного устройства | 30 | ||
104 | Ф8000 | 4 | Н/Д | Н/Д | Общее время парения x0,01 с (LSB->MSB) | Н/Д | 2 | |
105 | F8004 | 1 | Н/Д | Н/Д | Флаг использования Vape (0xBB) | Н/Д | 3 |
Два скрипта Python были включены для помощи в разделении и повторной сборке дампа Flash в/из отдельных изображений, хранящихся во Flash SPI: split-flashdump.py
и assemble-flashdump.py
. В настоящее время инструменты не выполняют преобразование форматов (привлечение ChatGPT в помощь мне уже было долгим процессом), но во многом помогают создавать собственные пакеты «тем». Неиспользуемые ресурсы можно удалить из переупакованного дампа Flash, не помещая их в каталог, содержащий файлы, подлежащие повторной сборке; эти неиспользуемые регионы останутся как 0xFF/стертые байты.
Реупаковщик assemble-flashdump.py
ожидает, что имена входных файлов будут иметь определенный формат, поскольку он использует смещение в шестнадцатеричной кодировке, чтобы определить, куда вставлять каждую часть в файл флэш-дампа размером 1 МБ (см. Split_map.csv или включенный пример). тема, описанная ниже в разделе «Пользовательские пакеты тем» ).
{index}_{offset}_{width}x{height}_{category}_{sequence}.bin
19_33d00_80x160_vapeanim-0.bin
Чтобы конвертировать изображения PNG или JPEG, используйте инструмент ImgConv.exe
из ранее упомянутой библиотеки UTFT:
ImgConv.exe *.png /r
ImgConv.exe *.jpg /r
ren *.raw *.bin
Примечание. Прежде чем конвертировать изображения в формат .bin, убедитесь, что они имеют правильные размеры!
В качестве доказательства концепции включен готовый пакет тем в стиле Windows 95; он реализует все ресурсы для индикаторов заряда батареи и заряда, анимацию зарядки (только фон плагина 3 и стирание логотипа зарядного устройства, поскольку это единственный используемый набор анимации с тестируемой прошивкой) и анимацию парения (захват 3D-изображения с правильным соотношением сторон). Заставка «Трубы»). Все что нужно — это доступ к SPI Flash и средство его перепрограммирования. Возможности для расширения этой концепции могут быть с помощью дешевого USB-ключа SWD, подключаемого через порт USB-C, и некоторого программного обеспечения, которое загружает небольшой инструмент перепрограммирования в ОЗУ микроконтроллера, потенциально устраняя необходимость отпайки флэш-чипа.
Также включен пустой/редактируемый шаблон. Все кадры имеют номера кадров для анимации.
Вся эта настройка возможна, не трогая прошивку микроконтроллера!
Как описано в разделе «Схема внешней флэш-памяти» , примечания 2 и 3 выше, заполнение ячеек внешней флэш-памяти 0xF8000–0xF8004 значениями 0xFF приведет к полному сбросу счетчика сока, что позволит повторно использовать вейп после пополнения резервуара. Затем необходимо перезагрузить сам микроконтроллер, заземлив контакт nRST или выключив и выключив его, отсоединив и снова подключив батарею; это, вероятно, уже произошло, если кто-то отпаивает и перепаивает внешнюю флэш-память для перепрограммирования/исправления.
Микроконтроллер использует стандартный интерфейс отладки/программирования Serial Wire Debug (SWD) для чтения/записи встроенного ПО и/или внутренней памяти SRAM. Интерфейс SWD доступен через зарядный порт USB-C вейпа. Линии SWDIO/SWCLK подключаются к контактам CC за обычными понижающими резисторами 5,1 кОм Rd, поскольку разъем обычно предназначен только для питания.
Прошивка микроконтроллера не защищена от считывания, поэтому возможным является дальнейшее исследование прошивки посредством декомпиляции. Возможно, этот интерфейс отладки можно будет использовать для взаимодействия с внешней Flash-памятью, но это еще не исследовано.
Некоторые из протестированных материнских плат для вейпов имели тестовые площадки RX/TX на задней стороне платы. Еще не исследовано, как этот порт взаимодействует с прошивкой и/или можно ли его использовать для обновления содержимого внешней флэш-памяти.
Электронная сигарета состоит из двух печатных плат, соединенных вместе 9-контактным прямоугольным разъемом с шагом 0,15 мм:
Контакт 1 обозначен квадратной контактной площадкой на плате питания и соответствующей контактной площадкой на нижней стороне материнской платы (противоположная сторона микроконтроллера, SPI Flash и ЖК-дисплея). ВНИМАНИЕ: Маркировки контакта 1 на двух платах могут находиться напротив друг друга!
Контакт платы питания | Контакт логической платы | Имя | Функция |
---|---|---|---|
1 | 9 | ВБАТ | Плюс аккумулятора (+) на силовой плате |
2 | 8 | ВБУС | +5В от порта USB-C на плате питания с предохранителем SMD, маркировка «B» |
3 | 7 | Земля | Питание/сигнальная земля |
4 | 6 | COIL_DRV | Сигнал управления нагревателем от MCU на материнской плате (активный высокий уровень) |
5 | 5 | PUFF_DET | Сигнал обнаружения затяжки от контроллера вейпа на силовой плате (примечание 1) |
6 | 4 | CC2/SWCLK | USB-C Rd pulldown 2/синхронизация интерфейса отладки SWD к MCU на материнской плате |
7 | 3 | CC1/SWDIO | USB-C Rd pulldown 1/данные интерфейса отладки SWD к MCU на материнской плате |
8 | 2 | ВДД | Питание 3 В от регулятора LDO на материнской плате к контроллеру vape |
9 | 1 | КОИЛ_ДЕТ? | Обнаружение катушки нагревателя для MCU на материнской плате (см. примечание 2) |
Серия микроконтроллеров N32G01 рекламируется в техническом описании как имеющая встроенное флэш-шифрование и поддержку безопасной загрузки, но эта функция (к счастью) не используется на протестированных до сих пор вейпах (а именно на Kraze HD7K).
Не так уж много работы было потрачено на реверс-инжиниринг самой прошивки, но дамп флэш-памяти удалось получить с помощью Segger J-Link и соответствующего программного обеспечения J-Mem, доступ к которому осуществляется через порт отладки/программирования SWD. Как и многие микроконтроллеры на базе Arm, Flash расположен по адресу 0x08000000, но также зеркально отображается по адресу 0x00000000. Дамп прошивки был взят с адресов 0x08000000-0x0800FFFF (64k), и беглый взгляд на дамп прошивки показывает, что на самом деле было использовано только примерно 50% пространства флэш-памяти (все адреса с 0x8000 по 0xFFFF были байтами 0xFF, что указывает на стертую/незапрограммированную память). В дампе прошивки нет удобочитаемых строк.
«Секретный» номер версии отображается на экране, если питание USB-C быстро включается и выключается (но, похоже, происходит непоследовательно). При попытке использовать Kraze HD7K экран становится черным, а текст «GV-K23 0904V1» отображается красным цветом в двух строках текста в течение пары секунд; Похоже, что он отображается с использованием моноширинной версии системного шрифта размером 12 пунктов из Windows. Это намекает на внутреннее название продукта «GV-K» и версию прошивки 1, датированную 4 сентября 2023 года. По совпадению, ближе к концу используемого адресного пространства Flash находится блок байтов, заполненный 0x00 и 0xE8E4, которые подозрительно похоже на данные черных и красно-оранжевых пикселей. Дальнейший анализ необработанных данных из этого региона подтверждает, что номер версии хранится в виде необработанного растрового изображения, а не отображается из текстовой строки (поясняется ниже).
Внутри флэш-дампа прошивки по адресам 0x7066-0x7E75 находится растровая версия вышеупомянутого номера версии. Кажется, что его размер составляет всего 60x30 пикселей, но вокруг этого растрового изображения есть байты заполнения 0x00, которые не совпадают с границами 120 байт (60 пикселей), что затрудняет определение «истинного» размера изображения без декомпиляции прошивки и поиска функции. это вызывает экран версии.
Все товарные знаки являются собственностью соответствующих владельцев.