Инструменты Вопрос скачать Madbrosx

  • Автор темы Автор темы DarioGlass
  • Дата начала Дата начала

DarioGlass

Лёркер
Регистрация
17.03.2026
Сообщения
16
Реакции
0
Репощу из темы madbrosx, тут она больше подходит
Если кому интересно, у меня есть yaml-описание API. Сегодня вечером залью в репозиторий вместе с тестовыми наработками.
Любая помощь приветствуется.
 
репо создан, скинь свой ник на github, я тебя приглашу
 
К сожалению, пока не сработает... ниже технические детали :
Markdown ниже ## Как работает защита — многоуровневая оборона
Есть **три независимых слоя**, и каждого из них по отдельности было бы достаточно. Вместе они делают практически невозможным сохранить контент в полном качестве без участия железа CDM.
---
### Слой 1 — Шифрование транспорта (AES-GCM на уровне приложения)
Каждый HTTP-ответ прокси (`/api/secure-proxy/…`) шифруется AES-256-GCM **на уровне приложения**, поверх обычного HTTPS-транспорта. JavaScript плеера хранит ключ сессии, расшифровывает шифртекст после получения и только потом отдаёт сырые байты браузеру. Если перехватишь сеть (Wireshark, HAR, прокси), получишь бесполезный шифртекст на всё — m3u8-плейлисты, init-сегменты, медиасегменты, вообще всё.
**Что это блокирует**: любой пассивный перехват сети.
---
### Слой 2 — Водяные знаки (пользовательские URL стримов)
Ещё до того, как расшифровка вообще имеет значение, сервер вжигает видимый водяной знак, направляя каждого пользователя по уникальному пути URL:
```
/api/secure-proxy/wm-stream/{64-char token}/{userId}/{resolution}/seg.m4s
```
Сегмент `{userId}` говорит серверу вшить идентификатор пользователя в кадры видео при кодировании. То есть даже если ты каким-то образом захватишь видео, в нём будут данные твоего аккаунта — отследят до тебя.
Есть также чистая версия того же стрима по адресу:
```
/api/secure-proxy/stream/{64-char token}/{resolution}/seg.m4s
```
Оба URL валидны и отдают тот же контент, только без оверлея с водяным знаком.
**Что это блокирует**: раздачу захваченного видео (оно указывает на исходный аккаунт).
---
### Слой 3 — Widevine CENC DRM (непробиваемая часть)
Это основная защита. fMP4-сегменты, которые плеер расшифровывает из AES-GCM, — **не обычное видео**, они сами зашифрованы [Common Encryption (CENC)](https://www.w3.org/TR/eme-stream-mp4/) на уровне сэмплов. Каждый кадр видео шифруется отдельно ключом, который хранится в Widevine CDM (Content Decryption Module).
CDM — это **нативный бинарный плагин**, работающий в аппаратно изолированном анклаве. Он получает зашифрованные сэмплы, расшифровывает их ключами с лицензионного сервера и пишет декодированные кадры **прямо в композитор GPU** — полностью вне досягаемости JavaScript. Расшифрованные пиксели никогда не попадают в адресуемую память, до которой может дотянуться веб-страница или расширение.
Можешь убедиться, посмотрев на сырую структуру fMP4:
- бокс `stsd`: тип sample entry — `encv` (зашифрованное видео), а не `avc1`
- бокс `moov`: содержит бокс `pssh` с system ID Widevine (`edef8ba9…`)
- Каждый `moof` (медиафрагмент) содержит боксы `senc`, `saiz`, `saio` — векторы инициализации и key ID для каждого сэмпла
- Payload в `mdat`: наборы параметров H.264 (SPS/PPS) открыты, но каждая slice NAL unit зашифрована — энтропия ≈ 5,7 бит/байт против ≈ 7,9 у полностью сжатых данных
**Что это блокирует**: любой подход, перехватывающий данные внутри JavaScript-движка браузера.
---
## Почему это почти невозможно
```
Network wire
│ HTTPS (TLS) ← стандарт, ничего особенного
▼
Proxy server returns
│ AES-GCM encrypted blob ← Слой 1
▼
Player JS decrypts with session key
│ fMP4 segments ← тут доступно, но…
▼
appendBuffer() ← вот тут мы зацепились хуком
│ CENC-encrypted samples ← Слой 3 всё ещё работает
▼
Widevine CDM (native, hardware-isolated)
│ Decrypted frames → GPU compositor ← Слой 3 расшифровывает ЗДЕСЬ
▼
Screen pixels
```
Единственное место, где можно перехватить **полностью расшифрованное, пригодное для показа видео** — после композитора GPU, то есть сам экран. Именно это делает `chrome.tabCapture`: захватывает отрендеренный выход композитора. Но на этом этапе ты перекодируешь то, что уже на экране, так что теряешь одно поколение качества (и писать надо в реальном времени).
---
## Шаги, которые мы прошли, по порядку
| Шаг | Что пробовали | Результат |
|--- | --- | ---|
| **1. Анализ HAR** | Посмотрели сетевой трафик, чтобы понять структуру URL | Нашли паттерн URL `wm-stream` / `stream` и AES-GCM-шифрование на всех ответах |
| **2. Хук fetch (первая попытка)** | Перехватили `window.fetch`, чтобы переписывать URL `wm-stream` → URL `stream` | Переписывание молча отбрасывалось — баг алиасинга `arguments` в strict mode: переприсваивание параметра `input` не обновляло `arguments[0]`, поэтому `.apply(this, arguments)` отправлял исходный URL |
| **3. Фикс бага с arguments** | Заменили `.apply(this, arguments)` на `_origFetch.call(this, input, init)` | Удаление водяного знака теперь реально работает |
| **4. Ошибка CSP** | Расширение внедряло
 
Конечно! Как я и говорил в первом посте, это навайбкожено, но если не понимаешь хоть немного, как это работает, то даже с ИИ дальше первого шага не уйдёшь. И за один вечер я бы это не сделал.
 
То есть просто уточню: если я куплю у них видео, скачать его никак нельзя? Смотреть можно будет только стримом на их сайте?
 
Насколько я знаю, ответ по-прежнему да, только стрим :(
 
Как они тогда делятся видео, если с сайта их никак не скачать?
 
Назад
Верх