ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Play Integrity 判定如何修复?PlayIntegrityFix 原理与配置完整教程

Play Integrity 判定如何修复?PlayIntegrityFix 原理与配置完整教程

Play Integrity 判定如何修复?PlayIntegrityFix 原理与配置完整教程

【免费下载链接】PlayIntegrityFixFix Play Integrity (and SafetyNet) verdicts.项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix

PlayIntegrityFix 是一款面向 Android 8-15 设备的 Root 模块,用于修正 Play Integrity 校验结论,让银行与支付类应用不因 Root 状态被限制功能,适配 Magisk、KernelSU 与 APatch 环境。

PlayIntegrityFix 的 Zygisk 注入与属性拦截原理

模块由启动脚本和 Zygisk 组件构成,核心代码位于 app/src/main/cpp/,启动脚本位于 module/ 目录。Zygisk 是一种让模块代码随 App 进程一起运行的注入框架;模块通过 companion 进程把配置文件传给 App 进程,且只在com.google.android.gms.unstable(Google 服务中负责完整性校验的子进程)中执行真实注入,其余 App 进程加载后立即卸载模块库,把注入面压到最小。

篡改分三层进行:

  • 属性拦截(spoofProps):钩住__system_property_read_callback函数,对安全补丁、构建 ID、API 级别、ADB 状态等读取结果改写数值。这正是 Play Integrity 判定的主要输入,改完后 Play 服务端再通过系统属性读到解锁、Root 特征就难了。
  • Provider 与签名伪装(spoofProvider / spoofSignature):注入 Java dex(EntryPoint.java、CustomKeyStoreSpi.java),覆盖android.os.Build静态字段与应用签名读取逻辑。
  • 启动属性校正:post-fs-data.sh 与 service.sh 用 resetprop 回写ro.boot.flash.locked、ro.boot.verifiedbootstate等特征,并处理 DenyList 以及与其他伪装模块的冲突。

另外,代码会检测 TrickyStore 是否已安装(存在/data/adb/modules/tricky_store且未禁用),是的话自动关闭内置的属性与 Provider 伪装,把签名工作交给 TrickyStore。

PlayIntegrityFix 模块安装与判定验证步骤

前置条件:Root 环境已开启 Zygisk(Magisk 需在设置中打开;KernelSU、APatch 默认启用)。流程如下:

  1. 获取发行包 zip;若要本地重构源码,先克隆仓库再打包:
git clone https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix cd PlayIntegrityFix && ./gradlew assembleRelease
  1. 在 Magisk 或 KernelSU 应用中选择"本地安装",安装完成后重启。
  2. 每次启动时,module/action.sh 会尝试从 Pixel 官方通道抓取最新 Beta 指纹与安全补丁,写入/data/adb/pif.json,并强制结束 GMS 进程使其按新信息重载;联网失败时回退使用内置的 module/pif.json(当前为 Pixel 6,安全补丁 2025-04-05)。

重启后做三项验证:查看实际生效的配置、查看模块日志(日志 tag 为PIF)、核对指纹是否被改写:

cat /data/adb/pif.json logcat -s PIF getprop ro.build.fingerprint

pif.json 配置文件优先级与字段设置

companion 进程按以下顺序查找配置文件,先找到的生效:

配置路径优先级说明
/data/adb/pif.json1用户自定义文件,action.sh 会自动写入
/data/adb/modules/playintegrityfix/custom.pif.json2模块目录自定义文件,适合长期手动修改
/data/adb/modules/playintegrityfix/pif.json3内置默认文件,随版本更新刷新

常用字段:FINGERPRINT(设备指纹,代码要求恰好 8 段,解析为品牌、产品、设备、系统版本、构建 ID、构建号、构建类型、标签后写入 Build 字段)、SECURITY_PATCH、MANUFACTURER、MODEL、ID;布尔开关spoofProvider、spoofProps、spoofSignature分别控制三条篡改路径,DEBUG打开详细日志。不想手动编辑时,可以在 module/webroot/ 提供的设置页面中点 "Fetch pif.json" 按钮刷新指纹。

Android 13 以上 Device 判定的 TrickyStore 方案

这是 Play Integrity 政策上最大的版本分界。项目 README 明确:Android 13 及以上已移除旧版校验,Device 判定现在等价于旧版 Strong 级别。

  • Android 12 及以下:模块内置伪装目前基本可用。
  • Android 13 及以上:要通过至少 Device 判定,需要配合 TrickyStore 模块并提供有效 keybox(设备认证密钥文件),模块会自动检测并让位。
  • 用 PlayIntegrityFork 开启spoofVendingSdk可强制回退旧版校验,但 Play 商店可能故障甚至崩溃,作者仅建议有经验的开发者使用。
  • 若必须稳定通过认证且非进阶用户,README 给出的建议是刷回官方 ROM 并锁 Bootloader。

Play Integrity 修复失败时的日志排查方法

  • 启动抓取指纹失败:action.sh 失败时会提示网络问题或busybox模块冲突;若装了 BusyBox 类模块,先移除再重启。
  • 指纹解析报错:日志出现Error parsing fingerprint values时,说明FINGERPRINT不是标准 8 段格式,直接恢复默认文件即可。
  • 重启后判定不变:先确认/data/adb/pif.json非空且内容与系统版本段匹配,再排查是否有其他属性伪装模块互相覆盖。
  • 个别应用仍提示失败:部分应用使用 Play Integrity 之外的检测手段,此时需要配合 Root 隐藏方案,单靠本模块无法覆盖。

PlayIntegrityFix 维护与配置备份建议

三条可执行的事项:

  1. 保持模块与指纹同步更新:changelog.md 显示 v19.1 的更新内容即"Update fingerprint",说明指纹保鲜是长期性维护,建议每次大版本系统更新后重启一次让 action.sh 重新抓取。
  2. 修改pif.json前先备份原文件,一次只改一个字段,出问题能快速定位并回滚。
  3. 已安装 TrickyStore 时,注意代码会自动关闭内置的 spoofProvider/spoofProps,手动改配置时应了解这条让位规则,避免误判为模块失效。

【免费下载链接】PlayIntegrityFixFix Play Integrity (and SafetyNet) verdicts.项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进