對一些可充電一次性電子煙進行逆向工程,其中包括小型彩色 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 日。其中看起來可疑地像黑色和紅橙色像素數據。對該區域的原始資料的進一步分析證實,版本號儲存為原始位圖,而不是從文字字串呈現(如下所述)。
在韌體快閃記憶體轉儲內部,位址 0x7066-0x7E75 似乎是上述版本號的點陣圖版本。它的大小似乎只有60x30 像素,但該點陣圖周圍有0x00 填充字節,未與120 字節邊界(60 像素)對齊,因此在不反編譯固件和查找函數的情況下很難確定“真實”圖像大小觸發版本畫面。
所有商標均為其各自所有者的財產。