Привет, Хабр! В трудное время мы живем, не находите? Люди эгоистичны, не признают ценность чужих трудов, любят приходить сразу на все готовое. Интеллектуальная собственность для многих вообще выглядит не более чем бюрократической шуткой: «Как же это так, информация должна быть свободной, ведь это ИН-ФОР-МА-ЦИ-Я!!!11». Согласен, в идеале это так. Эти ваши анархии, мятежнические настроения и философии андерграундных хакеров/пиратов, стоящих на страже прав простого люда, мне не чужды. Но парадокс в том, что истинная справедливость – это еще и отплачивать всем за их труд и заслуги, поэтому в большинстве случаев пиратство – антагонистическое предприятие. Но вот политика предоставления услуг по защите интеллектуальной собственности, предлагаемая таким замечательным вендором, как ИнфоПротектор, вызвал у меня праведный гнев.
Под катом история о том, как я приобрел платный видеокурс, выпал в осадок после осознания того, что я не смогу сохранить видеоролики из оного для повторного просмотра в будущем, разозлился на тех, кто скропал этот квазизащитный софт (который, ко всему прочему, безжалостно лагает и жрет много ресурсов машины) и решил немного восстановить справедливость… Не нарушая закон, конечно же. Amen.
ДИСКЛЕЙМЕР. Все нижеизложенное опубликовано в исследовательских целях и призвано выполнить исключительно образовательную функцию. Автор не несет ответственности за неправомерное использование информации из данного поста и ни в коем случае не призывает воспринимать его как «инструкцию к действию».
Как все было
Выдались свободные выходные, и решил я выложить честно заработанные XXXX р. на пятичасовой видеокурс. Назовем его «Курсом повышения квалификации для работника общепита», чтобы не возникло никаких параллелей. Вообще, я не сторонник восприятия информации через видеоуроки (о-о-очень контрпродуктивно), но здесь прямо не удержался – пал жертвой красочных рекламных баннеров.
Оплатил, на почту прилетело письмо, содержащее ссылки на загрузку материалов, придуманные (ссылки) рандомайзером ИнфоПротектора и выплюнутые на близлежащий CDN. В теле письма – благодарности автора за приобретение и регистрационный ключ, которым предлагалось активировать покупку.
Скачиваю архив. В архиве папка. В папке исполняемый файл.
К данному видеокурсу применен механизм защиты цифровой информации компании «ИнфоПротектор»; для первого запуска (читать «активации продукта») необходим доступ в Интернет; просмотр видеороликов возможен только из нашей программы, из нашего плеера; установка видеокурса возможна только на двух компьютерах (видеокурс привязывается к конфигурации окружения ОС / железа, как выяснится позже).
Вот на этом моменте я немного огорчился. Т. е. мало того, что прямо с порога меня обозвали бесчестным человеком, которому лишь бы лишить чужой труд монетизации, так еще и курс, за который я выложил приличную сумму, будет доступен мне только до переустановки системы.
«Так не пойдет», – решил я и начал серию экспериментов.
Ограничения, налагаемые ИнфоПротектором
Чтобы не тратить время зря, для начала я обратился ко всемирной паутине, чтобы узнать, что уже люди накопали о механизме защиты этих ребят (все тонкости работы защиты, разумеется, не раскрываются).
Что удалось узнать:
- Ключ активации генерируется случайным образом при оплате курса и используется для того, чтобы быть аутентифицированным сервером, который в случае успеха высылает клиенту AES-ключ для расшифрования видеоматериалов, доступных из-под кастомного плеера компании. Реверсить приложение долго и максимально трудоемко (т. е. нецелесообразно для такого рода задачи), поэтому этот путь я решил оставить.
- Использование средств записи экрана безжалостно блокируется по целому ряду направлений: на одном хосте нельзя одновременно запустить плеер и любой screen capturer, т. к. программа детектит запущенные процессы с их метаданными: названия заголовков окон; описание исполняемых файлов; названия вендоров, вшитых в exe'шники приложений захвата; даже браузер, открытый на страничке, в названии которой есть слово «Fraps», к примеру, также является предметом для алерта и завершения работы плеера.
- Песочницы, виртуальные машины и стриминг контента с удаленных подключений (rdesktop, RAdmin, TeamViewer) тоже не вариант – не по годам умный софт умеет определять и их, самоубиваясь при каждом удобном случае.
Но несмотря на последние два пункта самым реальным вектором атаки остается все же запись экрана, реализовать которую можно попробовать несколькими способами:
- Найти программу для захвата, которая бы не содержала слов-маячков в своем названии/производителе/описании, которую не знает ИнфоПротектор, и на которую, следовательно, последний не будет триггериться. Минусы: долго, скучно и не факт, что в принципе выполнимо.
- Найти опенсорс-продукт, обладающий нужным функционалом, и скомпилировать свою версию захватчика экрана, заменив в исходниках все, что защите ИнфоПротектора в теории может показаться подозрительным. Минусы: долго, скучно, трудоемко (обычно такие проекты довольно громоздки, состоят из сотен (?) файлов и имеют кучи зависимостей в исходниках, поэтому просто Ctrl-H не прокатит, это тебе не mimikatz править, чтобы Windows Defender не стриггерить).
- Написать свое решение на чем-нибудь скриптовом, чтобы не рисковать со скомпилированным исполняемым файлом неизвестной природы (неизвестно, что на это скажет эта зараза), реализующее тривиальный функционал быстрого снятия скриншотов с выбранной области экрана (благо, ИнфоПротектор это позволяет), и отдельно записать звуковую дорожку, что тоже оказалось легитимным и максимально простым действом.
Минусов третьего пункта не обнаружилось, поэтому можно приступать.
Screenshot the Planet!
Первое: разберемся, как автоматизировать процесс создания тучи скриншотов с помощью скрипта. Конечно, это: Python, и еще OpenCV, и еще MSS, и еще PIL.
Процесс предельно прост:
- Выставим размер окна плеера, равным разрешению выходного видео, которое мы хотели бы иметь (логично учесть место для элементов управления скриптом – окно с терминалом, например, которое не должно попасть в область записи). Это можно сделать такой чудесной софтиной.
- Расположим окно плеера в такой позиции, как найти которую было бы проще всего объяснить скрипту – правый нижний угол экрана (думаю, система отсчета, связанная с границами экрана — самый удобный вариант).
- Натравим уже написанный скрипт (который будет чуть ниже) делать скриншоты этой области.
- Не трогаем эту неуклюжую систему в процессе всего проигрывания видео.
Скрипт под спойлером:
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: Пуск -> Панель управления -> Оборудование и звук -> Звук -> Запись -> Показать отключенные устройства и выбрать «Стерео микшер»:
Теперь при начале записи к нашей и без того неуклюжей конструкции добавляется еще такая кнопка, на которую тоже нужно нажимать:
Объединить две половинки целого
После того, как видеоряд и звуковое сопровождение готовы, остается эту конструкцию склеить. Будем делать это в чудесном видеоредакторе под название VirtualDub.
Откроем видео:
Добавим аудиодорожку:
Изменим фреймрейт видео, т. к. в оригинальном плеере он оказался непостоянным. Поэтому, чтобы видео и аудио имели одну и ту же длину, снизим частоту кадров с 50-и (мы специально взяли с запасом, когда записывали) до , где рассчитывается по формуле:
Да, при таком подходе могут быть незначительные рассинхроны голоса и картинки, но это вынужденные жертвы.
Добавим компрессию видео по желанию и F7! Получили ролик из видеокурса.
Под занавес
Почему этот пост наполнен таким негодованием? Постараюсь объяснить.
Во-первых, при покупке курса я нигде не нашел упоминаний о том, что я буду ограничен в его использовании всеми возможными способами. Я специально вернулся на страничку магазина и попытался найти в договоре оферты хоть что-нибудь, что укажет мне на то, что для использования курса я буду вынужден быть привязанным к конкретному персональному компьютеру. Нет, в соглашении только стандартные слова.
Во-вторых, мне непонятна логика друзей из ИнфоПротектора: зачем столько усилий и кривой софт (который жаловался даже на дрова NVIDIA, как на средство записи экрана!), если в конце концов, у злоумышленника, которому лень будет заниматься тем бредом, что описал здесь я, просто есть возможность сделать «экранку», поставив перед монитором камеру на штативе?
В-третьих, многие скажут: «Так ведь DVD-диски тоже были защищены от копирования!». Да, все так. Только вот диск я мог взять куда угодно, посмотреть его столько раз, сколько мне нужно (имею право), и он работал бы так же исправно, сколько компьютеров я бы не поменял.
Поэтому предлагаю ИнфоПротектору более действенное решение: не только вырубать плеер, если обнаружен инстанс процесса интерпретатора скриптового языка, но и поставить обязательным условием наличие у купившего курс веб-камеры, к которой на той стороне будет прикреплен сотрудник (пускай, низшего звена), рьяно фиксирующий, не выполняет ли зритель противоправных действий. Думаю, это решит множество проблем с пиратством (нет).
Закон и Великий Договор я не нарушил, материалы на просторы Интернета не выкладывал и не собираюсь, единственное мое преступление – любопытство.
Йо-хо, громче черти!