eduard-sukharev/TJC-firmware-reverse-engineering

GitHub: eduard-sukharev/TJC-firmware-reverse-engineering

针对 Creality Ender-3 V3 SE 3D 打印机 LCD 固件进行逆向工程,解压并提取图形资源。

Stars: 0 | Forks: 0

# TJC/Nextion 显示固件逆向工程 针对 Creality Ender-3 V3 SE 3D 打印机 LCD 显示屏的 Nextion/TJC TFT 固件逆向工程。 LCD 屏幕型号为 **TJC3224T132_011N_P04**,最接近的公开可购买型号是 **TJC3224T132_011N_I_A01**。TJC 是 Nextion 的中国克隆版本。 ## 背景 该项目的主要目标是:能够修改 LCD 屏幕固件功能。次要目标更为实际:允许提取和更新原始固件中的图形资源。 原始固件文件 (`tjc.tft`,7.48 MB) 来自 Ender-3 V3 SE 的 LCD 控制器。 ## 逆向工程资料来源 本逆向工程大量借鉴以下来源: ### 主要参考 - **[nxt-doc](https://github.com/UNUF/nxt-doc)** - 关于 Nextion/TJC 固件结构的全面文档。该仓库是理解 TFT 文件格式和资源解析的基础参考。当前的 TFT.md 文件是其工作的分支。 - **[TJC3224 Reverse Engineering](https://jpcurti.github.io/E3V3SE_display_klipper/tjc3224_reverse_engineering.html)** - 包含针对 E3V3SE 显示的 TJC 固件内部详细 walkthrough。对理解引导加载程序头结构和资源表至关重要。 ### 荣誉提及 - **[Ender-3V3-SE](https://github.com/navaismo/Ender-3V3-SE)** - 原始固件的社区分支,引发了关于 Ender-3 V3 SE 显示固件的这项研究。 ## 为何这仍在进行中 逆向工程 TJC 固件是一项持续的工作,原因如下: 1. **专有压缩** - TJC 使用未文档化的基于半字节的游程编码。虽然基本算法已被破解,但边界情况和不同压缩模式仍在分析中。 2. **变化的图像格式** - 并非所有图像都使用相同的压缩方案。有些图像可能以未压缩 (RAW RGB565) 存储,其他使用半字节-RLE 算法,可能还有尚未发现的变体。 3. **无官方文档** - TJC 未发布任何固件规范。所有知识均从逆向工程二进制文件得出,并与显示器的已知良好图像进行比较。 4. **对齐伪影** - 某些提取的图像显示块错位问题,表明可能存在尚未完全考虑的额外头或控制字节。 ## AI 辅助研究 本逆向工程项目通过与 **OpenCode Zen** 及其免费模型的对话显著推进: - **MiniMax M2.5 Free** - 主要推理和算法发现 - **Nemotron 3 Super Free** - 模式分析和假设优化 - **BigPickle** - 额外见解和验证 这些模型帮助分析了二进制数据,识别压缩块中的模式,并推导半字节-RLE 解压缩算法。 ## 项目结构 ``` TJC_display/ tjc.tft - Main firmware (7.48 MB) tjc_decompress.py - Core decompression module extract_image_102x115.py - Example extraction script print_resource_table.py - Resource table parser resource_table.txt - Parsed resource table output extracted/ - Extracted images output directory ``` ### 关键文件 | 文件 | 描述 | |------|-------------| | `tjc_decompress.py` | 基于半字节的 RLE 解压缩与 PNG 创建 | | `extract_image_102x115.py` | 提取并解压缩 102x115 图像的脚本 | | `print_resource_table.py` | 解析并打印固件中的所有资源 | ## 用法 ### 提取特定图像 ``` python3 extract_image_102x115.py ``` 这将提取 102x115 图像(主屏幕第一个图标,“打印”)并保存为 `extracted/image_102x115.png`。 ### 解析资源表 ``` python3 print_resource_table.py ``` 这将解析资源表并输出所有条目的尺寸、大小和偏移量。 ### 使用解压缩模块 ``` from tjc_decompress import decompress_and_create_image # 解压缩图像数据(包括20字节资源头) img = decompress_and_create_image(compressed_data, width, height) # 或者使用单个函数 from tjc_decompress import decompress_image_data, rgb565_to_rgb pixels = decompress_image_data(compressed_data) ``` ## 压缩算法 TJC 专有压缩使用基于半字节的游程编码: ### 块结构(每块 20 字节) - **字节 0-3**:控制(4 字节)= 8 个半字节(重复计数) - **字节 4-19**:8 个 RGB565 像素值(16 字节) ### 解压缩过程 1. 每个控制字节拆分为 2 个半字节 → 共 8 个半字节 2. 每个半字节 = 对应像素的重复计数 3. 半字节值:0-15(表示重复该像素的次数) 4. 对于半字节为 [n0,n1,n2,n3,n4,n5,n6,n7] 且像素为 [p0,p1...p7] 的块: - 输出:p0 重复 n0 次,p1 重复 n1 次,以此类推 ### 资源头(每资源 20 字节) 每个压缩资源具有 20 字节的头: - **字节 0**:压缩标志(0x00 = RAW,0x04 = COMPRESSED) - **字节 1-19**:其他元数据 ## 关键偏移量 - **引导加载程序头**:`0x010000`(12 个条目 × 12 字节 = 144 字节) - 条目 0-8:二进制组件(引导加载程序、资源、用户代码) - 条目 7:最大组件 = 资源/图像块(7.1 MB) - 条目 8:用户代码部分(54 KB) - **资源/图像表**:`0x38cf4` - 条目大小:24 字节 - 总条目数:2,628 - 条目格式:`magic2(4) | id(4) | rel_offset(4) | width(2) | height(2) | size(4) | extra(4)` ## 依赖项 - Python 3 - Pillow (PIL) ## 许可证 本项目仅用于教育和研究目的。所有固件文件归其各自所有者所有。
标签:3D打印机固件, Creality Ender-3 V3 SE, LCD显示固件, Nextion 逆向, nibble RLE, TJC3224T132, TJC TFT, 压缩算法分析, 固件文件格式, 固件更新, 固件逆向工程, 图形资源解析, 嵌入式逆向, 开源研究, 引导加载程序分析, 技术文档, 显示控制器, 自定义压缩, 资源提取, 逆向工具