FahadBinHussain/samsung-ifg-decoder

GitHub: FahadBinHussain/samsung-ifg-decoder

一款用于解码三星旧款功能机固件中 IFG/QMG/IFEG/IM/QM 等专有图像格式并将其转换为 BMP/PNG 的开源 Python 命令行工具。

Stars: 1 | Forks: 0

# samsung-ifg-decoder [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/FahadBinHussain/samsung-ifg-decoder/actions/workflows/ci.yml) 开源的 Samsung IFG / QMG / IFEG / IM / QM 图像解码器,用于旧款手机固件资源。 本项目解码旧款功能机固件中使用的部分 Samsung `.ifg` 和 `.qmg` 图像。当前版本支持类型为 `0x65000001`、`0x95000100` 和 `0x150001xx` 的 `IFEG` 图像,版本为 `0x5D` 的 `IM` 图像,以及已观测到的版本为 `0x0B` 的 `QM` 图像,包含在 Samsung B5722 固件中发现的许多图像资源。 ## 状态 已支持: - `IFEG` 魔数:`49 46 45 47` - 类型:`0x65000001` - 类型:`0x95000100` - 类型族:`0x150001xx` - `IM` 魔数:`49 4D`,版本字节 `0x5D` - `QM` 魔数:`51 4D`,版本字节 `0x0B`,已观测到 A9LL、A9LL 动画、A9LL `use_extra_exception`、原始类型 `0x00` RGB565/无 alpha 通道的 A9LL,以及 W2 depth-2 流 - `--inspect` 会报告 `IM_0x5D` 近无损、alpha 平面和扩展头标志 - 在 QMG UI 条带中观测到的奇数像素计数 W2 资源 - 输出:24 位 `.bmp` 或 `.png` - 针对已观测到的 `QM_0x0B_A9LL` 和 `QM_0x0B_W2` alpha 平面,支持可选的 RGBA `.png` 输出 - 为已观测到的 `QM_0x0B_A9LL` 动画导出完整的 RGB 帧 - 单文件解码 - 针对 `.ifg` 和 `.qmg` 的文件夹/批量解码 - 可选:将 `240x960` 待机壁纸切分为 `240x320` 面板 尚不支持: - 已观测到的 A9LL 帧布局之外的其他 `QM` / QMG 版本和动画变体 - 真实的 `IM_0x5D` alpha 平面样本;目前尚未发现带有疑似 alpha 标志的 B5722 样本 - 将 BMP/JPG 重新编码回 IFG ## 环境要求 - Python 3.10 或更高版本 - 无需第三方 Python 包 ## 合成测试数据 `samples/synthetic` 文件夹包含用于公共测试和演示的微型手工构建 `.hex` 数据。它们涵盖了具有代表性的 `IM_0x5D`、A9LL QMG 和 W2 QMG 路径,且无需重新分发 Samsung 固件或解码后的资源。 ## 测试 运行合成回归测试套件: ``` python -m unittest discover -s tests ``` ## 用法 解码单个文件: ``` python samsung_ifg_decoder.py input.ifg output.bmp ``` 将单个文件解码为 PNG: ``` python samsung_ifg_decoder.py input.ifg output.png ``` 解码包含 `.ifg` 和 `.qmg` 文件的文件夹: ``` python samsung_ifg_decoder.py input_folder output_folder ``` 将文件夹解码为 PNG: ``` python samsung_ifg_decoder.py input_folder output_folder --format png ``` 递归解码文件夹: ``` python samsung_ifg_decoder.py input_folder output_folder --recursive ``` 在存在支持的 alpha 平面时写入 RGBA PNG: ``` python samsung_ifg_decoder.py input.ifg output.png --with-alpha ``` 导出已观测到的 A9LL QMG 动画中的每一帧: ``` python samsung_ifg_decoder.py input.qmg output.png --extract-animation-frames ``` 解码壁纸并将 `240x960` 待机图像切分为三个 `240x320` 面板: ``` python samsung_ifg_decoder.py input_folder output_folder --recursive --split-240x320-panels ``` 写入 CSV 清单: ``` python samsung_ifg_decoder.py input_folder output_folder --recursive --manifest decode_manifest.csv ``` 在不解码的情况下检查文件头: ``` python samsung_ifg_decoder.py input_folder --inspect --recursive --manifest inspect_manifest.csv ``` 在不输出图像的情况下分析解码诊断信息: ``` python samsung_ifg_decoder.py input_folder --analyze --recursive --manifest analyze_manifest.csv ``` 对于 A9LL QMG 文件,分析功能还会报告预期的控制、命令和原始流限制,并在当前流遍历超出切分点时发出警告。已观测到的 `use_extra_exception` A9LL 分支将使用其独立的原始/差分决策位路径进行解码和分析。 ## 各文件说明 - `samsung_ifg_decoder.py` 是解码器和命令行工具。 - `codec_tables.json` 包含解码器使用的功能查找表。 - `docs/format-notes.md` 记录了当前已知的格式信息。 - `samples/README.md` 说明了为何不包含固件样本。 ## B5722 壁纸结果示例 B5722 固件包含如下待机图像: - `Master/a/images/idle/idle_011.ifg` - `Master/a/images/idle/idle_021.ifg` - ... 这些属于 `IFEG_65000001`,通常为 `240x960` 尺寸。使用 `--split-240x320-panels` 导出适合手机屏幕尺寸的面板。 ## B5722 UI 资源示例 B5722 固件还包含许多 `IFEG_95000100`、`IFEG_150001xx`、`IM_0x5D` 和 `QM_0x0B` 图像,特别是微件、菜单、拨号盘和 UI 资源。它们可能是 `.ifg` 或 `.qmg` 文件,可使用相同的命令进行解码: ``` python samsung_ifg_decoder.py input.ifg output.png ``` ## 安全与法律声明 本仓库不包含 Samsung 固件、专有壁纸、解码后的资源、恶意软件样本、原始 Samsung 代码或第三方转换工具二进制文件。 用户必须提供自己的 `.ifg` / `.qmg` 文件。本项目旨在用于旧款手机固件资源的留存、互操作性和个人恢复。 ## 路线图 - 扩展 `QM` / QMG 版本覆盖范围,支持已观测到的 A9LL 帧记录之外的动画变体。 - 收集并解码真实的 `IM_0x5D` alpha 平面样本。 - 扩展可重新分发的合成测试数据覆盖范围,以涵盖更多边缘情况。 ## 贡献者 Contributors
标签:Python, 三星, 固件解析, 图像处理, 图像解码, 多媒体工具, 文件格式, 无后门, 逆向工具