Veredicto: APK oficial, sin indicadores de malware y sin tráfico de red atribuible al juego
Se auditó el port University Days S1 — Ep17 de KoGa3 en dos fases: análisis estático completo del APK y prueba dinámica controlada en un perfil de trabajo de Android, sin tocar el perfil personal.
📦 Paquete:com.koga3.universitydaysseason1 · versión 17.3 (versionCode 1752348644)
MediaFire oficial de KoGa3 · quickkey go4bp3b8l7y9u0d
Actividad principal
org.renpy.android.PythonSDLActivity
El hash y el tamaño coinciden con el file_info del enlace oficial de MediaFire, subido por Karl Schnabl el 12/07/2025. La página del port es koga3.bplaced.net.
🧭 Contexto y metodología
flowchart LR
A["APK oficial<br/>MediaFire KoGa3"] --> B["Hash + firma"]
B --> C["JADX / DEX"]
B --> D["unrpyc / Ren'Py"]
B --> E["readelf / .so"]
C --> F["Sin código propio<br/>sospechoso"]
D --> G["Sin APIs peligrosas"]
E --> H["Build oficial Ren'Py"]
F --> I["Prueba dinámica<br/>perfil de trabajo"]
G --> I
H --> I
I --> J["PCAPdroid<br/>observar red"]
I --> K["NetGuard<br/>bloquear red"]
I --> L["logcat<br/>errores y permisos"]
J --> M["Veredicto"]
K --> M
L --> M
La prueba se hizo en un perfil de trabajo creado con Shelter (usuario Android 10), separado del perfil personal. El APK se instaló solo ahí con adb install --user 10. La sesión se documentó con adb logcat, PCAPdroid para observar tráfico y NetGuard para bloquear la red del juego. NetGuard y PCAPdroid no se usaron a la vez: Android solo permite un VPN activo.
La firma demuestra que el archivo es el que publicó KoGa3 y que no se modificó después. Al ser un certificado autofirmado, la confianza real viene de la coincidencia del hash con el enlace oficial, no de una CA.
2. Permisos declarados
Permiso
Uso
Lectura
WAKE_LOCK
Mantener CPU/pantalla durante el juego
Normal en Ren’Py
READ_EXTERNAL_STORAGE
Leer saves y URM
Necesario
WRITE_EXTERNAL_STORAGE
Guardar partidas en Documents
Necesario
MANAGE_EXTERNAL_STORAGE
Acceso amplio al almacenamiento compartido
⚠️ Más de lo que el juego necesita
INTERNET
Red
Sin código propio que la use
POST_NOTIFICATIONS
Notificaciones
Normal
VIBRATE
Vibración
Normal
FOREGROUND_SERVICE + FOREGROUND_SERVICE_DATA_SYNC
Servicio en primer plano
Play Core / extracción
No pide cámara, micrófono, contactos, SMS, ubicación, accesibilidad, administración de dispositivos ni instalación de paquetes. El manifiesto declara requestLegacyExternalStorage="true" y allowBackup="true".
El permiso que sí importa
MANAGE_EXTERNAL_STORAGE permite leer y escribir en todo el almacenamiento compartido, aunque el juego solo use Documents/RenPy_Saves. En Android 10 no se concede como permiso runtime y no amplía el acceso real más allá del almacenamiento legacy. En Android 11+ sí sería relevante.
3. Interior del APK
Componente
Detalle
classes.dex
5,14 MB · 4.140 class_defs · 34.380 métodos
lib/arm64-v8a/librenpython.so
27,9 MB · ELF ARM64 · stripped
lib/armeabi-v7a/librenpython.so
26,3 MB · ELF ARM · stripped
lib/x86_64/librenpython.so
32,1 MB · ELF x86-64 · stripped
assets/private.mp3
4,3 MB · en realidad tar.gz con 1.139 entradas
assets/x-game/
48 .rpyc · 6.154 .webp · 134 .webm · 106 .mp3
assets/x-renpy/
86 scripts comunes de Ren’Py
No hay .rpa, .jar, .apk, .dex ni ejecutables PE/ELF escondidos en los assets. Tampoco rutas .., absolutas ni enlaces raros dentro del tar.
4. Java, librerías nativas y trackers
4.140 clases, casi todas AndroidX, Kotlin, Coroutines, Google Play Core/GMS, SLF4J y SDL/Ren’Py.
El único código propio es com.koga3.universitydaysseason1.R (recursos). No hay lógica Java del mod.
Sin Runtime.exec, ProcessBuilder, clientes HTTP propios, DexClassLoader, PackageInstaller ni DownloadManager en código propio.
Los tres .so son builds de Ren’Py: solo JNI de org.libsdl/org.renpy, sin system, exec*, socket, connect, dlopen, ptrace ni setuid.
Las cadenas de compilación apuntan a /home/tom/ab/renpy-build-fix/..., la ruta oficial del SDK de Ren’Py 8.3.7.
Trackers: 0 SDKs de analytics, ads, attribution o crash reporting. Las 3 referencias a Firebase son clases de excepción usadas por Play Core, no Firebase Analytics.
5. Scripts Ren’Py y main.py
Se descompilaron 135/135 archivos con unrpyc: 109 .rpy + 26 .rpym (19 MB). Los scripts propios son historia, UI, galería, replay y ajustes del mod (x-script*.rpy, x-options.rpy, x-guiAndroid.rpy, x-Z_KoGa3ModAndroid.rpy, x-gallery.rpy, etc.).
No aparecen en el juego:
os.system, subprocess, Popen
urllib, requests, socket, http.client
shutil.copy/move/rmtree ni open() sobre rutas arbitrarias
eval/exec/__import__/marshal/pickle.loads
ctypes, jnius, pyjnius
renpy.open_url, webbrowser, base64.b64decode
config.developer = True está activo, pero config.console = False; no queda consola de Python accesible.
main.py es el estándar de Ren’Py con añadidos de KoGa3:
Calcula GameName desde el basedir.
Guarda en Documents/RenPy_Saves/<GameName> (fuera del sandbox, para que las partidas sobrevivan a desinstalar).
Crea Documents/RenPy_Saves/MULTIPERSISTENT si no existe.
Si existe Documents/0x52_URM.rpa, lo copia a Documents/RenPy_Saves/<GameName>/game/ y lo añade al searchpath.
Añade Documents/RenPy_Saves/<GameName>/game al searchpath si existe.
Vector real de riesgo: mods en almacenamiento compartido
Cualquier .rpyc, .rpa o .rpy colocado en Documents/RenPy_Saves/com.koga3.universitydaysseason1/game se carga al iniciar y se ejecuta con los permisos del juego. Es el mismo mecanismo del URM. No es un fallo del APK, pero es la razón para no meter mods de fuentes desconocidas. El APK no incluye0x52_URM.rpa; solo lo copia si el usuario lo pone ahí.
6. Señales externas
Señal
Lectura
VirusTotal aportado por el usuario
0/63 detecciones · último análisis 2025-07-21
obfuscated
Heurística genérica; el APK usa el compresor UAGC (assets x-), no ofuscación real
contains-elf
Normal: las tres librenpython.so
checks-gps / telephony
Clases AndroidX presentes pero sin uso propio ni permisos de ubicación/telefonía
reflection
Normal en AndroidX, Kotlin y GMS
No se subió el APK a VirusTotal; el análisis fue aportado por el usuario.
🧪 Fase 2 — Prueba dinámica
Montaje
Elemento
Detalle
Dispositivo
Motorola Moto G9 Play · Android 10
Aislamiento
Perfil de trabajo con Shelter 1.9.1 · usuario Android 10
Juego
com.koga3.universitydaysseason117.3 · instalado solo en usuario 10
Observación de red
PCAPdroid 2.0.2 (VPN local)
Bloqueo de red
NetGuard 2.337 (Wi-Fi y datos bloqueados solo al juego)
Logs
adb logcat -v threadtime
Permisos runtime
Solo READ_EXTERNAL_STORAGE + WRITE_EXTERNAL_STORAGE
PCAPdroid y NetGuard se usaron en pasadas separadas porque Android solo admite un VPN activo a la vez.
Pasada 1 — PCAPdroid (observar)
PCAPdroid activó su VPN local y capturó el tráfico del perfil de trabajo.
En la lista de conexiones solo aparecieron Google Play Store, Servicios de Google Play y DNS del sistema:
android.clients.google.com
play.googleapis.com
play-fe.googleapis.com
connectivitycheck.gstatic.com
deviceintegritytokens-pa.googleapis.com
University Days no apareció ni una vez.
dumpsys netstats no registró ninguna entrada ni byte para el UID del juego (1010500).
Pasada 2 — NetGuard (bloquear)
Se activó NetGuard y se bloquearon Wi-Fi y datos móviles solo para University Days.
Se cerró y reabrió el juego con el bloqueo puesto.
El juego arrancó y llegó al menú principal sin red y sin errores.
En el log del proceso no hay UnknownHostException, ConnectException, SocketTimeoutException ni timeouts.
Los únicos errores de red del log son de otras apps (Messenger/Facebook) bloqueadas por NetGuard, no del juego.
El juego usó TextToSpeech local de Android; es un servicio local, no una conexión a Internet.
El juego solo usa Documents/RenPy_Saves, pero el permiso habilita más
Carga de .rpyc/.rpa desde Documents
Medio (local)
Cualquier script dejado ahí se ejecuta con permisos del juego
URM copiado desde Documents/0x52_URM.rpa
Medio (local)
El APK no lo incluye; usa solo el URM oficial
INTERNET sin código de red
Bajo
No hay endpoints, clientes HTTP ni sockets en código propio
requestLegacyExternalStorage + targetSdk 29
Bajo/medio
Explica el guardado en Documents; sin scoped storage moderno
allowBackup=true
Bajo
Las partidas podrían entrar en un backup
config.developer=True
Bajo
Sin consola accesible (config.console=False)
Firma autofirmada sin timestamp
Bajo
Normal en mods; la autenticidad se apoya en el hash oficial
Sesión dinámica corta (~5 min)
Bajo
Un dispositivo y Android 10; no es garantía absoluta
Lo que esta auditoría no cubre
No se auditó 0x52_URM.rpa porque no se proporcionó. No se hizo comparación binaria completa de las tres ABIs. No se probaron mods externos. La prueba dinámica confirma que este APK concreto no intentó conectarse a nada, no que cualquier mod de la misma escena sea seguro.
🧹 Estado actual y limpieza
El perfil de trabajo sigue existiendo con University Days, NetGuard y PCAPdroid instalados. NetGuard está activo bloqueando Wi-Fi y datos al juego; PCAPdroid está detenido. No se borró nada porque el usuario quiere probar el juego después.
Limpieza cuando ya no se necesite
# Desinstalar solo del perfil de trabajo (usuario 10)adb shell pm uninstall --user 10 com.koga3.universitydaysseason1adb shell pm uninstall --user 10 eu.faircode.netguardadb shell pm uninstall --user 10 com.emanuelef.remote_capture
Después, borrar el perfil desde Shelter → menú → Remove work profile. Eso elimina apps, datos y partidas del perfil de trabajo; el perfil personal no se toca.
🔁 Cómo reproducirlo
Comandos esenciales
# 1. Verificar integridadsha256sum com.koga3.universitydaysseason1-Ep17.apk# 2. Ver dispositivos y perfilesadb devices -ladb shell pm list users# 3. Instalar solo en el perfil de trabajo (ID 10)adb install --user 10 -r com.koga3.universitydaysseason1-Ep17.apk# 4. Lanzar el juegoadb shell am start --user 10 \ -n com.koga3.universitydaysseason1/org.renpy.android.PythonSDLActivity# 5. Capturar logadb logcat -cadb logcat -v threadtime > session.log# 6. Ver tráfico acumulado del UID del juegoadb shell dumpsys netstats detail | grep -A 6 'uid=1010500'# 7. Ver permisos runtimeadb shell dumpsys package com.koga3.universitydaysseason1 \ | sed -n '/runtime permissions:/,/User 10:/p'
Para la prueba de red: instalar PCAPdroid y activar su VPN → jugar 5–10 min → revisar conexiones. Después desactivar PCAPdroid, abrir NetGuard, bloquear Wi-Fi y datos solo a University Days → reabrir el juego y comprobar que funciona. Nunca ambos VPN a la vez.
✅ Conclusión
El APK es el oficial de KoGa3, firmado por él, con hash idéntico al de MediaFire. No contiene código Java propio sospechoso, no ejecuta comandos, no carga código dinámico y no se conecta a ningún sitio. Los scripts Ren’Py no usan APIs peligrosas y el escaneo de trackers da 0 SDKs.
La prueba dinámica lo confirma: 0 bytes de red para el UID del juego, ninguna conexión visible en PCAPdroid, arranque y partida sin errores incluso con NetGuard bloqueando Wi-Fi y datos. No hay indicadores de malware.
El riesgo real es de privacidad y permisos (MANAGE_EXTERNAL_STORAGE) y de carga de mods desde almacenamiento compartido (.rpyc, .rpa, URM), no de malware detectado. Para uso normal, con instalación desde el enlace oficial y sin mods desconocidos, el riesgo es bajo.