Как стать автором
Обновить

Под чёрным флагом пост, или Как я не выложил ваш видеокурс на трекер

Время на прочтение7 мин
Количество просмотров97K
captain_flint.jpg

Привет, Хабр! В трудное время мы живем, не находите? Люди эгоистичны, не признают ценность чужих трудов, любят приходить сразу на все готовое. Интеллектуальная собственность для многих вообще выглядит не более чем бюрократической шуткой: «Как же это так, информация должна быть свободной, ведь это ИН-ФОР-МА-ЦИ-Я!!!11». Согласен, в идеале это так. Эти ваши анархии, мятежнические настроения и философии андерграундных хакеров/пиратов, стоящих на страже прав простого люда, мне не чужды. Но парадокс в том, что истинная справедливость – это еще и отплачивать всем за их труд и заслуги, поэтому в большинстве случаев пиратство – антагонистическое предприятие. Но вот политика предоставления услуг по защите интеллектуальной собственности, предлагаемая таким замечательным вендором, как ИнфоПротектор, вызвал у меня праведный гнев.

Под катом история о том, как я приобрел платный видеокурс, выпал в осадок после осознания того, что я не смогу сохранить видеоролики из оного для повторного просмотра в будущем, разозлился на тех, кто скропал этот квазизащитный софт (который, ко всему прочему, безжалостно лагает и жрет много ресурсов машины) и решил немного восстановить справедливость… Не нарушая закон, конечно же. Amen.
ДИСКЛЕЙМЕР. Все нижеизложенное опубликовано в исследовательских целях и призвано выполнить исключительно образовательную функцию. Автор не несет ответственности за неправомерное использование информации из данного поста и ни в коем случае не призывает воспринимать его как «инструкцию к действию».

Как все было


Выдались свободные выходные, и решил я выложить честно заработанные XXXX р. на пятичасовой видеокурс. Назовем его «Курсом повышения квалификации для работника общепита», чтобы не возникло никаких параллелей. Вообще, я не сторонник восприятия информации через видеоуроки (о-о-очень контрпродуктивно), но здесь прямо не удержался – пал жертвой красочных рекламных баннеров.

Оплатил, на почту прилетело письмо, содержащее ссылки на загрузку материалов, придуманные (ссылки) рандомайзером ИнфоПротектора и выплюнутые на близлежащий CDN. В теле письма – благодарности автора за приобретение и регистрационный ключ, которым предлагалось активировать покупку.

Скачиваю архив. В архиве папка. В папке исполняемый файл. В исполняемом файле яйцо. Запускаю exe'шник – здесь-то мне и выложили всю правду, которая в свободном пересказе звучит примерно так (читать гнусавым голосом):
К данному видеокурсу применен механизм защиты цифровой информации компании «ИнфоПротектор»; для первого запуска (читать «активации продукта») необходим доступ в Интернет; просмотр видеороликов возможен только из нашей программы, из нашего плеера; установка видеокурса возможна только на двух компьютерах (видеокурс привязывается к конфигурации окружения ОС / железа, как выяснится позже).

Вот на этом моменте я немного огорчился. Т. е. мало того, что прямо с порога меня обозвали бесчестным человеком, которому лишь бы лишить чужой труд монетизации, так еще и курс, за который я выложил приличную сумму, будет доступен мне только до переустановки системы.

«Так не пойдет», – решил я и начал серию экспериментов.

Ограничения, налагаемые ИнфоПротектором


Чтобы не тратить время зря, для начала я обратился ко всемирной паутине, чтобы узнать, что уже люди накопали о механизме защиты этих ребят (все тонкости работы защиты, разумеется, не раскрываются).

Что удалось узнать:

  1. Ключ активации генерируется случайным образом при оплате курса и используется для того, чтобы быть аутентифицированным сервером, который в случае успеха высылает клиенту AES-ключ для расшифрования видеоматериалов, доступных из-под кастомного плеера компании. Реверсить приложение долго и максимально трудоемко (т. е. нецелесообразно для такого рода задачи), поэтому этот путь я решил оставить.
  2. Использование средств записи экрана безжалостно блокируется по целому ряду направлений: на одном хосте нельзя одновременно запустить плеер и любой screen capturer, т. к. программа детектит запущенные процессы с их метаданными: названия заголовков окон; описание исполняемых файлов; названия вендоров, вшитых в exe'шники приложений захвата; даже браузер, открытый на страничке, в названии которой есть слово «Fraps», к примеру, также является предметом для алерта и завершения работы плеера.
  3. Песочницы, виртуальные машины и стриминг контента с удаленных подключений (rdesktop, RAdmin, TeamViewer) тоже не вариант – не по годам умный софт умеет определять и их, самоубиваясь при каждом удобном случае.

Но несмотря на последние два пункта самым реальным вектором атаки остается все же запись экрана, реализовать которую можно попробовать несколькими способами:

  1. Найти программу для захвата, которая бы не содержала слов-маячков в своем названии/производителе/описании, которую не знает ИнфоПротектор, и на которую, следовательно, последний не будет триггериться. Минусы: долго, скучно и не факт, что в принципе выполнимо.
  2. Найти опенсорс-продукт, обладающий нужным функционалом, и скомпилировать свою версию захватчика экрана, заменив в исходниках все, что защите ИнфоПротектора в теории может показаться подозрительным. Минусы: долго, скучно, трудоемко (обычно такие проекты довольно громоздки, состоят из сотен (?) файлов и имеют кучи зависимостей в исходниках, поэтому просто Ctrl-H не прокатит, это тебе не mimikatz править, чтобы Windows Defender не стриггерить).
  3. Написать свое решение на чем-нибудь скриптовом, чтобы не рисковать со скомпилированным исполняемым файлом неизвестной природы (неизвестно, что на это скажет эта зараза), реализующее тривиальный функционал быстрого снятия скриншотов с выбранной области экрана (благо, ИнфоПротектор это позволяет), и отдельно записать звуковую дорожку, что тоже оказалось легитимным и максимально простым действом.

Минусов третьего пункта не обнаружилось, поэтому можно приступать.

Screenshot the Planet!


Первое: разберемся, как автоматизировать процесс создания тучи скриншотов с помощью скрипта. Конечно, это: Python, и еще OpenCV, и еще MSS, и еще PIL.

Процесс предельно прост:

  1. Выставим размер окна плеера, равным разрешению выходного видео, которое мы хотели бы иметь (логично учесть место для элементов управления скриптом – окно с терминалом, например, которое не должно попасть в область записи). Это можно сделать такой чудесной софтиной.
  2. Расположим окно плеера в такой позиции, как найти которую было бы проще всего объяснить скрипту – правый нижний угол экрана (думаю, система отсчета, связанная с границами экрана — самый удобный вариант).
  3. Натравим уже написанный скрипт (который будет чуть ниже) делать скриншоты этой области.
  4. Не трогаем эту неуклюжую систему в процессе всего проигрывания видео.

Скрипт под спойлером:

fckInfoprotector.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Usage: python3 fckInfoprotector.py <WIDTH> <HEIGHT>

import sys

import numpy as np
import cv2
from mss.windows import MSS as mss
from PIL import Image


class Capturer:

	def __init__(self, w, h, resolution='1080p', fps=24.975):
		if resolution == '1080p':
			self.monitor = {
				'top': 1080 - h,
				'left': 1920 - w,
				'width': w,
				'height': h
			}

		elif resolution == '1440p':
			self.monitor = {
				'top': 1440 - h,
				'left': 2560 - w,
				'width': w,
				'height': h
			}

		else:
			raise ValueError('Unsupported monitor resolution')

		self.sct = mss()

		self.vid = cv2.VideoWriter(
			'output.avi',
			cv2.VideoWriter_fourcc(*'XVID'),
			fps=fps,
			frameSize=(
				self.monitor['width'],
				self.monitor['height']
			)
		)

	def mainloop(self):
		while True:
			sct_img = self.sct.grab(self.monitor)
			sct_img_size = (sct_img.width, sct_img.height)

			img = Image.frombytes(
				'RGB',
				sct_img_size,
				sct_img.rgb
			)

			frame = cv2.cvtColor(
				np.array(img),
				cv2.COLOR_BGR2RGB
			)

			self.vid.write(frame)


if __name__ == '__main__':
	if len(sys.argv) != 3:
		print(f'Usage: {sys.argv[0]} <WIDTH> <HEIGHT>')
		sys.exit()

	w, h = (int(x) for x in sys.argv[1:3])
	capturer = Capturer(w, h, fps=50.0)

	try:
		capturer.mainloop()
	except KeyboardInterrupt:
		print('Interrupted')


Записать аудиодорожку


Ну здесь совсем элементарно: Windows позволяет сделать это встроенными средствами.

Для Windows 7: Пуск -> Панель управления -> Оборудование и звук -> Звук -> Запись -> Показать отключенные устройства и выбрать «Стерео микшер»:

1.png

Теперь при начале записи к нашей и без того неуклюжей конструкции добавляется еще такая кнопка, на которую тоже нужно нажимать:

2.png


Объединить две половинки целого


После того, как видеоряд и звуковое сопровождение готовы, остается эту конструкцию склеить. Будем делать это в чудесном видеоредакторе под название VirtualDub.

Откроем видео:

3.png

Добавим аудиодорожку:

4.png

Изменим фреймрейт видео, т. к. в оригинальном плеере он оказался непостоянным. Поэтому, чтобы видео и аудио имели одну и ту же длину, снизим частоту кадров с 50-и (мы специально взяли с запасом, когда записывали) до $X$, где $X$ рассчитывается по формуле:

$X=captured\_video\_duration\times 50\div original\_video\_duration$


5.png

Да, при таком подходе могут быть незначительные рассинхроны голоса и картинки, но это вынужденные жертвы.

Добавим компрессию видео по желанию и F7! Получили ролик из видеокурса.

Под занавес


Почему этот пост наполнен таким негодованием? Постараюсь объяснить.

Во-первых, при покупке курса я нигде не нашел упоминаний о том, что я буду ограничен в его использовании всеми возможными способами. Я специально вернулся на страничку магазина и попытался найти в договоре оферты хоть что-нибудь, что укажет мне на то, что для использования курса я буду вынужден быть привязанным к конкретному персональному компьютеру. Нет, в соглашении только стандартные слова.

Во-вторых, мне непонятна логика друзей из ИнфоПротектора: зачем столько усилий и кривой софт (который жаловался даже на дрова NVIDIA, как на средство записи экрана!), если в конце концов, у злоумышленника, которому лень будет заниматься тем бредом, что описал здесь я, просто есть возможность сделать «экранку», поставив перед монитором камеру на штативе?

В-третьих, многие скажут: «Так ведь DVD-диски тоже были защищены от копирования!». Да, все так. Только вот диск я мог взять куда угодно, посмотреть его столько раз, сколько мне нужно (имею право), и он работал бы так же исправно, сколько компьютеров я бы не поменял.

Поэтому предлагаю ИнфоПротектору более действенное решение: не только вырубать плеер, если обнаружен инстанс процесса интерпретатора скриптового языка, но и поставить обязательным условием наличие у купившего курс веб-камеры, к которой на той стороне будет прикреплен сотрудник (пускай, низшего звена), рьяно фиксирующий, не выполняет ли зритель противоправных действий. Думаю, это решит множество проблем с пиратством (нет).

Закон и Великий Договор я не нарушил, материалы на просторы Интернета не выкладывал и не собираюсь, единственное мое преступление – любопытство.

Йо-хо, громче черти!
Теги:
Хабы:
Всего голосов 205: ↑203 и ↓2+201
Комментарии255

Публикации

Истории

Работа

Ближайшие события

2 – 18 декабря
Yandex DataLens Festival 2024
МоскваОнлайн
11 – 13 декабря
Международная конференция по AI/ML «AI Journey»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань