对一些可充电一次性电子烟进行逆向工程,其中包括小型彩色 TFT LCD(Raz TN9000/Kraze HD7K/等)。
进一步的更新可以在 https://github.com/ginbot86/ColorLCDVape-RE 找到
市场上的一些一次性电子烟配有彩色液晶显示屏和 USB-C 充电等配件,但属于一次性设备;这使得此类设备对生态非常有害。另一方面,这为爱好者/工程师提供了硬件回收的机会,通过重新填充新鲜的电子烟汁并重置内部仪表来按原样重新使用电子烟,甚至通过编辑板载图像进行定制。
该项目中正在研究的特定电子烟有多种名称,但专门研究的电子烟被称为 Kraze HD7K。然而,这款电子烟也以“RAZ”品牌名称出现,例如 RAZ TN9000。
一次性电子烟一般使用锂离子电池,没有任何保护电路。短路可能会消耗不受控制的电量,从而造成人身伤害和/或财产损失。对这些电子烟进行的任何工作均由您自行承担风险。
已确定这些电子烟有多个电路版本,可能存在不兼容性,如果版本不匹配,可能会导致设备损坏。在进行任何修改之前,请验证连接和固件兼容性。
此外,电子烟汁/“电子液体”可能含有高浓度的尼古丁,可通过皮肤吸收。处理电子烟内部部件时应戴手套,直至清除内部部件上的汁液和/或残留物。
其他人在这些电子烟上的工作包括但不限于:
在上述存储库中完成的工作可能会或可能不会基于此项目中完成的工作;它的目的是将类似的项目联系起来,希望社区能够在这些电子烟上做出更多的努力。
vape 使用以下硬件:
该电子烟采用80x160分辨率0.96英寸IPS液晶显示屏,配有13针0.7毫米间距的扁平柔性(FPC)电缆,焊接到电子烟主板上。它通过 4 线 SPI(数据、时钟、数据/命令、片选)连接,并且似乎使用 ST7735S 控制器。它甚至使用与商用显示器相同的引脚排列,例如智能原型#102106。
别针 | 姓名 | 功能 |
---|---|---|
1 | TP0/NC | 未使用 |
2 | TP1/NC | 未使用 |
3 | 斯丁 | SPI 数据到 LCD |
4 | 时钟时钟 | SPI时钟 |
5 | RS | 逻辑低电平=命令,高电平=数据 |
6 | /RST | 复位(低电平有效) |
7 | /CS | 片选(低电平有效) |
8 | 接地 | 电源/信号地 |
9 | 数控 | 未连接 |
10 | 电源电压 | 电源(3.3V) |
11 | LEDK | LED背光源阴极 |
12 | 利达 | LED背光阳极 |
13 | 接地 | 电源/信号地 |
电子烟上的闪存有两种形式:微控制器上的内部闪存,以及外部1兆字节(8兆位)的SPI NOR闪存。前者包含固件,后者包含LCD上显示的所有图像,以及电子烟加热线圈使用的总时间;该计数器用于得出电子烟油量计上显示的“条”数。对 LCD 数据总线的分析(请参阅使用 DreamSourceLab DSView 进行的 .dsl 逻辑捕获)表明,微控制器使用 DMA(直接内存访问)将图像数据从外部闪存流式传输到 LCD,因为数据传输以连续的 4096 字节块的形式进行,对应于单个 NOR Flash 页。对微控制器内存的分析表明,DMA 内存缓冲区位于 RAM 地址 0x2000022C-0x2000062B。
所有图像均以原始 RGB565 16 位位图形式存储在外部闪存上(即每个像素占用 2 个字节的数据)。转换工具(例如 Rinky-Dink Electronics 的 UTFT 库中的 ImageConverter565)可用于将 JPEG/PNG 等图像格式转换为原始二进制文件,该文件可以按相应的偏移量修补到外部闪存中。原始图像没有存储元数据,因此必须手动提供图像尺寸,如下表所示。
指数 (#) | 偏移量(十六进制) | 长度(十六进制) | 框架高度(像素) | 框架 V(像素) | 类别 | 没用过? | 序列 (#) | 笔记 |
---|---|---|---|---|---|---|---|---|
0 | 0 | 6400 | 80 | 160 | 背景 | 0 | ||
1 | 6400 | 2880 | 72 | 72 | 电池图标 | 0 | ||
2 | 8C80 | 2880 | 72 | 72 | 电池图标 | 1 | ||
3 | B500 | 2880 | 72 | 72 | 电池图标 | 2 | ||
4 | DD80 | 2880 | 72 | 72 | 电池图标 | 3 | ||
5 | 10600 | 2880 | 72 | 72 | 电池图标 | 4 | ||
6 | 12E80 | 2880 | 72 | 72 | 电池图标 | 5 | ||
7 | 15700 | 2880 | 72 | 72 | 电池图标 | 6 | ||
8 | 17F80 | 2880 | 72 | 72 | 电池图标 | 7 | ||
9 | 1A800 | 2880 | 72 | 72 | 电池图标 | 8 | ||
10 | 1D080 | 2880 | 72 | 72 | 电池图标 | 9 | ||
11 | 1F900 | 2880 | 72 | 72 | 电池图标 | 10 | ||
12 | 22180 | 2880 | 72 | 72 | 果汁图标 | 0 | ||
13 | 24A00 | 2880 | 72 | 72 | 果汁图标 | 1 | ||
14 | 27280 | 2880 | 72 | 72 | 果汁图标 | 2 | ||
15 | 29B00 | 2880 | 72 | 72 | 果汁图标 | 3 | ||
16 | 2C380 | 2880 | 72 | 72 | 果汁图标 | 4 | ||
17 号 | 2EC00 | 2880 | 72 | 72 | 果汁图标 | 5 | ||
18 | 31480 | 2880 | 72 | 72 | 果汁图标 | 6 | ||
19 | 33D00 | 6400 | 80 | 160 | 电子烟动画 | 0 | ||
20 | 3A100 | 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 | 5F900 | 6400 | 80 | 160 | 电子烟动画 | 7 | ||
27 | 65D00 | 6400 | 80 | 160 | 电子烟动画 | 8 | ||
28 | 6C100 | 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 | 8B500 | 6400 | 80 | 160 | 电子烟动画 | 14 | ||
34 | 91900 | 6400 | 80 | 160 | 电子烟动画 | 15 | ||
35 | 97D00 | 6400 | 80 | 160 | 插件背景1 | 未使用 | 16 | 1 |
36 | 9E100 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 0 | 1 |
37 | 9F8CA | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 1 | 1 |
38 | A1094 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 2 | 1 |
39 | A285E | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 3 | 1 |
40 | A4028 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 4 | 1 |
41 | A57F2 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 5 | 1 |
42 | A6FBC | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 6 | 1 |
43 | A8786 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 7 | 1 |
44 | A9F50 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 8 | 1 |
45 | AB71A | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 9 | 1 |
46 | ACEE4 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 10 | 1 |
47 | AE6AE | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 11 | 1 |
48 | AFE78 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 12 | 1 |
49 | B1642 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 13 | 1 |
50 | B2E0C | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 14 | 1 |
51 | B45D6 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 15 | 1 |
52 | B5DA0 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 16 | 1 |
53 | B756A | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 17 号 | 1 |
54 | B8D34 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 18 | 1 |
55 | BA4FE | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 19 | 1 |
56 | 英国广播公司8 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 20 | 1 |
57 | BD492 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 21 | 1 |
58 | BEC5C | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 22 | 1 |
59 | C0426 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 23 | 1 |
60 | C1BF0 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 24 | 1 |
61 | C33BA | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 25 | 1 |
62 | C4B84 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 26 | 1 |
63 | C634E | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 27 | 1 |
64 | C7B18 | 17CA | 35 | 87 | 标志擦拭 | 未使用 | 28 | 1 |
65 | C92E2 | 6400 | 80 | 160 | 插件背景2 | 未使用 | 0 | 1 |
66 | CF6E2 | F80 | 31 | 64 | 电池条动画 | 未使用 | 0 | 1 |
67 | D0662 | F80 | 31 | 64 | 电池条动画 | 未使用 | 1 | 1 |
68 | D15E2 | F80 | 31 | 64 | 电池条动画 | 未使用 | 2 | 1 |
69 | D2562 | F80 | 31 | 64 | 电池条动画 | 未使用 | 3 | 1 |
70 | D34E2 | F80 | 31 | 64 | 电池条动画 | 未使用 | 4 | 1 |
71 | D4462 | F80 | 31 | 64 | 电池条动画 | 未使用 | 5 | 1 |
72 | D53E2 | 6400 | 80 | 160 | 插件背景3 | 0 | ||
73 | DB7E2 | E9A | 21 | 89 | 充电器标志擦拭 | 0 | ||
74 | DC67C | E9A | 21 | 89 | 充电器标志擦拭 | 1 | ||
75 | DD516 | E9A | 21 | 89 | 充电器标志擦拭 | 2 | ||
76 | DE3B0 | E9A | 21 | 89 | 充电器标志擦拭 | 3 | ||
77 | DF24A | E9A | 21 | 89 | 充电器标志擦拭 | 4 | ||
78 | E00E4 | E9A | 21 | 89 | 充电器标志擦拭 | 5 | ||
79 | E0F7E | E9A | 21 | 89 | 充电器标志擦拭 | 6 | ||
80 | E1E18 | E9A | 21 | 89 | 充电器标志擦拭 | 7 | ||
81 | E2CB2 | E9A | 21 | 89 | 充电器标志擦拭 | 8 | ||
82 | E3B4C | E9A | 21 | 89 | 充电器标志擦拭 | 9 | ||
83 | E49E6 | E9A | 21 | 89 | 充电器标志擦拭 | 10 | ||
84 | E5880 | E9A | 21 | 89 | 充电器标志擦拭 | 11 | ||
85 | E671A | E9A | 21 | 89 | 充电器标志擦拭 | 12 | ||
86 | E75B4 | E9A | 21 | 89 | 充电器标志擦拭 | 13 | ||
87 | E844E | E9A | 21 | 89 | 充电器标志擦拭 | 14 | ||
88 | E92E8 | E9A | 21 | 89 | 充电器标志擦拭 | 15 | ||
89 | EA182 | E9A | 21 | 89 | 充电器标志擦拭 | 16 | ||
90 | EB01C | E9A | 21 | 89 | 充电器标志擦拭 | 17 号 | ||
91 | EBEB6 | E9A | 21 | 89 | 充电器标志擦拭 | 18 | ||
92 | ECD50 | E9A | 21 | 89 | 充电器标志擦拭 | 19 | ||
93 | EDBEA | E9A | 21 | 89 | 充电器标志擦拭 | 20 | ||
94 | 欧洲经济区84 | E9A | 21 | 89 | 充电器标志擦拭 | 21 | ||
95 | EF91E | E9A | 21 | 89 | 充电器标志擦拭 | 22 | ||
96 | F07B8 | E9A | 21 | 89 | 充电器标志擦拭 | 23 | ||
97 | F1652 | E9A | 21 | 89 | 充电器标志擦拭 | 24 | ||
98 | F24EC | E9A | 21 | 89 | 充电器标志擦拭 | 25 | ||
99 | F3386 | E9A | 21 | 89 | 充电器标志擦拭 | 26 | ||
100 | F4220 | E9A | 21 | 89 | 充电器标志擦拭 | 27 | ||
101 | F50BA | E9A | 21 | 89 | 充电器标志擦拭 | 28 | ||
102 | F5F54 | E9A | 21 | 89 | 充电器标志擦拭 | 29 | ||
103 | F6DEE | E9A | 21 | 89 | 充电器标志擦拭 | 30 | ||
104 | F8000 | 4 | 不适用 | 不适用 | 总吸烟时间 x0.01s (LSB->MSB) | 不适用 | 2 | |
105 | F8004 | 1 | 不适用 | 不适用 | Vape 使用中标志 (0xBB) | 不适用 | 3 |
其中包含两个 Python 脚本,可帮助将闪存转储拆分为 SPI 闪存中存储的各个映像并重新组装闪存转储: split-flashdump.py
和assemble-flashdump.py
。这些工具目前不执行格式转换(让 ChatGPT 帮助我到目前为止已经是一个漫长的过程),但在帮助创建自定义“主题”包方面大有帮助。未使用的资源可以从重新打包的闪存转储中删除,方法是将它们保留在包含要重新组装的文件的目录之外;这些未使用的区域将保留为 0xFF/已擦除字节。
重新打包程序assemble-flashdump.py
期望输入文件名具有特定格式,因为它使用十六进制编码的偏移量来确定将每个片段插入到 1MB 闪存转储文件中的位置(请参阅 split_map.csv 或包含的示例)主题,如下自定义主题包中所述):
{index}_{offset}_{width}x{height}_{category}_{sequence}.bin
19_33d00_80x160_vapeanim-0.bin
要转换 PNG 或 JPEG 图像,请使用前面提到的 UTFT 库的ImgConv.exe
工具:
ImgConv.exe *.png /r
ImgConv.exe *.jpg /r
ren *.raw *.bin
注意:在转换之前,请确保要转换为 .bin 格式的图片尺寸正确!
作为概念证明,包含了一个完成的 Windows 95 风格的主题包;它实现了电池和电量指示器、充电动画(仅插件背景 3 和充电器徽标擦除,因为这是测试固件中唯一使用的动画集)和 vaping 动画(3D 纵横比正确捕获)的所有资源管道屏幕保护程序)。所需要的只是访问 SPI 闪存以及对其重新编程的方法。这一概念的扩展空间可以通过通过 USB-C 端口连接的廉价 SWD USB 加密狗以及一些将小型重新编程工具上传到微控制器 RAM 的软件来实现,从而可能消除拆焊闪存芯片的需要。
还包括一个空白/可编辑模板。所有帧都通过动画的帧号来实现。
所有这些定制都可以在不接触微控制器固件的情况下实现!
如外部闪存布局,上面注释 2 和 3 中所述,用 0xFF 填充外部闪存位置 0xF8000-0xF8004 会将烟油计量器重置为满,从而允许在重新填充储液器后重新使用 vape。然后,需要通过将 nRST 引脚拉至地来重置微控制器本身,或者通过断开并重新连接电池来对其进行电源循环;如果您正在拆焊和重新焊接外部闪存以进行重新编程/修补,则可能已经发生这种情况。
微控制器使用行业标准串行线调试 (SWD) 调试/编程接口来读取/写入其固件和/或其内部 SRAM 存储器。 SWD接口通过电子烟的USB-C充电端口暴露出来。 SWDIO/SWCLK 线连接到正常 5.1k Rd 下拉电阻后面的 CC 引脚,因为连接器通常仅供电。
微控制器上的固件不受读出保护,因此通过反编译进一步研究固件是一种可能的途径。或许可以使用这个调试接口与外部Flash进行交互,但这还没有被研究过。
一些接受测试的 vape 主板在主板背面有 RX/TX 测试垫。目前尚未研究该端口如何与固件交互,和/或是否可用于更新外部闪存内容。
该电子烟由两块PCB板组成,通过9针0.15mm间距直角公排针连接在一起:
引脚 1 由电源板上的方形焊盘和逻辑板下侧(微控制器、SPI 闪存和 LCD 的相对侧)上的相应焊盘表示。警告:两块板之间的引脚 1 标记可能彼此相反!
电源板引脚 | 逻辑板引脚 | 姓名 | 功能 |
---|---|---|---|
1 | 9 | VBAT | 电源板上的电池正极 (+) |
2 | 8 | 总线总线 | +5V 来自电源板上的 USB-C 端口,带 SMD 保险丝,“B”标记 |
3 | 7 | 接地 | 电源/信号地 |
4 | 6 | 线圈_DRV | 来自逻辑板上 MCU 的加热器控制信号(高电平有效) |
5 | 5 | PUFF_DET | 来自电源板 vape 控制器的抽吸检测信号(注 1) |
6 | 4 | CC2/SWCLK | USB-C Rd 下拉 2/SWD 调试接口时钟到逻辑板上的 MCU |
7 | 3 | CC1/SWDIO | USB-C Rd 下拉 1/SWD 调试接口数据至逻辑板上的 MCU |
8 | 2 | 电源电压 | 从逻辑板上的 LDO 稳压器向 vape 控制器提供 3V 电源 |
9 | 1 | 线圈_检测? | 逻辑板上 MCU 的加热器线圈检测(参见注释 2) |
N32G01 系列微控制器在数据表中宣传为具有板载闪存加密和安全启动支持,但这一功能(值得庆幸的是)尚未在迄今为止测试的 vape(即 Kraze HD7K)上使用。
对固件本身进行逆向工程的工作并不多,但通过使用 Segger J-Link 及其相应的 J-Mem 软件(通过 SWD 调试/编程端口访问)可以获得闪存转储。与许多基于 Arm 的 MCU 一样,闪存位于 0x08000000,但也镜像到 0x00000000。固件转储是从地址 0x08000000-0x0800FFFF (64k) 获取的,粗略地浏览一下固件转储显示,实际仅使用了大约 50% 的闪存空间(从 0x8000 到 0xFFFF 之前的地址都是 0xFF 字节,指示已擦除/未编程的存储器)。固件转储中似乎不存在人类可读的字符串。
如果 USB-C 电源快速打开和关闭(但似乎不一致),屏幕上会显示“秘密”版本号。当尝试使用 Kraze HD7K 时,屏幕变黑,并且文本“GV-K23 0904V1”以红色显示在两行文本中几秒钟;它似乎是用 Windows 中 12 点大小的“系统”字体的等宽版本渲染的。这暗示内部产品名称为“GV-K”,固件版本为 1,日期为 2023 年 9 月 4 日。巧合的是,在所用闪存地址空间的末尾附近是一个填充了 0x00 和 0xE8E4 的字节块,其中看起来可疑地像黑色和红橙色像素数据。对该区域的原始数据的进一步分析证实,版本号存储为原始位图,而不是从文本字符串呈现(如下所述)。
在固件闪存转储内部,地址 0x7066-0x7E75 似乎是上述版本号的位图版本。它的大小似乎只有 60x30 像素,但该位图周围有 0x00 填充字节,未与 120 字节边界(60 像素)对齐,因此在不反编译固件和查找函数的情况下很难确定“真实”图像大小触发版本屏幕。
所有商标均为其各自所有者的财产。