4步装完 PlayIntegrityFix:让 Root 手机重新通过 Play Integrity 验证
【免费下载链接】PlayIntegrityFixFix Play Integrity (and SafetyNet) verdicts.项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix
PlayIntegrityFix 是一个 Magisk / KernelSU / APatch 通用模块,它在内存层伪装构建属性与设备身份,让 Android 8–15 的 Root 设备重新拿到 Play Integrity 的可用结论。如果你的银行 App、支付工具或游戏开始报"设备不安全",这篇文章按"检查环境 → 装模块 → 更新指纹 → 验证"的顺序带你走完全程。
🔍 痛点:银行 App 弹出"此设备未通过认证"之后
一个很典型的场景:手机 Root 之后,某银行 App 打开就提示"此设备未通过认证,无法使用",或者你用 Play Integrity 测试类应用一测,结果里写着MEET_DEVICE_INTEGRITY: false。
此时你大概率会想到旧的 safetynet-fix 模块——但这条路已经断了:
- 该模块已停止维护,且被 PlayIntegrityFix 标记为不兼容,装上会被下次开机自动移除;
- Google 在 Android 13 及以后移除了旧版检查路径,README 明确说明:现在 Device 结论等同于当年的 Strong 结论;
- 也就是说,Android 8–12 的老设备装个模块还能撑一阵,13+ 的设备光靠属性伪装不够,还要配合 keybox。
下面按实际安装时间线把整条流程走完。
⏱ 30秒原理:PlayIntegrityFix 做了什么
一句话:它是个 Zygisk 模块,只在 Play 服务进程(com.google.android.gms.unstable)启动时,把设备的"身份证"临时换成另一张。
类比一下:它不修车,只是在有人查证件的瞬间递出一张新名片。app/src/main/cpp/main.cpp里的实现印证了这一点:
- 只注入 Play 服务进程,其他 App 不受影响,用完即释放模块库;
- 属性层:hook
__system_property_read_callback,拦截security_patch、build.id、init.svc.adbd(改成stopped)、sys.usb.state(改成mtp)等敏感读值; - Java 层:改写
android.os.Build类字段,并替换 AndroidKeyStore 的 Provider; - 检测到
/data/adb/modules/tricky_store目录时,自动关闭属性与 Provider 伪装,把活交给 TrickyStore。
全程不改系统分区文件,重启后恢复原状。
🧭 完整上手流程:从环境检查到验证通过
第 1 步:确认系统版本与 Root 环境
先确认三件事:Android 版本、Magisk 是否可用、Zygisk 是否已开。
adb shell getprop ro.build.version.release adb shell magisk -v adb shell "ls /data/adb/modules/" | grep -Ei "zygisk|playintegrityfix"如果 Zygisk 未开启,在 Magisk 应用设置里打开,或安装 ZygiskNext / ReZygisk 模块——module/customize.sh在安装时会做同样的检查,未开启会直接中止安装。
第 2 步:安装模块
模块支持从 Magisk / KernelSU / APatch 应用安装,不支持从 recovery 刷入(脚本会直接 abort 并提示 "Install from recovery is NOT supported")。
从源码仓库获取的话,clone 后把整个目录打包成 zip 再本地安装:
git clone https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix安装前脚本还会做几件检查:低于 Android 8.0 直接拒绝;检测到safetynet-fix目录会自动标记移除;检测到playcurl会警告它可能用无效指纹覆盖配置;/data/adb/pif.json如已存在会先备份为.old。
第 3 步:重启并确认注入生效
重启后过滤日志标签PIF,能看到 hook 与属性改写记录(如init.svc.adbd: running -> stopped)即说明 Zygisk 注入成功:
adb logcat | grep "PIF"第 4 步:拉取最新设备指纹
仓库自带的pif.json是一份默认指纹(Pixel 6)。module/action.sh会访问 developer.android.com,抓取当前 Pixel Beta 版本列表、随机选一台设备、从 OTA 元数据里提取post-build指纹与security-patch-level,最后写入/data/adb/pif.json并杀掉 GMS 进程使其重读配置。
操作方式:在 Magisk 应用里打开本模块的 Web 界面,点击Fetch pif.json按钮(界面里还有 "Use preview fingerprint" 开关)。也可在设备端直接执行:
su -c "/data/adb/modules/playintegrityfix/action.sh"注意:此步骤需要能连通 dl.google.com;脚本检测到 busybox 模块冲突或网络不通时会明确报错并退出。
第 5 步:验证结果
用任意 Play Integrity 测试应用查看结论。Android 12 及以下,预期至少拿到 Device 级结论;Android 13+ 若只拿到 BASIC,属于正常现象,见下一节版本差异。
📋 版本差异速查
不同 Android 版本下 PlayIntegrityFix 的能力边界差异如下:
| 系统版本 | 仅装 PIF 能拿到 | 额外要求 | 备注 |
|---|---|---|---|
| Android 8–12 | BASIC / DEVICE | 无 | 旧检查路径仍在,README 称"暂时安全" |
| Android 13–15 | 通常仅 BASIC | TrickyStore + 有效 keybox | Device 结论等同旧 Strong |
| Android 13+(备选) | 旧版检查结论 | PlayIntegrityFork + spoofVendingSdk | 强制旧检查,Play Store 可能崩溃 |
| test-key 签名 ROM | 自动加强 | 无 | 模块自动开启签名伪装 |
另外一点差异在 Root 方案上:action.sh里对 KernelSU / APatch 环境会自动加 5 秒延时(KSU_NEXT 与 MMRL 不需要),首次运行脚本时看到短暂停顿属正常现象。
🛠 排错手册:5 个高频症状对照
| 症状 | 原因 | 修复 |
|---|---|---|
| 安装时提示 "Zygisk is not enabled" | Magisk 设置里 Zygisk 关闭 | 在 Magisk 中开启 Zygisk,或安装 ZygiskNext / ReZygisk |
| 刷入时报 "Install from recovery is NOT supported" | 模块不支持 recovery 环境安装 | 改从 Magisk / KernelSU / APatch 应用本地安装 |
| safetynet-fix 模块突然消失 | 与 PIF 不兼容,下次开机被自动移除 | 保持移除状态,不要再装回 |
| Android 13+ 测试只有 MEET_BASIC 通过 | Device 结论需要真实 keybox,属性伪装替代不了 | 安装 TrickyStore 并配置有效 keybox;PIF 会自动检测到它并退让 |
| Fetch pif.json 报 "Unable to connect to dl.google.com" | 网络不通或装了 busybox 模块导致下载工具冲突 | 检查设备网络;移除 busybox 模块后重试 |
⚙️ pif.json 字段逐个说
本节解决"指纹怎么改、改哪些字段有效"的问题。
配置文件按以下优先级取用(见main.cpp中companion()的读取顺序):/data/adb/pif.json> 模块目录下custom.pif.json> 模块内置pif.json。
各字段含义:
- FINGERPRINT:核心字段,格式为
brand/product/device:release/id/incremental:type/tags。程序会把它按/和:拆成 8 段,分别回填 BRAND、PRODUCT、DEVICE、RELEASE、ID、INCREMENTAL、TYPE、TAGS 到Build类;段数不等于 8 会报解析错误,所以不要手拼残缺字符串; - MANUFACTURER / MODEL:展示用字段,建议与指纹里的产品保持一致(如
google/oriole配Pixel 6),逻辑不一致容易被识别; - SECURITY_PATCH:安全补丁日期,是
*.security_patch属性被拦截后回填的值,建议定期用 Fetch 功能刷新; - 布尔开关(可选):spoofProvider(是否替换 KeyStore Provider)、spoofProps(是否 hook 属性读取)、spoofSignature(签名伪装,test-key ROM 会自动置真,普通 ROM 不必开)、DEBUG(输出详细日志)、DEVICE_INITIAL_SDK_INT(覆盖 api_level 类属性的读值)。
一份带默认值的配置参考(来自仓库module/pif.json):
{ "FINGERPRINT": "google/oriole_beta/oriole:16/BP22.250325.012/13467521:user/release-keys", "MANUFACTURER": "Google", "MODEL": "Pixel 6", "SECURITY_PATCH": "2025-04-05" }两条调优建议:
- 指纹和补丁日期尽量新,但 MODEL 要与 FINGERPRINT 指向同一台设备,否则
ro.product.model和指纹自相矛盾; - 装了 TrickyStore 就不要手动把 spoofProvider / spoofProps 改成
true——程序检测到 TrickyStore 目录存在时会强制关闭这两项,这是为了避免双重伪装打架。
⚠️ 边界与风险:先读这段再决定要不要上
技术边界。Android 13+ 上,Google 移除了旧版检查,README 的原话是"你现在需要一个有效 keybox 并配合 TrickyStore 模块,才能至少通过 Device 结论"。没有 keybox,PIF 只能保证 BASIC 层。作者对经验不足且必须拿到完整认证的用户,给出的建议是刷回官锁(stock ROM + 锁 Bootloader),而不是硬堆模块。
合规红线。这个模块的作用是让 Root 设备通过完整性校验,属于对 Google 校验机制的绕过。银行、支付类 App 依赖该校验做风控,用它规避风控检查可能触发账号限制,也可能违反 App 服务条款;个人环境自测与生产环境使用风险完全不同,自己权衡。
模块冲突点。安装脚本与运行逻辑中显式处理或警告过的冲突对象:
safetynet-fix:不兼容,下次开机自动移除;playcurl:可能用无效指纹覆盖配置,安装时会被警告;MagiskHidePropsConf:在 Android 8+ 已属过时模块,可能与 PIF 抢属性;- PixelPropsUtils(部分自定义 ROM 内置):
post-fs-data.sh会将其开关强制置 false 以避免冲突; - LeafOS 的 gmscompat 属性伪装:
persist.sys.spoof.gms会被置为 false; - busybox 类模块:影响 action.sh 的下载流程,拉指纹失败时先查它。
OEM 特判。post-fs-data.sh与service.sh里对三星(warranty_bit)、realme、OnePlus、小米(secureboot.lockstate,防变砖)等设备做了条件属性修正,resetprop_if_diff的写法保证只改不一致的值,不改系统文件。
📚 资源索引
- 仓库说明:README.md
- 版本与更新机制:update.json、changelog.md
- 默认配置文件:module/pif.json
- 属性伪装脚本:module/post-fs-data.sh、module/service.sh
- 指纹拉取脚本:module/action.sh
- 安装检查逻辑:module/customize.sh
- Zygisk 注入实现:app/src/main/cpp/main.cpp
- 模块 Web 界面(Fetch pif.json 入口):module/webroot/
- 源码获取:
git clone https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix
【免费下载链接】PlayIntegrityFixFix Play Integrity (and SafetyNet) verdicts.项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考