Engenharia reversa de alguns vapes descartáveis recarregáveis que incluem um pequeno LCD TFT colorido (Raz TN9000/Kraze HD7K/etc.).
Mais atualizações podem ser encontradas em https://github.com/ginbot86/ColorLCDVape-RE
Alguns vaporizadores descartáveis no mercado incluem acessórios como uma tela LCD colorida e capacidade de recarga USB-C, mas são dispositivos descartáveis de uso único; isso torna esses dispositivos bastante prejudiciais do ponto de vista ecológico. Por outro lado, isso abre oportunidades para salvamento de hardware por hobbyistas/engenheiros, reutilizando o vape como está, recarregando-o com suco de vape fresco e reiniciando o medidor interno, ou mesmo customização editando as imagens integradas.
O vape específico pesquisado neste projeto tem vários nomes, mas o que foi pesquisado especificamente foi chamado de Kraze HD7K. No entanto, este vape também foi visto sob a marca “RAZ”, como o RAZ TN9000.
Os vaporizadores descartáveis geralmente usam baterias de íon-lítio sem qualquer circuito de proteção. Os curtos-circuitos podem dissipar quantidades descontroladas de energia, causando ferimentos pessoais e/ou danos materiais. Qualquer trabalho realizado nesses vapes é feito por sua conta e risco.
Foi determinado que existem múltiplas revisões de circuito desses vapes, que podem ter incompatibilidades que podem resultar em danos ao dispositivo se as versões forem incompatíveis. Verifique as conexões e a compatibilidade do firmware antes de prosseguir com qualquer modificação.
Além disso, o suco vape/"e-líquido" pode conter altas concentrações de nicotina, que é absorvida pela pele. O manuseio da parte interna do vape deve ser feito com luvas até que as partes internas estejam limpas de suco e/ou resíduos.
O trabalho de outras pessoas nesses vapes inclui, mas não está limitado a:
O trabalho realizado nos repositórios mencionados pode ou não ser baseado no trabalho realizado neste projeto; o objetivo é vincular projetos semelhantes na esperança de que mais esforços comunitários possam ser realizados nesses vapes.
O vape usa o seguinte hardware:
O vape usa um LCD IPS de 0,96 polegadas com resolução de 80x160, com um cabo flat-flex (FPC) de 13 pinos e 0,7 mm de passo que é soldado à placa principal do vape. Ele se conecta via SPI de 4 fios (dados, relógio, dados/comando, seleção de chip) e parece usar o controlador ST7735S. Ele ainda usa a mesma pinagem para monitores disponíveis comercialmente, como o Smart Prototyping #102106.
Alfinete | Nome | Função |
---|---|---|
1 | TP0/NC | Não utilizado |
2 | TP1/NC | Não utilizado |
3 | SDIN | Dados SPI para LCD |
4 | SCLK | Relógio SPI |
5 | RS | Lógica baixa = comando, alta = dados |
6 | /RST | Redefinir (ativo-baixo) |
7 | /CS | Seleção de chip (ativo-baixo) |
8 | GND | Fonte de alimentação/terra de sinal |
9 | NC | Não conectado |
10 | VDD | Fonte de alimentação (3,3 V) |
11 | LEDK | Cátodo de retroiluminação LED |
12 | LEDA | ânodo de retroiluminação LED |
13 | GND | Fonte de alimentação/terra de sinal |
Existem duas formas de memória Flash no vape: Flash interno no microcontrolador e 1 megabyte (8 megabits) de Flash SPI NOR externo. O primeiro contém o firmware, enquanto o segundo contém todas as imagens que aparecem no LCD, bem como o tempo total de utilização da bobina de aquecimento do vapor; este contador é usado para derivar o número de "barras" exibidas no medidor de suco vape. A análise do barramento de dados do LCD (veja a captura lógica .dsl usando DreamSourceLab DSView) sugere que o microcontrolador usa DMA (Direct Memory Access) para transmitir dados de imagem do Flash externo para o LCD, já que as transferências de dados ocorrem como pedaços contíguos de 4.096 bytes , correspondendo a uma única página NOR Flash. A análise da memória do microcontrolador indica que o buffer de memória DMA está nos endereços RAM 0x2000022C-0x2000062B.
Todas as imagens são armazenadas no Flash externo como bitmaps RGB565 brutos de 16 bits (ou seja, cada pixel ocupa 2 bytes de dados). Ferramentas de conversão, como ImageConverter565 da biblioteca UTFT da Rinky-Dink Electronics, podem ser usadas para converter formatos de imagem como JPEG/PNG em um arquivo binário bruto que pode ser corrigido no Flash externo no deslocamento correspondente. Não há metadados armazenados com as imagens brutas, portanto as dimensões da imagem devem ser fornecidas manualmente, conforme tabela abaixo.
Índice (#) | Deslocamento (Hex) | Comprimento (Hex) | Quadro H (px) | Quadro V (px) | Categoria | Não utilizado? | Seq (#) | Notas |
---|---|---|---|---|---|---|---|---|
0 | 0 | 6400 | 80 | 160 | Fundo | 0 | ||
1 | 6400 | 2880 | 72 | 72 | Ícone de bateria | 0 | ||
2 | 8C80 | 2880 | 72 | 72 | Ícone de bateria | 1 | ||
3 | B500 | 2880 | 72 | 72 | Ícone de bateria | 2 | ||
4 | DD80 | 2880 | 72 | 72 | Ícone de bateria | 3 | ||
5 | 10600 | 2880 | 72 | 72 | Ícone de bateria | 4 | ||
6 | 12E80 | 2880 | 72 | 72 | Ícone de bateria | 5 | ||
7 | 15700 | 2880 | 72 | 72 | Ícone de bateria | 6 | ||
8 | 17F80 | 2880 | 72 | 72 | Ícone de bateria | 7 | ||
9 | 1A800 | 2880 | 72 | 72 | Ícone de bateria | 8 | ||
10 | 1D080 | 2880 | 72 | 72 | Ícone de bateria | 9 | ||
11 | 1F900 | 2880 | 72 | 72 | Ícone de bateria | 10 | ||
12 | 22180 | 2880 | 72 | 72 | Ícone de suco | 0 | ||
13 | 24A00 | 2880 | 72 | 72 | Ícone de suco | 1 | ||
14 | 27280 | 2880 | 72 | 72 | Ícone de suco | 2 | ||
15 | 29B00 | 2880 | 72 | 72 | Ícone de suco | 3 | ||
16 | 2C380 | 2880 | 72 | 72 | Ícone de suco | 4 | ||
17 | 2EC00 | 2880 | 72 | 72 | Ícone de suco | 5 | ||
18 | 31480 | 2880 | 72 | 72 | Ícone de suco | 6 | ||
19 | 33D00 | 6400 | 80 | 160 | Animação de vaporização | 0 | ||
20 | 3A100 | 6400 | 80 | 160 | Animação de vaporização | 1 | ||
21 | 40500 | 6400 | 80 | 160 | Animação de vaporização | 2 | ||
22 | 46900 | 6400 | 80 | 160 | Animação de vaporização | 3 | ||
23 | 4CD00 | 6400 | 80 | 160 | Animação de vaporização | 4 | ||
24 | 53100 | 6400 | 80 | 160 | Animação de vaporização | 5 | ||
25 | 59500 | 6400 | 80 | 160 | Animação de vaporização | 6 | ||
26 | 5F900 | 6400 | 80 | 160 | Animação de vaporização | 7 | ||
27 | 65D00 | 6400 | 80 | 160 | Animação de vaporização | 8 | ||
28 | 6C100 | 6400 | 80 | 160 | Animação de vaporização | 9 | ||
29 | 72.500 | 6400 | 80 | 160 | Animação de vaporização | 10 | ||
30 | 78900 | 6400 | 80 | 160 | Animação de vaporização | 11 | ||
31 | 7ED00 | 6400 | 80 | 160 | Animação de vaporização | 12 | ||
32 | 85100 | 6400 | 80 | 160 | Animação de vaporização | 13 | ||
33 | 8B500 | 6400 | 80 | 160 | Animação de vaporização | 14 | ||
34 | 91900 | 6400 | 80 | 160 | Animação de vaporização | 15 | ||
35 | 97D00 | 6400 | 80 | 160 | Plano de fundo do plug-in 1 | Não utilizado | 16 | 1 |
36 | 9E100 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 0 | 1 |
37 | 9F8CA | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 1 | 1 |
38 | A1094 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 2 | 1 |
39 | A285E | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 3 | 1 |
40 | A4028 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 4 | 1 |
41 | A57F2 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 5 | 1 |
42 | A6FBC | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 6 | 1 |
43 | A8786 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 7 | 1 |
44 | A9F50 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 8 | 1 |
45 | AB71A | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 9 | 1 |
46 | ACE4 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 10 | 1 |
47 | AE6AE | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 11 | 1 |
48 | AFE78 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 12 | 1 |
49 | B1642 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 13 | 1 |
50 | B2E0C | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 14 | 1 |
51 | B45D6 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 15 | 1 |
52 | B5DA0 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 16 | 1 |
53 | B756A | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 17 | 1 |
54 | B8D34 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 18 | 1 |
55 | BA4FE | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 19 | 1 |
56 | BBCC8 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 20 | 1 |
57 | BD492 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 21 | 1 |
58 | BEC5C | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 22 | 1 |
59 | C0426 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 23 | 1 |
60 | C1BF0 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 24 | 1 |
61 | C33BA | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 25 | 1 |
62 | C4B84 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 26 | 1 |
63 | C634E | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 27 | 1 |
64 | C7B18 | 17CA | 35 | 87 | Limpeza de logotipo | Não utilizado | 28 | 1 |
65 | C92E2 | 6400 | 80 | 160 | Plano de fundo do plug-in 2 | Não utilizado | 0 | 1 |
66 | CF6E2 | F80 | 31 | 64 | Animação de barras de bateria | Não utilizado | 0 | 1 |
67 | D0662 | F80 | 31 | 64 | Animação de barras de bateria | Não utilizado | 1 | 1 |
68 | D15E2 | F80 | 31 | 64 | Animação de barras de bateria | Não utilizado | 2 | 1 |
69 | D2562 | F80 | 31 | 64 | Animação de barras de bateria | Não utilizado | 3 | 1 |
70 | D34E2 | F80 | 31 | 64 | Animação de barras de bateria | Não utilizado | 4 | 1 |
71 | D4462 | F80 | 31 | 64 | Animação de barras de bateria | Não utilizado | 5 | 1 |
72 | D53E2 | 6400 | 80 | 160 | Plano de fundo do plug-in 3 | 0 | ||
73 | DB7E2 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 0 | ||
74 | DC67C | E9A | 21 | 89 | Limpeza do logotipo do carregador | 1 | ||
75 | DD516 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 2 | ||
76 | DE3B0 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 3 | ||
77 | DF24A | E9A | 21 | 89 | Limpeza do logotipo do carregador | 4 | ||
78 | E00E4 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 5 | ||
79 | E0F7E | E9A | 21 | 89 | Limpeza do logotipo do carregador | 6 | ||
80 | E1E18 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 7 | ||
81 | E2CB2 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 8 | ||
82 | E3B4C | E9A | 21 | 89 | Limpeza do logotipo do carregador | 9 | ||
83 | E49E6 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 10 | ||
84 | E5880 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 11 | ||
85 | E671A | E9A | 21 | 89 | Limpeza do logotipo do carregador | 12 | ||
86 | E75B4 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 13 | ||
87 | E844E | E9A | 21 | 89 | Limpeza do logotipo do carregador | 14 | ||
88 | E92E8 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 15 | ||
89 | EA182 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 16 | ||
90 | EB01C | E9A | 21 | 89 | Limpeza do logotipo do carregador | 17 | ||
91 | EBEB6 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 18 | ||
92 | DCE50 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 19 | ||
93 | EDBEA | E9A | 21 | 89 | Limpeza do logotipo do carregador | 20 | ||
94 | EEE84 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 21 | ||
95 | EF91E | E9A | 21 | 89 | Limpeza do logotipo do carregador | 22 | ||
96 | F07B8 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 23 | ||
97 | F1652 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 24 | ||
98 | F24EC | E9A | 21 | 89 | Limpeza do logotipo do carregador | 25 | ||
99 | F3386 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 26 | ||
100 | F4220 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 27 | ||
101 | F50BA | E9A | 21 | 89 | Limpeza do logotipo do carregador | 28 | ||
102 | F5F54 | E9A | 21 | 89 | Limpeza do logotipo do carregador | 29 | ||
103 | F6DEE | E9A | 21 | 89 | Limpeza do logotipo do carregador | 30 | ||
104 | F8000 | 4 | N / D | N / D | Tempo total de vaporização x0,01s (LSB->MSB) | N / D | 2 | |
105 | F8004 | 1 | N / D | N / D | Bandeira Vape em uso (0xBB) | N / D | 3 |
Dois scripts Python foram incluídos para ajudar na divisão e remontagem do dump do Flash nas/das imagens individuais armazenadas no SPI Flash: split-flashdump.py
e assemble-flashdump.py
. As ferramentas atualmente não realizam conversão de formato (conseguir que o ChatGPT me ajude até aqui já foi um processo longo), mas ajudam muito na criação de pacotes de "temas" personalizados. Os recursos não utilizados podem ser removidos do dump Flash reempacotado, mantendo-os fora do diretório que contém os arquivos a serem remontados; essas regiões não utilizadas permanecerão como 0xFF/bytes apagados.
O repacker, assemble-flashdump.py
, espera que os nomes dos arquivos de entrada tenham um formato específico, pois usa o deslocamento codificado em hexadecimal para determinar onde inserir cada peça no arquivo de despejo Flash de 1 MB (consulte split_map.csv ou o exemplo incluído tema, descrito abaixo em Pacotes de temas personalizados ):
{index}_{offset}_{width}x{height}_{category}_{sequence}.bin
19_33d00_80x160_vapeanim-0.bin
Para converter imagens PNG ou JPEG, use a ferramenta ImgConv.exe
da biblioteca UTFT mencionada anteriormente:
ImgConv.exe *.png /r
ImgConv.exe *.jpg /r
ren *.raw *.bin
Nota: certifique-se de que as imagens a serem convertidas para o formato .bin tenham as dimensões corretas ANTES de convertê-las!
Como prova de conceito, um pacote temático finalizado no estilo do Windows 95 está incluído; ele implementa todos os recursos para os indicadores de bateria e suco, animação de carregamento (apenas plugin background 3 e limpeza do logotipo do carregador, já que esse é o único conjunto de animação usado com o firmware testado) e animação vaping (uma captura correta da proporção de aspecto do 3D Protetor de tela de tubos). Basta ter acesso ao SPI Flash e um meio de reprogramá-lo. O espaço para extensão deste conceito poderia ser através de um dongle USB SWD barato, conectado através da porta USB-C, e algum software que carregue uma pequena ferramenta de reprogramação na RAM do microcontrolador, potencialmente eliminando a necessidade de dessoldar o chip Flash.
Um modelo em branco/editável também foi incluído. Todos os quadros são implementados com números de quadros para animações.
Toda essa customização é possível sem mexer no firmware do microcontrolador!
Conforme descrito em Layout de memória Flash externa , notas 2 e 3 acima, preencher locais Flash externos 0xF8000-0xF8004 com 0xFF redefinirá o medidor de suco para cheio, permitindo a reutilização do vape assim que o reservatório for recarregado. O próprio microcontrolador precisa então ser reinicializado puxando o pino nRST para o terra ou desligando-o e ligando-o desconectando e reconectando a bateria; isso provavelmente já terá acontecido se alguém estiver dessoldando e resoldando o Flash externo para reprogramação/correção.
O microcontrolador usa a interface de depuração/programação Serial Wire Debug (SWD) padrão da indústria para ler/gravar seu firmware e/ou sua memória SRAM interna. A interface SWD é exposta através da porta de carregamento USB-C do vape. As linhas SWDIO/SWCLK são conectadas aos pinos CC atrás dos resistores suspensos normais de 5,1k Rd, já que o conector normalmente é somente de alimentação.
O firmware no microcontrolador não é protegido contra leitura, portanto, pesquisas adicionais sobre o firmware por meio de descompilação são um caminho possível. Pode ser possível usar esta interface de depuração para interagir com o Flash externo, mas isso ainda não foi pesquisado.
Algumas das placas-mãe vape testadas tinham placas de teste RX/TX na parte traseira da placa. Ainda não foi pesquisado como esta porta interage com o firmware, e/ou se pode ser usada para atualizar o conteúdo Flash externo.
O vape é composto de dois PCBs, unidos por um conector macho de ângulo reto de 9 pinos e 0,15 mm de passo:
O pino 1 é indicado por um bloco quadrado na placa de alimentação e um bloco correspondente na parte inferior da placa lógica (lado oposto do microcontrolador, SPI Flash e LCD). AVISO: As marcações do pino 1 podem estar opostas entre as duas placas!
Pino da placa de alimentação | Pino da placa lógica | Nome | Função |
---|---|---|---|
1 | 9 | VBAT | Positivo da bateria (+) na placa de alimentação |
2 | 8 | VBUS | +5V da porta USB-C na placa de alimentação com fusível SMD, marcação "B" |
3 | 7 | GND | Aterramento de energia/sinal |
4 | 6 | COIL_DRV | Sinal de controle do aquecedor do MCU na placa lógica (ativo-alto) |
5 | 5 | PUFF_DET | Sinal de detecção de sopro do controlador vape da placa de alimentação (nota 1) |
6 | 4 | CC2/SWCLK | USB-C Rd pulldown 2 / relógio de interface de depuração SWD para MCU na placa lógica |
7 | 3 | CC1/SWDIO | USB-C Rd pulldown 1 / dados de interface de depuração SWD para MCU na placa lógica |
8 | 2 | VDD | Alimentação de 3V do regulador LDO na placa lógica para o controlador vape |
9 | 1 | COIL_DET? | Detecção da bobina do aquecedor para MCU na placa lógica (ver nota 2) |
A série de microcontroladores N32G01 é anunciada na folha de dados como tendo criptografia Flash integrada e suporte de inicialização segura, mas esse recurso (felizmente) não é usado no (s) vape (s) testado (s) até agora (ou seja, o Kraze HD7K).
Não foi feito muito trabalho na engenharia reversa do firmware em si, mas um flash dump foi obtido com o uso de um Segger J-Link e seu software J-Mem correspondente, acessado através da porta de depuração/programação SWD. Como muitos MCUs baseados em Arm, o Flash está localizado em 0x08000000, mas também é espelhado em 0x00000000. Um despejo do firmware foi obtido dos endereços 0x08000000-0x0800FFFF (64k), e uma rápida olhada no despejo do firmware mostra que apenas aproximadamente 50% do espaço Flash foi realmente usado (os endereços de pouco antes de 0x8000 a 0xFFFF eram todos bytes 0xFF, indicando memória apagada/não programada). Nenhuma string legível parece estar presente no dump do firmware.
Um número de versão “secreto” é exibido na tela se a alimentação USB-C for ligada e desligada rapidamente (mas parece ocorrer de forma inconsistente). Quando tentado com um Kraze HD7K, a tela fica preta e o texto “GV-K23 0904V1” é exibido em vermelho em duas linhas de texto por alguns segundos; parece ser renderizado com uma versão monoespaçada da fonte "System" de tamanho 12 pontos do Windows. Isso sugere um nome de produto interno "GV-K" e o firmware sendo revisão 1, datado de 4 de setembro de 2023. Coincidentemente, perto do final do espaço de endereço Flash usado está um bloco de bytes preenchido com 0x00 e 0xE8E4, que parece suspeitamente com dados de pixel preto e vermelho-laranja. Uma análise mais aprofundada dos dados brutos desta região confirma que o número da versão é armazenado como um bitmap bruto e não renderizado a partir de uma sequência de texto (explicado abaixo).
Dentro do dump Flash do firmware, nos endereços 0x7066-0x7E75, parece haver uma versão bitmap do número de versão mencionado acima. Parece ter apenas 60x30 pixels de tamanho, mas há bytes de preenchimento 0x00 em torno deste bitmap que não se alinham aos limites de 120 bytes (60 pixels), dificultando a determinação do tamanho "verdadeiro" da imagem sem descompilar o firmware e encontrar a função que aciona a tela de versão.
Todas as marcas registradas são propriedade de seus respectivos proprietários.