Metadata-Version: 2.4
Name: unlocknd12
Version: 0.1.0
Summary: XTC Z12 儿童手表 oem 分区 DeviceInfo 解锁标志 patch 工具
License-Expression: AGPL-3.0-only
Keywords: xtc,z12,oem,deviceinfo,unlock,fastboot,qualcomm,sm6150
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Operating System :: OS Independent
Classifier: Topic :: System :: Boot
Classifier: Topic :: Utilities
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file

# unlocknd12

> XTC Z12 儿童手表（Qualcomm SM6150）`oem` 分区 DeviceInfo 解锁标志 patch 工具。
> A tiny, dependency-free CLI to flip the unlocked flags inside an `oem` partition dump.

`fastboot oem unlock` 在这台设备的 LK 与 ABL 全部被无条件拒绝（焊死的静态 gate），
因此只能直接改写 `oem` 分区里的 DeviceInfo cookie。本工具专为此场景设计：
**定位结构体、改标志位、输出可读报告**，不改动结构体以外的任何字节。

## DeviceInfo 结构（逆向所得）

| 偏移 | 字段 | 说明 |
|---|---|---|
| +0x00 | magic | 13 字节文本 `ANDROID-BOOT!` |
| +0x0d | `is_unlocked` | 0=locked，1=unlocked |
| +0x0e | `is_unlock_critical` | 解锁状态是否关键 |
| +0x0f | `is_tampered` | 是否被篡改 |

结构体总长 0xA50。LK 与 ABL 读取该分区时只验证魔数，无哈希/签名校验。

## 安装

```console
pip install unlocknd12
```

零依赖，需要 Python ≥ 3.10。

## 用法

```console
# 查看结构体与当前标志（不写任何文件）
unlocknd12 oem.img --dry-run

# 生成修改后的副本（默认不覆盖原文件）
unlocknd12 oem.img --out oem.unlocked.img

# 顺便把 is_unlock_critical 置 1、is_tampered 清 0
unlocknd12 oem.img --critical --tampered 0 --out oem.unlocked.img

# 若镜像里魔数被截断或有多处命中，显式指定偏移
unlocknd12 oem.img --offset 0x9a8 --out oem.unlocked.img
```

默认输出文件为 `<oem_img>.patched.img`。`--dry-run` 只预览改动；
`--in-place --force` 直接改写原文件（危险，仅在你有原始备份时使用）。

写盘后会重新读回校验魔数与 `is_unlocked`。

## 典型工作流

1. `adb shell "dd if=/dev/block/by-name/oem of=/sdcard/oem.img"` 或 9008 模式导出分区；
2. 运行本工具生成补丁镜像；
3. 用 9008 / root 写回 `oem` 分区（locked 状态下 `fastboot flash oem` 通常被禁）；
4. `fastboot oem device-info` 确认状态。

> 解锁状态 ≠ 关闭 secure boot：XBL 的 AVB 校验不因 cookie 放开，刷第三方镜像需另行处理。

## 开发

```console
pip install -e . pytest
pytest
```

## 许可

AGPL-3.0-only。本工具面向设备所有者的解锁/取证场景；请遵守当地法律与设备厂商条款。
