Strumenti Domanda download di Madbrosx

DarioGlass

Lurker
Iscritto dal
17 Mar 2026
Messaggi
16
Reazioni
0
Riposto dal thread di madbrosx, qui è più adatto
Se a qualcuno interessa, ho la definizione yaml dell'API. La pusho in un repo stasera insieme a qualche test.
Qualsiasi aiuto è apprezzato.
 
Purtroppo per ora non funzionerà... qui sotto i dettagli tecnici :
Markdown sotto ## Come funziona la protezione — difese a strati
Ci sono **tre livelli indipendenti**, ognuno dei quali sarebbe sufficiente da solo. Insieme rendono il contenuto praticamente impossibile da salvare a piena qualità senza la collaborazione dell'hardware CDM.
---
### Livello 1 — Crittografia del trasporto (AES-GCM a livello applicativo)
Ogni risposta HTTP del proxy (`/api/secure-proxy/…`) è cifrata con AES-256-GCM **a livello applicativo**, sopra il normale trasporto HTTPS. Il JavaScript del player tiene una chiave di sessione, decifra il testo cifrato dopo che arriva e solo allora passa i byte grezzi al browser. Se intercetti la rete (Wireshark, HAR, proxy), ottieni solo testo cifrato inutile per tutto — playlist m3u8, segmenti init, segmenti media, tutto.
**Cosa blocca**: qualsiasi intercettazione passiva della rete.
---
### Livello 2 — Watermark (URL di stream specifici per utente)
Prima ancora che la decifratura conti, il server imprime un watermark visibile instradando ogni utente su un percorso URL univoco:
```
/api/secure-proxy/wm-stream/{64-char token}/{userId}/{resolution}/seg.m4s
```
Il segmento `{userId}` dice al server di inserire l'identificativo dell'utente nei fotogrammi del video al momento della codifica. Quindi anche se in qualche modo catturassi il video, avrebbe i dati del tuo account incorporati — risalibile a te.
Esiste anche una versione pulita dello stesso stream a:
```
/api/secure-proxy/stream/{64-char token}/{resolution}/seg.m4s
```
Entrambi gli URL sono validi e restituiscono lo stesso contenuto senza l'overlay del watermark.
**Cosa blocca**: la condivisione di video catturati (identifica l'account di origine).
---
### Livello 3 — Widevine CENC DRM (la parte inviolabile)
Questa è la protezione principale. I segmenti fMP4 che il player decifra da AES-GCM **non sono video in chiaro** — sono a loro volta cifrati con [Common Encryption (CENC)](https://www.w3.org/TR/eme-stream-mp4/) a livello di sample. Ogni fotogramma video è cifrato singolarmente con una chiave custodita dal Widevine CDM (Content Decryption Module).
Il CDM è un **plugin binario nativo** che gira in un enclave isolato via hardware. Riceve i sample cifrati, li decifra con le chiavi ottenute dal server di licenze e scrive i fotogrammi decodificati **direttamente nel compositor della GPU** — completamente fuori dalla portata di JavaScript. I pixel decifrati non esistono mai in memoria indirizzabile che una pagina web o un'estensione possa toccare.
Puoi verificarlo guardando la struttura grezza dell'fMP4:
- box `stsd`: il tipo di sample entry è `encv` (video cifrato), non `avc1`
- box `moov`: contiene un box `pssh` con il system ID di Widevine (`edef8ba9…`)
- Ogni `moof` (frammento media) contiene box `senc`, `saiz`, `saio` — vettori di inizializzazione e key ID per sample
- Il payload `mdat`: i parameter set H.264 (SPS/PPS) sono in chiaro, ma ogni NAL unit di slice è cifrata — entropia ≈ 5,7 bit/byte contro ≈ 7,9 per dati completamente compressi
**Cosa blocca**: qualsiasi approccio che intercetti i dati dentro il motore JavaScript del browser.
---
## Perché è quasi impossibile
```
Network wire
│ HTTPS (TLS) ← standard, niente di speciale
▼
Proxy server returns
│ AES-GCM encrypted blob ← Livello 1
▼
Player JS decrypts with session key
│ fMP4 segments ← accessibile qui, ma…
▼
appendBuffer() ← qui abbiamo messo l'hook
│ CENC-encrypted samples ← il Livello 3 è ancora attivo
▼
Widevine CDM (native, hardware-isolated)
│ Decrypted frames → GPU compositor ← il Livello 3 decifra QUI
▼
Screen pixels
```
L'unico punto in cui puoi intercettare **video completamente decifrato e visualizzabile** è dopo il compositor della GPU — cioè lo schermo stesso. È esattamente quello che fa `chrome.tabCapture`: cattura l'output renderizzato del compositor. Ma a quel punto stai ricodificando ciò che è già sullo schermo, quindi perdi una generazione di qualità (e devi registrare in tempo reale).
---
## I passaggi che abbiamo fatto, in ordine
| Passo | Cosa abbiamo provato | Risultato |
|--- | --- | ---|
| **1. Analisi HAR** | Abbiamo guardato il traffico di rete per capire la struttura degli URL | Trovato il pattern di URL `wm-stream` / `stream` e la crittografia AES-GCM su tutte le risposte |
| **2. Hook di fetch (primo tentativo)** | Intercettato `window.fetch` per riscrivere gli URL `wm-stream` → URL `stream` | Le riscritture venivano scartate in silenzio — bug di aliasing di `arguments` in strict mode: riassegnare il parametro `input` non aggiornava `arguments[0]`, quindi `.apply(this, arguments)` inviava l'URL originale |
| **3. Fix del bug arguments** | Passato a `_origFetch.call(this, input, init)` invece di `.apply(this, arguments)` | Ora la rimozione del watermark funziona davvero |
| **4. Errore CSP** | L'estensione stava iniettando un
 
Ovvio che lo è! Come ho detto nel primo post è fatto in vibecoding, ma se non sai un minimo come funziona, anche con un'IA non vai oltre il primo passo. E non l'avrei fatto in una sera.
 
Quindi, giusto per confermare: se compro un video da loro, non c'è modo di scaricarlo? Potrei solo guardarlo in streaming sul loro sito?
 
Come fanno a condividere i video se non c'è modo di scaricarli dal sito?
 
Indietro
Top