随着 Android 系统的不断迭代,系统对后台进程的管控越来越严格(如 PhantomProcessKiller、FGS 限制等)。到了 Android 16(API 36),传统的后台保活手段几乎全军覆没,“墓碑机制”更是让大量应用在后台乖乖休眠。
然而,在逆向分析某头部社交 APP 时,发现它依然能够在严苛的系统限制下实现“永生”。本文将深入剥析其保活链路,看看大厂是如何利用 Android 系统机制的白名单与底层特性,构建出一条完整的“冷启动 -> 提权 -> 死亡监听无限复活”的保活链的。
要实现保活,第一步是必须能在应用被强杀后重新唤醒。该 APP 巧妙地利用了 Android 的账户同步机制(Account SyncAdapter)。
APP 在 AndroidManifest 中注册了帐号认证与同步服务。即使应用被强杀且未设置自启动,系统也会为了执行定期的同步任务而主动冷启动应用进程。

通过逆向分析,发现 AuthenticationService 调用了 Authenticator 的 addAccount 来静默添加系统同步账户。

随后,GuardSyncService 调用了 GuardSyncAdapter 的 onPerformSync 来执行系统同步任务,最后试图调用 startService 来启动 PushServiceProxy。

但是这里出现了一个核心问题:在 API 36 中,后台直接使用 startService 来启动 Service 已经被系统严格限制并判定为无效。那么,APP 究竟是如何成功拉起 Service 的呢?


通过 adb 确认系统的 account 与同步定时任务信息。账户确实已经成功注册::
查看系统的运行信息,发现定时任务运行极为频繁(每小时都在稳定触发):
通过这一步,APP 成功拿到了第一张“免死金牌”,确保了进程有规律地被系统主动拉起。
既然 startService 在高版本失效,APP 必须寻找替代方案。
通过查看 APP 的 Service 运行信息,验证了猜想:PushServiceProxy 确实没有运行成功(被系统拦截)。但是,另一个名为 HotEventService 的服务却运行正常,并且其核心特征是 isBindService=true。
查看 HotEventService 的底层代码逻辑,发现它放弃了直接 start,而是巧妙地通过跨进程的 bindService 机制启动。只要 Client 端发起 Bind,系统就会拉起目标 Service 所在的进程。


至此,进程已经可以启动并在后台驻留。但如果用户手动划掉卡片,或者系统强杀进程怎么办?APP 祭出了最后的大招:底层 Binder 死亡监听 + ContentProvider 唤醒。
使用 FRIDA 对 APP 进行了注入调试,手动 KILL 掉目标进程后,发现进程几乎是瞬间自动重启。
追踪其调用链发现,在 AMBinderHolder 类中,APP 调用了底层的 linkToDeath 注册了 DeathRecipient(死亡通知接收器)。这是一种极其底层的 IPC 监控手段。


当进程还在存活时,守护类 GroundStateMonitorImpl 会对 com.sina.weibo.appmonitor.provider 这个 ContentProvider 发起查询操作,以此获取到目标进程的 Binder 代理对象。

AppMonitorProvider 返回的实际上是一个自定义的 IAppMonitorBinder。

核心复活逻辑:当内核发现目标进程(主进程或推送进程)消失时,Binder 驱动会立即向注册了 linkToDeath 的端回调 binderDied 方法。这个回调会瞬间触发 GroundStateMonitorImpl 再次发起对 Provider 的查询 (query)。而查询一个未启动的 ContentProvider,系统会主动拉起该 Provider 所在的进程。
这就形成了一个完美的死循环:进程被杀 -> 触发 binderDied -> 守护进程查询 Provider -> 系统拉起被杀进程 -> 重新绑定 linkToDeath -> 再次等待被杀。
AndroidManifest.xml
sync_adapter.xml
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 8小时前
被易之生生编辑
,原因: