首页
社区
课程
招聘
[原创]挑战 Android 墓碑机制:揭秘某头部社交 APP 永生背后的保活术
发表于: 13小时前 293

[原创]挑战 Android 墓碑机制:揭秘某头部社交 APP 永生背后的保活术

13小时前
293

随着 Android 系统的不断迭代,系统对后台进程的管控越来越严格(如 PhantomProcessKiller、FGS 限制等)。到了 Android 16(API 36),传统的后台保活手段几乎全军覆没,“墓碑机制”更是让大量应用在后台乖乖休眠。

然而,在逆向分析某头部社交 APP 时,发现它依然能够在严苛的系统限制下实现“永生”。本文将深入剥析其保活链路,看看大厂是如何利用 Android 系统机制的白名单与底层特性,构建出一条完整的“冷启动 -> 提权 -> 死亡监听无限复活”的保活链的。

要实现保活,第一步是必须能在应用被强杀后重新唤醒。该 APP 巧妙地利用了 Android 的账户同步机制(Account SyncAdapter)。

APP 在 AndroidManifest 中注册了帐号认证与同步服务。即使应用被强杀且未设置自启动,系统也会为了执行定期的同步任务而主动冷启动应用进程。

Account SyncAdapter

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

Account SyncAdapter

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

Account SyncAdapter

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

Account SyncAdapter

Account SyncAdapter

通过 adb 确认系统的 account 与同步定时任务信息。账户确实已经成功注册::

查看系统的运行信息,发现定时任务运行极为频繁(每小时都在稳定触发):

通过这一步,APP 成功拿到了第一张“免死金牌”,确保了进程有规律地被系统主动拉起。

既然 startService 在高版本失效,APP 必须寻找替代方案。

通过查看 APP 的 Service 运行信息,验证了猜想:PushServiceProxy 确实没有运行成功(被系统拦截)。但是,另一个名为 HotEventService 的服务却运行正常,并且其核心特征是 isBindService=true。

查看 HotEventService 的底层代码逻辑,发现它放弃了直接 start,而是巧妙地通过跨进程的 bindService 机制启动。只要 Client 端发起 Bind,系统就会拉起目标 Service 所在的进程。

HotEventService BindService

HotEventService BindService

至此,进程已经可以启动并在后台驻留。但如果用户手动划掉卡片,或者系统强杀进程怎么办?APP 祭出了最后的大招:底层 Binder 死亡监听 + ContentProvider 唤醒。

使用 FRIDA 对 APP 进行了注入调试,手动 KILL 掉目标进程后,发现进程几乎是瞬间自动重启。

追踪其调用链发现,在 AMBinderHolder 类中,APP 调用了底层的 linkToDeath 注册了 DeathRecipient(死亡通知接收器)。这是一种极其底层的 IPC 监控手段。

ContentProvider Binder

ContentProvider Binder

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

ContentProvider Binder

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

ContentProvider Binder

核心复活逻辑:当内核发现目标进程(主进程或推送进程)消失时,Binder 驱动会立即向注册了 linkToDeath 的端回调 binderDied 方法。这个回调会瞬间触发 GroundStateMonitorImpl 再次发起对 Provider 的查询 (query)。而查询一个未启动的 ContentProvider,系统会主动拉起该 Provider 所在的进程。

这就形成了一个完美的死循环:进程被杀 -> 触发 binderDied -> 守护进程查询 Provider -> 系统拉起被杀进程 -> 重新绑定 linkToDeath -> 再次等待被杀。

AndroidManifest.xml

sync_adapter.xml


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 8小时前 被易之生生编辑 ,原因:
收藏
免费 16
支持
分享
最新回复 (5)
雪    币: 530
活跃值: (2358)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
666
12小时前
0
雪    币: 2426
活跃值: (2610)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习一下
12小时前
0
雪    币: 5289
活跃值: (8226)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
666
11小时前
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
6666
11小时前
0
雪    币: 9
活跃值: (327)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
666
8小时前
0
游客
登录 | 注册 方可回帖
返回