No description
  • Go 93.5%
  • HTML 6.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
liyp 6dce11c804
All checks were successful
CI / test (push) Successful in 1m26s
docs: rewrite docs section in Chinese, fix encryptData.md missing from repo
- .gitignore 'encryptData*' also matched docs/encryptData.md, so the file
  never got committed; scope the pattern to the repo root instead
- drop FAQ.md / unlock_guide.md / docs index (covered by the README)
- add a Chinese encryptData principle section; switch the remaining doc
  link to an absolute Gitea URL (relative links 404 on the web UI)
2026-10-07 14:46:12 +08:00
.gitea/workflows mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
docs docs: rewrite docs section in Chinese, fix encryptData.md missing from repo 2026-10-07 14:46:12 +08:00
.gitignore docs: rewrite docs section in Chinese, fix encryptData.md missing from repo 2026-10-07 14:46:12 +08:00
captcha.html mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
fastboot.go mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
go.mod mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
go.sum mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
LICENSE mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
login.go mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
main.go mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
main_test.go mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
migate.go mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
README.md docs: rewrite docs section in Chinese, fix encryptData.md missing from repo 2026-10-07 14:46:12 +08:00
ui.go mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00
unlock.go mi-unlock-go: Go port of MiForge/MiUnlockTool + migate login library 2026-10-07 14:27:23 +08:00

mi-unlock-go

小米 Bootloader 解锁工具 MiForge/MiUnlockTool(含其登录库 offici5l/migate,均为 Apache-2.0)的 Go 移植版。登录小米账号 → 从官方解锁 API 换取 encryptData 签名 → fastboot stage + fastboot oem unlock 完成解锁。全平台单二进制,无 Python 依赖。

构建

go build -trimpath -ldflags="-s -w -X main.version=v0.1.0" -o mi-unlock-go .
go test ./...        # 含与 Python/openssl 独立实现的签名交叉验证

使用

mi-unlock-go                 # 默认浏览器登录
mi-unlock-go -terminal      # 终端账号密码登录(含验证码/2FA 短信或邮件)
mi-unlock-go -qr            # 扫码登录
mi-unlock-go -zone China    # 强制 dataCenterZone(一般自动识别,不用管)
mi-unlock-go -fastboot /path/to/fastboot

流程:登录账号(支持会话缓存,与 Python 版共用 ~/.migatesession/unlockApi/session.json)→ 自动识别账号区域与 dataCenterZone → 手机进 fastboot 模式(不是 fastbootd)插上电脑 → 工具读取 product 与设备 token → 服务器签名返回 encryptData → 自动 fastboot stage + oem unlock。

前提

  • 账号已在手机上完成绑定(设置 → 开发者选项 → Mi Unlock 状态 → 添加账号和设备),且 168 小时等待期已满——本工具不绕过等待期,与官方流程等价
  • 解锁会清除用户数据(工具会提前提示该机型是否清数据)
  • fastboot 在 PATH 中(Arch: pacman -S android-tools)

返回码对照(完整)

整理自原项目 miunlock-codes-reference.md(会持续更新)。

code 含义 常见原因 解决办法
10000 请求参数错误 deviceToken 或 product 无效 重启工具重试;确认使用最新版本
10013 设备未激活,请先激活 换过主板、IMEI 变更、分期购机、使用了自定义 DNS 关闭自定义 DNS;SIM 换到另一个卡槽;关闭并重新开启"查找手机";用移动数据(不要 Wi-Fi)在 小米账号→云服务 里开启"通话记录与消息"同步,再到 设置→小米账号→设备→当前设备 确认 SIM 显示已激活;开发者选项重新绑定账号。约 24 小时后仍不行就联系小米
10013 设备激活不足 7 天 SIM 卡尚未激活 同上一行的步骤;等满提示的时间(7 天,UTC+8)再跑
10013 设备激活时间太短 购机/激活还不满 7 天 等提示的小时数过去后再跑
10023 无法解锁更多设备 2025 年起每个账号每年只能解 1 台 换新账号,或等一年
20030 本月无法解锁更多设备 本月已经取过一次 encryptData 等下个月 1 日再试
20031 请在开发者选项中添加账号 账号未绑定 Mi Unlock 状态 开发者选项 → Mi Unlock 状态 → 同意 → 添加账号和设备;已绑定仍报错就在工具里手动指定 dataCenterZone
20033 账号无解锁权限,请换账号 账号因可疑行为被服务器风控 先尝试开启"查找设备";无效则换新账号
20035 请升级解锁工具 clientVersion 过旧 官方工具下最新版;本 Go 版的 clientVersion 写在 unlock.go(7.6.727.43),被拒时按服务器要求调高
20036 请在 *** 小时后再解锁 正常等待期,机型不同时长不同 到期再跑;期间不要在 MIUI 里重新添加账号,否则从头再等;若倒计时不减或重置为 144 小时,说明账号已被封,换号
20038 该手机已被账号 **** 通过查找手机锁定 设备被某账号定位锁定 用该账号登录 i.mi.com/mobile/find → 选中设备 → 关闭"定位设备"
20039 设备基础数据校验失败 deviceToken 不完整,缺少必需数据 暂无确认解法
20041 小米 ID 未绑定手机号 账号没有关联手机号 给账号绑定手机号;App 里没有入口就用这个链接:https://account.xiaomi.com/pass/serviceLogin?checkSafePhone=true
20045 请使用官网普通用户工具 服务器区域无效 工具里换 dataCenterZone
20045 账号注册地与手机销售地不符 账号区域和设备区域不匹配(例如国际账号解国行机) 用与设备同区域的账号:国行机用国行账号
30002 无法解锁,请到小米社区申请授权 账号未绑定 Mi Unlock 状态,或社区授权未通过 先确认已绑定;已绑定仍报错就手动指定 dataCenterZone,或按提示去小米社区申请

encryptData 签名原理

encryptData 是小米服务器对设备 deviceToken 的私钥签名,解锁的本质就是拿到一个对自己设备有效的签名。整个流程分三步:

  1. 取 deviceToken:通过 fastboot oem get_token(或 getvar token)从手机读取,内容包含固定版本号、机型代号(如 evergo)、CPU 唯一标识 cpuid 和一段随机数 RAND。RAND 每次开机都会重新生成,所以 token 每次重启都不同,encryptData 也随之失效——这就是为什么必须到期当天现取现签,没法提前准备。
  2. 服务器签名:工具把 deviceToken 连同 pcId(deviceId 的 MD5)、机型代号等信息发到 /api/v3/ahaUnlock。账号满足全部条件(已在手机上绑定本机、168 小时等待期满、月/年配额未超)时,服务器用只有它持有的私钥对 token 签名,返回 encryptData。
  3. 设备验签解锁:把签名转成二进制后 fastboot stage 写入手机,再执行 fastboot oem unlock;bootloader 用固件里内置的小米公钥验签,通过即标记为永久解锁。

这也解释了几个常见现象:为什么解锁必须用绑定了账号的同一台手机、为什么等待期没到会返回 20036、为什么到期当天不需要提前下载任何文件。

与 Python 版的差异

  • 单二进制、无 Python/pip 依赖;不支持 Termux 自动装 fastboot(自行安装)
  • 不自动下载 platform-tools(用 PATH 里的 fastboot)
  • 登录会话与 Python 版互通(同一路径、同一格式)
  • 签名/加密逻辑(HMAC-SHA1 → AES-128-CBC → SHA-1)与原版逐字节一致,单元测试用 Python/openssl 独立参考值锁定

许可

Apache-2.0。移植自 offici5l 的 MiUnlockTool 与 migate,版权归原作者所有。