×

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:

DomainFunktion
hapseemate.cnHauptserver
check-auth.hapseemate.cnAuthentifizierung
alive.hapsee.cnHeartbeat/Keepalive
user.hapseemate.cnUser Management
upgrade.hapsee.cnFirmware-Updates
1-18.cloudbirds.cnCDN (Content Delivery)
dev-silent-upgrade.cloudbirds.cnSilent 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?

FeatureVorher (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:

  1. Einstellungen → Geräte & Dienste
  2. Integration hinzufügen → ONVIF
  3. Konfiguration:
    • Host: 192.168.1.203
    • Port: 6688
    • Benutzername: admin
    • Passwort: admin123456
  4. 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):

  1. UART verbinden (115200 baud, 8N1)
  2. Bei Boot ESC drücken (U-Boot Prompt)
  3. TFTP Server aufsetzen
  4. 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() @ 0x139a0
  • get_devKey() @ 0x26b3f0
  • get_eth_mac() @ 0x26b3dc
  • Blowfish Tables @ 0x2b0e58

Crypto-System

KomponenteAlgorithmusVerwendung
Cloud-KommunikationTLS 1.2 (mbedTLS)HTTPS zu hapseemate.cn
Config-VerschlüsselungXOR 0xFF + Base64ipc_def.db
Runtime-ConfigBlowfish + DevKeyipc.db (optional)
PasswörterPlaintext(!)In Config-DB

📊 Completion Status

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

  1. Feste IP vergeben

    In deinem Router: DHCP Reservation für MAC-Adresse
  2. Firewall konfigurieren

    Port 6688 (ONVIF) und 8554 (RTSP) nur aus lokalem Netz
  3. Passwörter ändern (optional)

    Via SSH die Passwörter in /app/userdata/ipc.db anpassen
  4. Regelmäßige Backups

    Backup der modifizierten Firmware auf NAS/USB speichern
  5. Updates manuell

    Keine Auto-Updates mehr – nur noch manuell flashen

Für Home Assistant:

  1. ONVIF Integration nutzen (nicht Generic Camera)
  2. Sub-Stream verwenden für Dashboard (spart Bandbreite)
  3. Motion Events via ONVIF Events-Subscription
  4. 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.

Das hast du vielleicht verpasst