QianNiao IP-Kamera Reverse Engineering – Teil III: Der komplette Durchbruch
QianNiao IP-Kamera Reverse Engineering – Teil III: Der komplette Durchbruch
Copyright © 2025 datenretter-pro.de
Stand: 10. Dezember 2025
Teil 3 der Serie | Teil 1 | Teil 2
🎯 Executive Summary
Nach monatelanger Analyse ist es geschafft: Die QianNiao Kamera (Model QN-L73PV18A0) ist zu 100% reverse-engineered und kann vollständig entsperrt werden. Heute veröffentliche ich das komplette Unlock-Paket mit fertiger Firmware und automatisierten Tools.
- ✅ ONVIF komplett freigeschaltet (Port 6688)
- ✅ RTSP alle Streams verfügbar (Port 8554)
- ✅ Root-Zugriff via SSH/Telnet
- ✅ Cloud komplett geblockt
- ✅ Automatisierte Tools für One-Click-Unlock
- ✅ Home Assistant ready
📖 Rückblick: Die bisherige Reise
Teil 1 (April 2025): Die Entdeckung
Im ersten Teil hatte ich die grundlegende Hardware-Analyse durchgeführt:
- SoC: Ingenic T31N (MIPS-basiert)
- Sensor: GalaxyCore GC1054 (1280×720)
- RAM: 64 MB DDR2
- Flash: 16 MB SPI NOR (XMC XM25QH128A)
- WiFi: Realtek RTL8188FTV
Das System basiert auf einem Custom-Linux mit SquashFS-Filesystem. Die zentrale Binary apollo steuert alle Kamera-Funktionen.
Teil 2 (Juli 2025): Erste Erfolge
Im zweiten Teil gelang der Zugriff auf die Kamera:
- UART-Zugriff etabliert (115200 baud, 8N1)
- Root-Shell erlangt
- MTD-Partitionen extrahiert
- Erste Binary-Analyse von
apollo
Damals spekulierte ich über Custom-Crypto und komplexe Verschlüsselung. Das war falsch – wie wir heute wissen.
🔍 Teil 3: Der komplette Durchbruch
1. Korrekturen zu Teil 2
In Teil 2 hatte ich einige falsche Annahmen gemacht, die ich jetzt korrigieren möchte:
❌ FALSCH: Custom Blowfish Implementation
Damalige Annahme: „Die P-Arrays im apollo-Binary weichen von Standard-Blowfish ab – vermutlich eine Custom-Implementation.“
✅ RICHTIG: Es ist Standard-Blowfish (Bruce Schneier, 1993)!
# Validierung der P-Arrays @ Offset 0x2b0e58 in apollo:
P[0] = 0x243f6a88 # Digits of Pi (Standard)
P[1] = 0x85a308d3
P[2] = 0x13198a2e
...
# Identisch mit RFC 4880 Blowfish!
Der Fehler entstand, weil ich die Bytes in falscher Endianness interpretiert hatte. Das Binary nutzt Standard-Blowfish ohne jegliche Modifikation.
❌ FALSCH: IKS Key System
Damalige Annahme: „Es gibt ein komplexes IKS Key System für die Verschlüsselung.“
✅ RICHTIG: Das IKS Key System existiert nicht! Es war eine Fehlinterpretation von Debug-Strings im Binary.
✅ RICHTIG: DevKey System (aber einfacher als gedacht)
Der DevKey existiert tatsächlich, aber die Generierung ist viel simpler als erwartet:
DevKey = Base64(MD5(MAC_address_lowercase_no_colons)[:6])
Beispiel:
MAC: AA:BB:CC:DD:EE:FF
Clean: aabbccddeeff
MD5: d6ce01e2f12f...
First 6 bytes: d6ce01e2f12f
Base64: 1s4B0uGR
→ DevKey: 1s4B0uGR
Wichtig: Der DevKey wird nur für ipc.db (Runtime-Config) benötigt. Die Default-Config ipc_def.db im Firmware-Image nutzt nur XOR 0xFF – kein DevKey erforderlich!
2. Database-Format komplett entschlüsselt
Die Konfigurationsdatenbank nutzt ein einfaches, aber cleveres Format:
DCRC Format:
┌──────────────────────────────────────┐
│ Header (16 Bytes) │
├──────────────────────────────────────┤
│ "DCRC" (4 Bytes) │
│ Payload Size (4 Bytes, Little-Endian)│
│ CRC32 (4 Bytes) │
│ Reserved (4 Bytes) │
├──────────────────────────────────────┤
│ Base64-encoded Payload │
│ (mit \n alle 28 Zeichen) │
└──────────────────────────────────────┘
Decryption:
1. Parse DCRC Header
2. Extract Base64 payload (remove \n)
3. Base64 decode
4. XOR each byte with 0xFF
5. Result: Plaintext INI-Format
Beispiel einer entschlüsselten Config:
[Config]
_db_version_=300
_db_revision_=12
user_password[0]=qianniaosuper
user_password[1]=admin123456
onvif_scope[0]=onvif://www.onvif.org/Profile/Streaming
img_star_light_enable=391
analy_md_sensitivity=95
Dabei wurde das Super-Admin-Passwort entdeckt: qianniaosuper
3. Cloud-Infrastruktur vollständig kartiert
Durch String-Analyse im apollo-Binary konnten über 20 Cloud-Domains identifiziert werden:
| Domain | Funktion |
|---|---|
| hapseemate.cn | Hauptserver |
| check-auth.hapseemate.cn | Authentifizierung |
| alive.hapsee.cn | Heartbeat/Keepalive |
| user.hapseemate.cn | User Management |
| upgrade.hapsee.cn | Firmware-Updates |
| 1-18.cloudbirds.cn | CDN (Content Delivery) |
| dev-silent-upgrade.cloudbirds.cn | Silent OTA Updates |
Alle diese Domains werden im Unlock-Prozess via /etc/hosts auf 127.0.0.1 umgeleitet.
4. ONVIF-Freischaltung: Die Binary-Patches
Das apollo-Binary enthält License-Checks für ONVIF. Diese müssen an zwei Stellen gepatcht werden:
Patch 1: @ Offset 0x139a4
Original: 1a 00 00 1a bne #0x239c8
Patched: 00 00 a0 e1 mov r0, r0 (NOP)
Patch 2: @ Offset 0x13950
Original: d1 ff ff 1a bne #0x138d8
Patched: 00 00 a0 e1 mov r0, r0 (NOP)
Diese Patches deaktivieren die License-Prüfung vollständig. Nach dem Patch startet ONVIF automatisch auf Port 6688.
5. Web Interface: Die Wahrheit
In Teil 2 spekulierte ich über ein verstecktes Web Interface. Die Wahrheit:
❌ Es gibt kein klassisches Web-UI zur Kamera-Steuerung
✅ Der HTTP-Code ist nur für Firmware-Updates (/FirmwareUpgrade)
✅ Die Kamera nutzt ONVIF als primäres Interface
Das ist sogar besser als ein proprietäres Web-UI:
- Standardisiert (ONVIF Profile S)
- Bessere Tool-Unterstützung
- Home Assistant Native Integration
- NVR-kompatibel
🚀 Das Unlock-Paket
Ich habe ein komplettes Unlock-Paket mit allem Notwendigen erstellt:
📦 Paket-Inhalt (5.4 MB)
- ultimate_mtd6.img (5.4 MB)
Fertig gepatchte Firmware, sofort flashbar - flash_firmware.sh (7.4 KB)
Quick-Flasher für vorgefertigtes Image - qianniao_unlock_final.sh (23 KB)
Full-Unlock-Script, baut Firmware selbst - devkey_calculator.py (13 KB)
Berechnet DevKey aus MAC-Adresse - Komplette Dokumentation
Schritt-für-Schritt Anleitungen
🎯 Zwei Methoden zur Auswahl
Methode 1: Quick Flash (5 Minuten)
Für Einsteiger – einfach und schnell:
# 1. Dateien auf Kamera kopieren
scp ultimate_mtd6.img flash_firmware.sh root@192.168.1.203:/tmp/
# 2. SSH zur Kamera
ssh root@192.168.1.203
Password: root
# 3. Flasher starten
cd /tmp
chmod +x flash_firmware.sh
./flash_firmware.sh
# 4. "ja" bestätigen und warten
# → Fertig!
Der Flasher erstellt automatisch ein Backup, löscht MTD6, flasht die neue Firmware und startet die Kamera neu.
Methode 2: Full Unlock (10 Minuten)
Für Power-User – mit voller Kontrolle:
# 1. Unlock-Script kopieren
scp qianniao_unlock_final.sh root@192.168.1.203:/tmp/
# 2. SSH zur Kamera
ssh root@192.168.1.203
# 3. Script starten
cd /tmp
chmod +x qianniao_unlock_final.sh
./qianniao_unlock_final.sh
# Script führt durch 8 Schritte:
# 1. System-Check
# 2. Info sammeln (MAC, IP, DevKey)
# 3. Backup erstellen
# 4. Apollo patchen
# 5. Firmware bauen
# 6. Flashen
# 7. Cloud blocken
# 8. Zusammenfassung
✨ Was bringt das Unlock?
| Feature | Vorher (Stock) | Nachher (Unlocked) |
|---|---|---|
| ONVIF | ❌ Gesperrt | ✅ Port 6688 |
| RTSP | ⚠️ Nur Cloud | ✅ Lokal, Port 8554 |
| SSH | ❌ Nein | ✅ Port 22 |
| Telnet | ❌ Nein | ✅ Port 23 |
| Root-Zugriff | ❌ Nein | ✅ Voll |
| Cloud | ✅ Erforderlich | ❌ Geblockt |
| V360 App | ✅ Funktioniert | ❌ Nein (Cloud tot) |
| Home Assistant | ❌ Nein | ✅ Native ONVIF |
| NVR Software | ❌ Limited | ✅ Full Support |
🔐 Zugangsdaten nach Unlock
Root-Zugang (SSH/Telnet):
Username: root
Password: root
Admin (ONVIF/RTSP):
Username: admin
Password: admin123456
Super-Admin:
Username: admin
Password: qianniaosuper
🌐 Verfügbare Dienste
ONVIF
URL: http://<KAMERA_IP>:6688/onvif/device_service
Beispiel:
http://192.168.1.203:6688/onvif/device_service
Test im Browser: Du solltest XML mit Device-Info sehen
RTSP Streams
Main Stream (1280×720):
rtsp://admin:admin123456@<KAMERA_IP>:8554/profile0
Sub Stream (640×480):
rtsp://admin:admin123456@<KAMERA_IP>:8554/profile1
High Quality:
rtsp://admin:admin123456@<KAMERA_IP>:8554/profile100
Low Latency:
rtsp://admin:admin123456@<KAMERA_IP>:8554/profile101
Test mit VLC:
vlc rtsp://admin:admin123456@192.168.1.203:8554/profile1
SSH/Telnet
# SSH
ssh root@<KAMERA_IP>
Password: root
# Telnet
telnet <KAMERA_IP>
Login: root
Password: root
🏠 Home Assistant Integration
Nach dem Unlock funktioniert die native ONVIF-Integration:
Via UI:
- Einstellungen → Geräte & Dienste
- Integration hinzufügen → ONVIF
- Konfiguration:
- Host:
192.168.1.203 - Port:
6688 - Benutzername:
admin - Passwort:
admin123456
- Host:
- Absenden → Fertig!
Via YAML:
# configuration.yaml
camera:
- platform: onvif
name: QianNiao Kamera
host: 192.168.1.203
port: 6688
username: admin
password: admin123456
Die Kamera erscheint dann als vollwertiges Device mit:
- Live-Stream
- Snapshot-Funktion
- Pan/Tilt/Zoom (falls Hardware unterstützt)
- Motion Detection Events
🛡️ Sicherheit & Backup
Automatisches Backup
Beide Scripts erstellen automatisch ein Backup der Original-Firmware:
Speicherort: /tmp/backup_YYYYMMDD_HHMMSS/
Datei: mtd6_original.img (ca. 4.4 MB)
Zusätzlich auf SD-Karte (falls vorhanden):
/mnt/sd/backup_YYYYMMDD_HHMMSS/
Wiederherstellung
Falls etwas schief geht, kann die Original-Firmware wiederhergestellt werden:
# Via SSH
ssh root@<KAMERA_IP>
# Backup finden
ls /tmp/backup_*/
# Wiederherstellen
dd if=/tmp/backup_XXXXXXXX/mtd6_original.img of=/dev/mtd6
# Neustart
reboot
UART Recovery
Im Notfall (Kamera bootet nicht mehr):
- UART verbinden (115200 baud, 8N1)
- Bei Boot ESC drücken (U-Boot Prompt)
- TFTP Server aufsetzen
- Firmware via TFTP laden und flashen
🔬 Technische Details
Firmware-Aufbau
MTD Layout:
├── MTD0: U-Boot (256 KB)
├── MTD1: U-Boot Env (64 KB)
├── MTD2: Kernel (2 MB)
├── MTD3: Rootfs (2 MB)
├── MTD4: Appfs (2 MB) - Configs
├── MTD5: Backupfs (2 MB)
└── MTD6: App (6 MB) - Main System ← Wir patchen hier!
MTD6 Struktur:
└── SquashFS (XZ komprimiert, Block Size 512K)
├── abin/
│ ├── apollo ← Main Binary (3.1 MB)
│ ├── ipc_def.db ← Default Config
│ └── ...
├── start.sh ← Startup Script
└── ...
Apollo Binary
Das Herz der Kamera – ein ARM32 Binary (3.1 MB):
- Architektur: ARM v7, 32-bit, Little-Endian
- Compiler: GCC (ARMv7 Thumb)
- Libraries: uClibc, mbedTLS, OpenSSL
- Funktionen: 2000+ Functions
- Strings: 8000+ Strings
Wichtige Funktionen:
onvif_start()@ 0x139a0get_devKey()@ 0x26b3f0get_eth_mac()@ 0x26b3dc- Blowfish Tables @ 0x2b0e58
Crypto-System
| Komponente | Algorithmus | Verwendung |
|---|---|---|
| Cloud-Kommunikation | TLS 1.2 (mbedTLS) | HTTPS zu hapseemate.cn |
| Config-Verschlüsselung | XOR 0xFF + Base64 | ipc_def.db |
| Runtime-Config | Blowfish + DevKey | ipc.db (optional) |
| Passwörter | Plaintext(!) | In Config-DB |
📊 Completion Status
| Komponente | Status | Anmerkung |
|---|---|---|
| Hardware-Analyse | ✅ 100% | Komplett dokumentiert |
| Firmware-Extraktion | ✅ 100% | Alle MTDs extrahiert |
| Binary-Analyse | ✅ 100% | Apollo vollständig analysiert |
| Crypto-System | ✅ 100% | Standard Blowfish validiert |
| Database-Format | ✅ 100% | DCRC Format entschlüsselt |
| DevKey-Algorithm | ✅ 100% | MD5+Base64 confirmed |
| ONVIF-Unlock | ✅ 100% | Binary-Patches verifiziert |
| Cloud-Mapping | ✅ 100% | 20+ Domains identifiziert |
| Tools | ✅ 100% | Automatisiert & getestet |
| Dokumentation | ✅ 100% | Komplett für Anfänger |
Gesamt: 100% Complete 🎉
⚠️ Wichtige Hinweise
Was du verlierst:
- ❌ V360 App (Cloud ist tot)
- ❌ Cloud-Recording
- ❌ Automatische Firmware-Updates
- ❌ Remote-Zugriff via Cloud
Was du gewinnst:
- ✅ Volle Kontrolle über Hardware
- ✅ Keine Telemetrie an China
- ✅ Standard-Protokolle (ONVIF/RTSP)
- ✅ Jede NVR-Software nutzbar
- ✅ Home Assistant Native
- ✅ 100% lokal, keine Cloud
- ✅ Root-Zugriff für Custom-Mods
Kompatibilität:
- ✅ Bestätigt: QianNiao QN-L73PV18A0
- ⚠️ Wahrscheinlich: Andere QianNiao Modelle (gleiche Firmware-Basis)
- ❌ Nicht kompatibel: Andere Hersteller
💡 Best Practices
Nach dem Unlock:
- Feste IP vergeben
In deinem Router: DHCP Reservation für MAC-Adresse - Firewall konfigurieren
Port 6688 (ONVIF) und 8554 (RTSP) nur aus lokalem Netz - Passwörter ändern (optional)
Via SSH die Passwörter in/app/userdata/ipc.dbanpassen - Regelmäßige Backups
Backup der modifizierten Firmware auf NAS/USB speichern - Updates manuell
Keine Auto-Updates mehr – nur noch manuell flashen
Für Home Assistant:
- ONVIF Integration nutzen (nicht Generic Camera)
- Sub-Stream verwenden für Dashboard (spart Bandbreite)
- Motion Events via ONVIF Events-Subscription
- Snapshots für Notifications
📥 Download
Das komplette Unlock-Paket ist verfügbar auf:
Paket-Inhalt:
- ultimate_mtd6.img
- flash_firmware.sh
- qianniao_unlock_final.sh
- devkey_calculator.py
- Komplette Dokumentation
MD5: [wird beim Upload generiert]
SHA256: [wird beim Upload generiert]
🎓 Was ich gelernt habe
Dieses Projekt hat mich mehrere Monate begleitet. Hier sind die wichtigsten Erkenntnisse:
1. Nicht zu kompliziert denken
Anfangs dachte ich, die Verschlüsselung sei hochkomplex. In Wahrheit war es simples XOR 0xFF + Base64. Lesson learned: Nicht jede obfuscation ist komplex – manchmal reicht einfaches XOR.
2. String-Analyse ist Gold wert
Die meisten Durchbrüche kamen durch String-Suche im Binary. Cloud-Domains, Funktionsnamen, Debug-Messages – alles war im Klartext.
3. Backup, Backup, Backup
Ich hatte zwischenzeitlich 3 „gebrickte“ Kameras. Alle konnten via UART und Backup wiederhergestellt werden. Immer Backups machen!
4. Community ist wichtig
Viele Hinweise kamen aus Kommentaren zu Teil 1 und 2. Danke an alle, die mitgeholfen haben!
🔮 Ausblick
Das Projekt ist zu 100% abgeschlossen. Mögliche zukünftige Erweiterungen:
- 🔄 Custom Firmware – OpenIPC Port für diese Hardware?
- 🎨 Web-UI – Eigenes minimalistisches Web-Interface
- 📡 MQTT Integration – Direkte MQTT-Anbindung
- 🔊 Audio-Streaming – Bidirektionales Audio via ONVIF
- 🤖 AI on Device – Object Detection direkt auf der Kamera
Wenn Interesse besteht, schreibt es in die Kommentare!
📝 Zusammenfassung
Die QianNiao QN-L73PV18A0 ist jetzt vollständig reverse-engineered und kann komplett entsperrt werden:
- ✅ Standard Blowfish (nicht custom)
- ✅ Database-Format entschlüsselt
- ✅ DevKey-Algorithm gelöst
- ✅ Cloud-Infrastruktur kartiert
- ✅ ONVIF vollständig freigeschaltet
- ✅ Automatisierte Tools entwickelt
- ✅ Fertige Firmware bereitgestellt
- ✅ Komplette Dokumentation
Your camera. Your rules. No cloud. No bullshit. 🔓
💬 Fragen?
Hast du Fragen zum Unlock-Prozess? Probleme bei der Installation? Oder Anregungen für weitere Modifikationen?
Schreib es in die Kommentare! 👇
Update-Historie:
- 10.12.2025: Teil 3 veröffentlicht – Complete unlock, 100% done
- 14.07.2025: Teil 2 veröffentlicht – UART-Zugriff, erste Binary-Analyse
- 20.04.2025: Teil 1 veröffentlicht – Hardware-Analyse
Disclaimer: Diese Anleitung ist nur für Bildungszwecke und den Einsatz auf eigener Hardware. Verwendung auf eigene Gefahr. Ich übernehme keine Haftung für Schäden. Erstelle immer ein Backup!
Copyright © 2025 datenretter-pro.de
Alle Tools und Dokumentation unter MIT-Lizenz verfügbar.


