A layered security analysis of NetMirror, a third-party Android streaming app offering free access to paid streaming content (movies, series). The app is accessible via:
- Official web app (browser-based streaming)
- Direct APK downloads from the website
- Telegram channels and direct links
This repository documents a full analysis pipeline: manual static analysis → dynamic testing → cross-verification — including honest correction of false positives found in prior reports (including my own initial static analysis).
| Category | Finding |
|---|---|
| Classification | Adware / Privacy-hostile piracy app |
| Active malware (spyware/dropper) | ❌ Not confirmed |
| Signature spoofing / repackaging | ❌ False positive — evidence does not exist in this APK |
| Runtime permission escalation | ❌ Not reproduced — not possible in this build |
| Affiliate monetization (undisclosed) | ✅ Confirmed |
| Runtime-assigned C2 backend | ✅ Confirmed |
| Content scraping to operator backend | ✅ Confirmed |
| Cleartext traffic | ✅ Confirmed |
| Play Store / developer identity | ❌ Absent — distributed via official website, Telegram, and direct links |
netmirror-analysis/
│
├── README.md # This file
├── METHODOLOGY.md # Tools, approach, limitations
├── Final Report.md # Executive summary and verdict
│
├── Static Analysis/
│ ├── Original Reports/ # Original claims before verification
│ ├── APK Structure/ # Manifest, signing, dex inventory
│ ├── Hermes Bytecode/ # Disassembly + findings
│ └── Java Decompilation/ # Key decompiled classes + notes
│
├── Dynamic Analysis/
│ ├── Host list.txt
│ ├── Packet Capture/ # SNI list, DNS list, pcap notes
│ └── Frida/ # Hook scripts + runtime findings
│
├── Reconciliation/ # Cross-layer findings, false positives, final addendum
│
└── Reproduciability/ # Tools, versions, setup instructions
1. Runtime-assigned backend (confirmed in code + live traffic)
The app does not hardcode its server URLs. On every launch it fetches mobiledetect.app/check.php, which returns a Base64-encoded config assigning the backend (net52.cc) at runtime. This architecture is deliberately resilient to domain takedowns.
2. Content scraping to operator backend (confirmed in code + live capture)
Every video playback POSTs the full scraped HTML of a Streamtape embed page to net52.cc/streamtape.php. The backend extracts the signed video URL and returns it. The operator receives every title every user attempts to watch.
3. Undisclosed affiliate redirect (confirmed in Java source)
MainActivity.onCreate() contains a hardcoded 10-second delayed Intent.ACTION_VIEW to mpanyinadiingsinsp.com?bC8ac=1258571 on every app launch. This is an affiliate monetization redirect, not disclosed to users.
4. Base64-encoded C2 domain pool (confirmed byte-for-byte in Hermes bundle)
Five mobidetect* / mobiledetect* domains are embedded in the JS bundle as Base64 strings — confirmed both in the disassembly and via live DNS capture.
5. Cleartext traffic enabled
AndroidManifest.xml declares usesCleartextTraffic="true". All HTTP traffic is unencrypted.
Device fingerprinting (IMEI, SIM serial, Android ID collection)
react-native-device-info library is present and exports these getters. However, no app-level code calls them or transmits their values anywhere. Library presence ≠ active use.
Emulator detection as anti-analysis cloaking
isEmulator() is present in the library and confirmed to gate app behavior — the app will not run on emulators (tested on MEmu emulator, app fails to launch). However, no app code that branches on this result was found in the bytecode. The emulator detection likely happens at the native/framework level or via obfuscated logic that static analysis cannot easily trace. The behavior is real (app blocks emulators), but the mechanism is not clearly visible in decompiled code.
| Claim | Reality |
|---|---|
KillerApplication class / signature spoofing |
Zero hits across 4,814 decompiled classes — does not exist |
classes2.dex attacker payload |
Only one classes.dex exists — no secondary dex |
META-INF/ANDROID.RSA attacker certificate |
No such file — app uses modern v2/v3 APK signing |
libSignatureKiller.so / xhook |
No native library matching this description |
| Runtime permission escalation (READ_SMS, READ_CALL_LOG) | RN library constants only — not in manifest, cannot be requested, never fired in Frida testing |
| Layer | Tool | Key Output |
|---|---|---|
| Java static analysis | JADX 1.5.1 | Class inventory, Java source review |
| JS static analysis | hermes-dec 0.1.7 | 278,825-line Hermes disassembly |
| HTTP interception | Burp Suite (MITM proxy) | 61 unique domains, request/response bodies |
| Packet capture | tcpdump + tshark | SNI list, DNS list, QUIC findings |
| Runtime instrumentation | Frida 17.8.0 | Permission hooks, AsyncStorage hooks, openURL hooks |
| Filesystem extraction | adb root + SQLite | AsyncStorage dump, shared_prefs |
- This is not a definitive "safe" verdict — future app versions could activate dormant capabilities
- This is a single APK snapshot — behavior may differ across versions or geographies
- The dropper/second-stage concern (flagged in the original static report) could not be ruled out entirely via static analysis alone — it was simply not triggered during this test window
- This analysis does not constitute legal or regulatory advice
Package: app.netmirror.netmirrornew
Version: 3.0
SHA256: [see Reproduciability/tools/apk_hash.txt]
Signing: APK Signature Scheme v2/v3
Classes: 4,814 total (2 in app's own package)
Bundle: Hermes bytecode v96, 1,215,512 bytes
- Medium blog: "The Free Movie App That Was Robbing You Blind" — @Espress0
- react-native-device-info: https://github.com/react-native-device-info/react-native-device-info
- react-native-system-setting: https://github.com/c19354837/react-native-system-setting
- react-native-webview: https://github.com/react-native-community/react-native-webview
- hermes-dec: https://github.com/P1sec/hermes-dec
- JADX: https://github.com/skylot/jadx
Analysis performed as part of a mobile security assessment exercise. Device: Rooted Pixel 6a | Android 14 Date: August 2026
TLP: AMBER — Share only with members of your organisation and partners on a need-to-know basis.