Swift Clean v1.0.9 权限与后台机制拆包报告#
样本:
com.swiftclean.phone.managerprov1.0.9 (11)
文档日期:2026-10-12
标签:[S1]静态直接证据;[I]合理判断;[U]运行时/线上未验证。
1. 结论先行#
[S1]合并 Manifest 声明 29 项uses-permission。真正支撑自有核心功能的高敏入口是 All files access(所有文件访问)、Usage Access(使用情况访问)、Notification Listener Access(通知使用权)和 Notification permission(通知权限)。[S1]后台体系是多路冗余:启动 ContentProvider → 前台服务 → 启动失败短 Job 兜底,同时装配日式 Alarm、15 分钟 WorkManager、15 分钟持久 Job、Boot/package replaced 接收器、系统事件广播、FCM 与生命周期回前台。[S1]后台装配受通知可用状态控制:qf.u.b()先创建 Channel,随后只有通知权限/通知开关可用时,才启动前台服务并注册主要调度与广播。[I]这能提高进程被回收后的恢复机会,但不是“永久保活”。Android/OEM 后台限制、用户关闭通知、电量优化和 Force Stop 都可能阻断;静态代码不能证明长期存活[U]。[S1]Alarm 使用AlarmManager.set(type=2, ...)。Android 常量 2 是ELAPSED_REALTIME_WAKEUP:具 wakeup 属性;但调用是非 exactset(),触发时间可能漂移,不能写成精确闹钟。
2. 29 项 uses-permission 全表#
| 权限 | 自有功能/依赖映射 | 静态结论与边界 |
|---|---|---|
INTERNET |
自有后端、Firebase、Adjust、TradPlus/广告 | [S1] 明确使用网络;目的/数据量需抓包 [U] |
ACCESS_NETWORK_STATE |
网络切换通知、广告/SDK 网络判断 | [S1] uf/c.java:54-70 |
ACCESS_WIFI_STATE |
网络工具、广告/SDK | [S1] 已声明;自有核心调用未完整定位 [U] |
PACKAGE_USAGE_STATS |
App 最近使用、缓存/App/流量分析 | [S1] tf/b.java:45-58;属于 Settings 特殊访问,不是普通弹窗权限 |
REQUEST_DELETE_PACKAGES |
App Manager 卸载入口 | [S1] AppListPage.java:230-237 调系统 ACTION_DELETE;不是静默卸载 |
MANAGE_EXTERNAL_STORAGE |
缓存/大文件/截图/相似照片扫描 | [S1] MainPage.java:322-341,494-503 检查 isExternalStorageManager();需系统设置授权 |
WRITE_EXTERNAL_STORAGE |
旧 Android 文件访问兼容 | [S1] 低版本分支检查;target 36 下受平台限制,效果需版本矩阵 [U] |
READ_EXTERNAL_STORAGE |
旧 Android 媒体/文件读取兼容 | [S1] 已声明;target 36 下行为受分区存储与新媒体权限规则影响 [U] |
GET_PACKAGE_SIZE |
可能服务于 App/缓存大小 | [S1] 已声明;未找到自有直接调用,且现代 Android 对普通 App 受限 [U] |
CLEAR_APP_CACHE |
缓存清理声明 | [S1] 已声明;未找到普通 App 可直接清他包缓存的可靠自有调用,不能据声明认定有效 [U] |
DELETE_CACHE_FILES |
缓存清理声明 | 同上 [S1/U] |
READ_NETWORK_USAGE_HISTORY |
按 UID 网络流量 | [S1] NetworkStatsManager.queryDetailsForUid(),tf/f1.java:66-85;仍依赖 Usage Access/系统能力 |
READ_PHONE_STATE |
可能来自广告/设备 SDK | [S1] 已声明;未定位自有业务直接调用,不等于运行时已授权 [U] |
FOREGROUND_SERVICE |
常驻前台服务 | [S1] mowxgu、JMgHOxJfa |
FOREGROUND_SERVICE_SPECIAL_USE |
specialUse 类型 FGS |
[S1] Manifest 与 startForeground(..., 1073741824) |
POST_NOTIFICATIONS |
FGS 合规通知、业务召回、FCM | [S1] First/Main/Result 页面均有请求与引导 |
RECEIVE_BOOT_COMPLETED |
重启后恢复装配 | [S1] weqTnpsB 监听 Boot / package replaced |
WAKE_LOCK |
Firebase/WorkManager/后台执行依赖 | [S1] 已合并;自有显式 WakeLock 未定位,主要可能由依赖使用 [U] |
com.google.android.gms.permission.AD_ID |
广告标识 | [S1] 广告/归因 SDK footprint;实际读取与 Consent 需动态核验 [U] |
ACCESS_ADSERVICES_AD_ID |
Privacy Sandbox Ads | [S1] 广告 SDK 合并 |
ACCESS_ADSERVICES_ATTRIBUTION |
Privacy Sandbox Attribution | [S1] 广告 SDK 合并 |
ACCESS_ADSERVICES_TOPICS |
Privacy Sandbox Topics | [S1] 广告 SDK 合并 |
VIBRATE |
高重要性业务通知 Channel | [S1] cleaner_help 开启振动,qf/t.java:62-71 |
com.android.vending.CHECK_LICENSE |
Play/PairIP 校验 | [S1] 合并声明;服务器判定细节 [U] |
BIND_GET_INSTALL_REFERRER_SERVICE |
Install Referrer 归因 | [S1] TotalPage.java:57-60 |
com.google.android.c2dm.permission.RECEIVE |
FCM | [S1] 自有 FirebaseMessagingService 已注册 |
ACCESS_ADSERVICES_CUSTOM_AUDIENCE |
Privacy Sandbox Protected Audience | [S1] 广告 SDK 合并 |
com.swiftclean.phone.managerpro.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION |
AndroidX 动态 receiver 保护 | [S1] signature 自定义权限,同时自用 |
com.amazon.privacypass.ATTEST |
Amazon/广告链路 attestation | [S1] 依赖合并;本样本自有调用未定位 [U] |
Manifest 原始列表见 jadx/resources/AndroidManifest.xml:15-79。
3. 非 uses-permission 的特殊访问#
| 特殊访问 | 请求/检查方式 | 实际用途 |
|---|---|---|
| All files access(所有文件访问) | Environment.isExternalStorageManager() + 自有 Guide |
文件/照片/大文件扫描;MainPage.java:322-341,494-503 |
| Usage Access(使用情况访问) | AppOpsManager.checkOpNoThrow("android:get_usage_stats", ...) |
App 最近使用、缓存统计、网络流量;MainPage.java:443-451,505-516 |
| Notification Listener Access(通知使用权) | Service 要求 BIND_NOTIFICATION_LISTENER_SERVICE,用户在系统设置开启 |
拦截/取消/记录第三方通知;Manifest 234-241 |
| JobService 系统绑定 | 两个 Service 要求 BIND_JOB_SERVICE |
只允许系统 JobScheduler 绑定;Manifest 264-274 |
[I] 这四类入口需要在隐私政策、Play Data Safety 与产品解释中分开写;不能把“声明了权限”写成“已经授权”,也不能把特殊访问当作普通 runtime permission。
4. 自有组件与暴露面#
| 类型 | 自有数量 | exported | 重点 |
|---|---|---|---|
| Activity | 25 | 2 | FirstPage Launcher;MainPage exported + singleTask |
| Service | 5 | 4 | 通知监听受系统权限;2 个 JobService 受系统绑定权限;mowxgu exported 且未见组件权限 |
| Receiver | 4 | 4 | Cycle、Widget、Boot/package replaced、Alarm receiver |
| Provider | 1 | 0 | cIPhUu initOrder=100,进程启动即初始化 |
风险判断:
[S1/I]mowxgu、CycleReceiver、kQuACgQQ和MainPage的 exported 面应做外部显式 Intent/广播滥用测试;静态 Manifest 中mowxgu与两个自有 receiver 未见自定义调用权限。[S1]两个 JobService 虽 exported,但有BIND_JOB_SERVICE;通知监听有BIND_NOTIFICATION_LISTENER_SERVICE,不能把它们等同于无保护导出。[U]本轮未做组件 fuzz、恶意 Intent、PendingIntent 可变性或权限绕过测试。
5. 后台机制总链路#
5.1 进程启动装配#
[S1]cIPhUu是initOrder=100的非导出 ContentProvider;onCreate()保存 Application Context、SharedPreferences,反射加载PageCellar,写入首次时间,注册 Activity 生命周期,读取 Adjust attribution/adid,并调用qf.u.b()。见jadx-simple/crown.arithmetic.floor.cIPhUu.java:63-160。[S1]qf.u.b()先创建 3 个通知 Channel;只有通知可用时,才启动 FGS、安排 Alarm、注册动态广播、注册 Boot/删除接收链、安排周期 Job 与 WorkManager。见qf/u.java:57-131。[I]因此通知权限既是业务通知门槛,也是主要后台基础设施门槛;用户拒绝后不应假设这些调度均已生效。
5.2 前台服务与启动失败兜底#
| 路径 | 静态行为 | 证据 |
|---|---|---|
mowxgu |
创建 ongoing ID 20;Android >29 以 specialUse 类型启动 |
[S1] mowxgu.java:34-83 |
| 服务被销毁 | onDestroy() 清 running 标记、stopForeground 后再次 b.m() |
[S1] mowxgu.java:103-109 |
| 任务划掉 | onTaskRemoved() 再次 b.m() |
[S1] mowxgu.java:117-121 |
| sticky | Android <34 返回 START_STICKY(1);Android >=34 返回 START_NOT_STICKY(2) |
[S1] mowxgu.java:111-115 |
| 启动失败 | 安排 Job ID 22002:minimumLatency 5 秒、deadline 7 秒左右、persisted、API 33+ priority 400 | [S1] qf/b.java:235-271 |
| 兜底 Job | 自己先进入 foreground,再启动 mowxgu;15 秒后 jobFinished |
[S1] JMgHOxJfa.java:44-119、qf/d.java:42-81 |
[I] Android 14+ 返回 START_NOT_STICKY,但销毁/划卡回调仍主动请求重启;若系统禁止后台拉起,则短 Job 是第二路径。是否获准启动取决于当时系统状态 [U]。
5.3 AlarmManager#
[S1]requestCode18488,目标kQuACgQQ;每次先 cancel 旧 PendingIntent。[S1]时间来自PageCellar的配置字符串;无效时回退本地时间 10:00,并滚到下一次未来时刻。[S1]调用alarmManager.set(2, SystemClock.elapsedRealtime()+delta, ...)。type 2 =ELAPSED_REALTIME_WAKEUP,具 wakeup;set()非 exact,会受系统 batching/idle 影响而漂移。[S1]receiver 触发后确保 FGS、进入周期回调,再重新安排下一次 Alarm。见qf/b.java:295-346、kQuACgQQ.java:17-25。[U]真实触发时刻、Doze/OEM 漂移及被系统清理后的表现需 dumpsys/真机验证。
5.4 WorkManager 与 JobScheduler#
| 机制 | 参数 | 触发动作 |
|---|---|---|
| WorkManager | unique periodic work;配置 15 分钟;平台最小 15 分钟、flex 最小 5 分钟 | ZOaubC.doWork() 确保 FGS并进入周期回调 |
| JobScheduler | Job ID 20;persisted;minimumLatency 15 分钟;deadline +5 秒;API 33+ priority 400 | vjfcJyUsQs.onCreate() 确保 FGS/周期回调,onStartJob() 重排自身 |
证据:qf/b.java:419-507、ZOaubC.java:22-30、vjfcJyUsQs.java:18-50。[I] WorkManager 与 JobScheduler 同时存在是冗余恢复,而非两个都能保证准点;系统会调度、合并或推迟 [U]。
5.5 Boot、升级、删除/取消回调#
[S1]weqTnpsB静态监听BOOT_COMPLETED与MY_PACKAGE_REPLACED,接收后确保 FGS并进入不同周期回调;另有动态注册的相关 action。Manifest282-295、源码weqTnpsB.java:18-35。[S1]qf.c动态监听USER_PRESENT、ACTION_POWER_CONNECTED、SCREEN_ON/OFF、PACKAGE_ADDED/REMOVED/REPLACED、CLOSE_SYSTEM_DIALOGS、CONFIGURATION_CHANGED;按 action 做 500 ms 去重后确保 FGS并进入周期回调。qf/u.java:77-99、qf/c.java:20-92。[S1]CycleReceiver监听base.cycle.break,收到后发送前台通知对应 PendingIntent。CycleReceiver.java:13-23[S1]业务/ongoing 通知设置 delete intent,部分删除动作会取消重复通知或触发相应回调。[U]混淆字符串对应的每个动态 action 名称未全部稳定解码,报告只确认能从代码直接还原的静态 filter。
6. 事件监听与本地召回#
qf.h 在 Android 10+ 为 Music、Podcasts、Ringtones、Alarms、Notifications、Movies、Downloads、Documents、Pictures、DCIM 与 Screenshot 目录装 FileObserver;同时动态注册:
USER_PRESENT/SCREEN_OFFCLOSE_SYSTEM_DIALOGS/CONFIGURATION_CHANGEDPACKAGE_ADDED/PACKAGE_REMOVEDACTION_POWER_CONNECTED/ACTION_POWER_DISCONNECTEDCONNECTIVITY_CHANGE
证据:qf/h.java:43-182。这些事件进入通知候选前,还会经过后台、锁屏、安装时长、归因和冷却总闸;详见《拉活通知规则与文案全量报告》。
7. FCM 与 Remote Config#
7.1 FCM#
[S1]自有wSfChcdBg注册com.google.firebase.MESSAGING_EVENT。[S1]收到消息先确保 FGS并进入周期回调;只有 incoming priority 为 HIGH 才尝试生成内置高优先级通知。[S1]静态门槛包括:通知权限、App 无活动页面、竖屏、启动/安装基准至少 5 分钟、本地时间 07:00–22:59。[S1]从 10 套本地文案随机选择,使用业务 ID 21;新 token 会交给 Adjust 并上传自有后端。[U]simple-mode 中虽读取KeyguardManager,但未恢复出可靠的“锁屏即拒绝”跳转,报告不把它写成确定门槛。
证据:jadx-simple/crown.arithmetic.floor.wSfChcdBg.java:50-254。
7.2 Remote Config#
[S1]最短 fetch 间隔 3,600 秒,fetch/activate 后注册 realtime update listener。[S1]主要控制广告配置/上限/黑名单/FB 信息:首页广告,不直接下发本文已恢复的本地通知标题正文。[U]生产 RC 当前值未知;只凭 APK 不能确认线上广告/开关状态。
8. 自有网络与重试#
| URL | 静态行为 | 边界 |
|---|---|---|
https://ip.penguin-swift.com/check/new/ip |
POST,8 秒连接/读取超时,失败指数退避,直到拿到布尔结果 | [S1] qf/q.java:48-217;字段/响应语义 [U] |
https://mor.penguin-swift.com/swpeng/chaid |
POST 包名与本地 ID/token 类信息,8 秒超时、指数重试 | [S1] jadx-simple/qf.p.java:57-246;数据治理 [U] |
9. 平台边界与未验证项#
[U]Force Stop 会使系统停止组件与 Alarm/Job 触发,直到用户显式再启动;本报告不宣称代码可突破平台强停。[U]Android 14/15/16 对specialUseFGS 的 Play 声明、启动豁免与 OEM 实现需真机/Console 核验。[U]setPersisted(true)、Boot receiver、WorkManager 不等于任何设备上都按 15 分钟恢复。[U]未执行 exported 组件安全测试、网络抓包、证书固定/明文流量检查或权限拒绝矩阵。[S1/U]JADX 总计 61 个错误;核心失败方法已 simple-mode 补证,但混淆控制流仍可能影响边缘分支。