32,27
рейтинг
25 октября 2013 в 13:02

Разработка → Аппаратная защита от пиратства на Windows RT 8.1

Читая небольшую заметку на известном новостном ресурсе, увидел забавное вступление: «Новые планшеты Microsoft как будто созданы для того, чтобы их не покупать». Сомнительное, на мой взгляд, высказывание все же подкреплено нелегкой участью первой версии Surface RT и удивительной похожестью на него нового Surface 2. Однако, наша компания всегда в первую очередь шла на поводу клиентов.
image
Суть данной статьи, которая может показаться читателям Хабра немного провокационной, заключается в следующем: в конце 2013 года мы представляем новый продукт – электронный ключ Guardant Code micro для защиты приложений на Windows RT от пиратства. Кто-то, возможно, уже крутит пальцем у виска, но мы действительно предлагаем разработчикам серьезных (!) приложений под Windows RT защитить свой софт с помощью аппаратного ключа.

В статье вы узнаете:
1. Зачем нам понадобилась Windows RT 8.1 и чем плоха первая Windows RT с точки зрения наших задач
2. Как вся эта конструкция работает
3. Как ограниченность архитектуры не позволила нам обеспечить поддержку электронного ключа в виде microSD-карты
4. … и какими костылями ее можно обойти



Первый контакт


Еще до релиза Surface мы обсуждали возможность расширения списка наших целевых платформ на Windows RT. Все же определенная вера в Microsoft присутствовала, к тому же, у них есть деньги. С деньгами и правильным подходом раскрутить на рынке можно что угодно – хотя пока это у них не особо получается. При этом, Android тоже стал королем рынка смартфонов не за один день – так что время покажет правильность стратегии MS. В любом случае, мы раздобыли первую версию Surface еще год назад, пристально ее изучили и решили ничего не делать. Опасно лезть на несуществующий рынок с нашими продуктами – нужно было подождать результатов продаж Surface за пару кварталов и оценить интерес нашей категории клиентов.

Подождали, сделали выводы — и положили Surface в дальний ящик стола.

Такой статус проекта продержался до середины лета 2013 года, когда Microsoft [видимо от безысходности] решила дать толчок своему продукту и стала раздавать его практически бесплатно в сферу образования (я утрирую, конечно), а также сделала прайс-дроп для всех остальных. А в сфере образования, на самом деле, есть серьезные продукты и есть пиратство. Итак, вводные данные на июль 2013 года: есть «перспективная» платформа, есть заинтересованные клиенты, есть готовая база в виде проекта Guardant Mobile (ориентирован на Android с ключами microSD и USB). Приступаем к работе.

Неудачная попытка


image

Начали мы с нашего самого молодого и очень нишевого продукта: Guardant SD. Он представляет из себя карточку microSD с микроконтроллером (с аппаратным ускорением криптографии) и 4Гб памяти общего назначения. Эта вещь позволяет загружать в себя и исполнять на борту апплеты на Java с помощью весьма простого API. Архитектурно все очень похоже на наш ключ Guardant Code, и заточено под защиту приложений. Дорогих бизнес-приложений, например, «Мобильный официант» на Android-планшетах. Смысл такой: выносим важную часть Java-кода в апплет, встраиваем вызовы нашего API на место вырезанного кода – и все, часть кода теперь исполняется на карте, приложение помимо набора байтов получает некопируемый аппаратный артефакт и пиратству говорится решительное нет. Это работает на Android, Windows, Linux и мы пытались заставить это работать на Windows RT.

Не получилось. Подстава пришла из, скажем так, частичной ограниченности Windows RT.

Началось все с того, что замечательная, удобная и ориентированная на пользователя Windows RT категорически отказывается видеть файлы с флагом «скрытый». В принципе, зачем они нужны конкуренту айпада. Лирическое отступление: обмен с ключом происходит через обычный файл на карточке, который по умолчанию создается микроконтроллером в виде скрытого. Собственно, заставить Surface увидеть этот файл оказалось фактически невозможно.

Однако, в реальности это преодолимо. Если провести предпродажную подготовку карточки на любой другой платформе – можно насильно создать этот файл нескрытым, и микроконтроллер этот флаг не тронет. Конечно, первое же форматирование карты или удаление файла сделает ключ неработоспособным, но всегда можно заново этот файл создать.

Настоящая проблема пришла из другого места, хотя оно и рядом по сути. Происходило все так: мы спортировали основую часть кода (основу низкоуровневой библиотеки реализующей протокол обмена с карточкой), попытались послать в карточку APDU – и не можем продвинуться дальше первой команды. Ощущение, что микроконтроллер просто не хочет давать нам ответы. В общем, недолго нам пришлось рыться в интернете и терзать производителя микроконтроллера: в Windows RT обнаружилась неотключаемая буферизация чтения. Т.е. отправить в карточку запрос и зафлашить запись удается, а вот считать ответ нельзя – он его берет из буфера. Очевидно, Windows RT не может предположить, что файл на карточке может быть изменен изнутри ее, в нашем случае силами микроконтроллера. Сотня человеко-часов дорогостоящей разработки хотя и была практически спущена в унитаз, но позволила нам лучше изучить платформу

Естественно, мы перерыли всю документацию и интернет, пообщались с представителями Microsoft, но получили линейкой по рукам и оставили этот проект – нельзя, так нельзя.

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

1. Создаем на карточке файл для обмена размером 400 Мб.
2. Заставляем микропрограмму писать ответы микроконтроллера последовательно, а не все время в начало файла.

И вот оно, ненадежное и кривое – но работающее решение. При таком размере файла Windows RT не решается кэшировать его на чтение полностью, а так как ответ все время пишется по новому адресу в файле обмена – то он прекрасно считывается. Медленно — в силу размера файла – но считывается.

Несмотря на найденное решение, оно не пошло в продакшн из-за следующих опасений:

• Значительное увеличение RAM в будущих Surface может позволить Windows RT все же закэшировать этот файл на чтение целиком (или хотя бы значительными частями)
• Мы отъедаем заметную часть из 4Гб флеш-памяти карточки (а слот для microSD в планшете единственный)
• Когда 400Мб кончатся, ответы надо зациклить и писать в начало файла – а там уже что-то может быть закэшировано
• Работает все это довольно медленно

Конечно, мы порадовались своей изобретательности, но решили попробовать адаптировать Guardant Code micro USB к планшету. Благо, USB-порт там гарантирован и микро-ключ особо не мешается (см. картинку в начале статьи).

Вторая неудачная попытка


image
Решив, что c USB-ключом мы на эти проблемы не натолкнемся, мы ринулись в бой. Перевели ключ в HID-режим, воткнули в планшет – ключ определился, светодиод горит. Можно начинать обмен данными.

Нас опять ждало разочарование. В WinRT API не нашлось ни единого способа послать что-то в кастомное USB устройство, даже несмотря на нашу честную поддержку HID. Microsoft, конечно, проектировало Windows RT в качестве закрытой экосистемы (операционка, железо, безальтернативный магазин приложений) – но это уже бессовестная закрытость.

К концу июля ситуация сложилась следующая: руки опускаются, наши устройства к Surface не адаптировать, пора говорить клиентам решительное и обоснованное «нет».

И тут мы обращаем внимание на анонсированную Windows RT 8.1, и уже доступную Preview-версию.

Третья попытка, удачная


image
На Windows RT (в частности на Surface) реализован довольно принудительный Windows Update. Таким образом, можно предположить, что у большинства пользователей Surface (каким бы малым не казалось их число) обновление до 8.1 не заставит себя долго ждать. При этом, в новой версии нас ждал приятный сюрприз: поддержка работы с произвольными HID-устройствами. Как упоминалось ранее, наши современные электронные ключи могут работать как с проприетарным протоколом, требующим драйвера – так и в режиме HID. Работа без драйвера немного снижает скорость и защищенность обмена, но не создает никакой критичной ситуации. Так как для мобильных платформ мы поддерживаем только Code, защищенность все равно упирается в тот код, который клиент перенесет из приложения для исполнения его на борту ключа.

Процесс разработки для Windows 8.1 был предсказуемо успешным. Новые API от MS отрабатывали отлично даже в Preview версии, и мы не столкнулись ни с какими существенными сложностями. И наконец, с третьей попытки у нас появился продукт для защиты от пиратства на Windows RT.

Фактически, разработанная библиотека позволяет разбить приложение на две части:

1. Приложение для Windows Store
2. Ключевая интеллектуальная часть, вынесенная в ключ Code (до 50 000 строк кода на С).

Вызов кода происходит единственной функцией CodeRun, с входным и выходным буфером и селектором (чтобы сделать switch внутри и выбрать для исполнения нужный фрагмент кода). Разумеется, можно создавать сколь угодно хитрую логику с помощью буферов для максимального затруднения анализа.

По сути, получаем две вещи «по цене одной»: при удачном выборе загружаемого кода имеем защиту от анализа и модификации (важный код внутри ключа), и, разумеется, получаем некопируемую сущность в виде аппаратного ключа, составляющую неотъемлемую часть приложения.

И несколько важных вещей напоследок:

• В манифест приложения нужно руками добавлять строки для разрешения работы с донглом
• Даже самое безобидное обращение к ключу требует подтверждения через GUI-диалог, так что с библиотекой модульных тестов без GUI это даже не протестировать – будет исключение
• Нельзя обращаться к ключу из основного потока программы

На данной ноте свой рассказ про Windows RT и копирайт я заканчиваю. Насколько нужны и уместны аппаратные ключи защиты в конце 2013 года на еще не раскрутившейся платформе – покажет время. По меньшей мере MS смогла выручить $400 миллионов с продаж Surface в прошлом квартале, это уже хороший знак, особенно после списания $900 миллионов в позапрошлом.
Автор: @gumaster
Компания «Актив»
рейтинг 32,27

Комментарии (35)

  • +1
    То есть защите Windows Store доверять нельзя? Я просто не знаю, у меня ни разу не возникало желание поставить «пиратский» софт из Windows Store на свой комп или смартфон.
    Тем более этот «ключик» занимает и так единственный USB порт в планшете.
    • +4
      Если речь о массовом софте в Store — то там ключи ни к чему.

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

      В данном же конкретном случае продукт делался для сферы образования. Издатели учебников выставили жесткое требование — они отдадут электронные учебники для дистрибуции лишь в случае наличия аппаратной DRM.

      Т.е. это все для бизнес-сегмента рынка ПО, не для массового потребительского.
      • –2
        Я могу ошибаться, но разве Windows RT разве не операционная система для исключительно потребительского сегмента рынка? Для бизнес сегмента выпущена Windows 8.1 Pro.
        • 0
          Айпады тоже чисто потребительские устройства, однако их используют в медучреждениях со специфическим ПО, встраивают в спинки кресел самолетов и раздают пилотам, и конечно вышеуказанное ресторанное ПО (для нас это очень заметный рынок).

          Также с Windows RT. Когда MS стал предлагать их тысячами по бросовым ценам в сферу образования, они сразу обрели бизнес-значение — особенно в РФ.
        • +3
          Это неверное восприятие продукта. Нет никакого позиционирования на «исключительно потребительский» сегмент. Наоборот, обеспечивается функционирование в Enterprise инфраструктуре.
      • 0
        Т.е. это все для бизнес-сегмента рынка ПО, не для массового потребительского.

        Было бы интересно почитать где и для чего используют такой злой DRM, в массовом корпоративном софте (IBM, Oracle) защиты либо нет совсем, либо она сделана для галочки.
        • +4
          Софту, который не может существовать без серьезного внедрения и техподдержки со стороны производителя — защита действительно не нужна. Там зачастую больше денег зарабатывается не с лицензии, а с внедрения, персонализации и поддержки.

          Однако мы все таки в России :) И наши ключи используются для разнообразного софта ценового диапазона 10-50 т.р. за лицензию. Клиенты нам часто рассказывают как именно их пытаются обмануть — удивительные истории сообразительности российского бизнеса встречаются.

          В целом наш профиль это не ERP-системы, не СУБД и подобные вещи. У нас больше сметного, бухгалтерского, ресторанного, образовательного ПО, софт для систем видеонаблюдения очень большой рынок. Этот софт гораздо проще воровать, и там востребован «злой DRM» — всем хочется кушать.
          • +4
            Расскажите хотя бы пару таких историй, наиболее удивительных
        • 0
          Издатели учебников выставили жесткое требование — они отдадут электронные учебники для дистрибуции лишь в случае наличия аппаратной DRM.
          даже боюсь предположить.
      • +1
        За миллион другой можно заказать собственную разработку под свои нужды.
        • 0
          Звучит как «блин, программа стоит $1000, за такие деньги можно заказать написать аналог на фрилансе»
          • 0
            Что вы хотите этим сказать? Это хорошо или плохо?
            • 0
              Это наивно.
              • 0
                Почему наивно?
                Крупный софт, который стоит бешеных денег, врятли установил и все заработало. В любом случае придется производить какие-то доработки чтобы адаптировать его под нужды заказчика.( например самое простое выходные формы документов). Доработки — это деньги и время. Наверняка еще и поддержка платная. Если проблему нельзя решить удаленно, то выезд специалиста это еще куча денег. А если софт не крупный и не сложный, а просто стоит бешеных денег, то тут очевидно что выгоднее вложиться в собственную разработку. Как пример могу привести битрикс. Лицензия стоит денег, и чтобы настроить сам битрикс нужно подключать к этому делу специалиста. Это лишние затраты.
                Своя разработка это не только фриланс.
                Можно обойтись своими силами если есть свой отдел разработки. тут вам и техподдержка и доработка и разработка нового функционала за зарплату.
                Можно обратиться в компанию которая профессионально занимается разработкой ПО. Ну или на фриланс.
                В любом случае это все должно быть проанализировано и выбрано наиболее оптимальное решение.
                • 0
                  Компания с нулевым опытом в разработке ПО потратит больше денег, времени и нервов, пытаясь разрабатывать у себя.
  • +1
    Помню как в стародавние времена развлекались с дампами ключиков для старого тиллипада(не XL). Весело было, Tillypad брал из ключа только Id, и достаточно было прописать в дампе Id заблаговременно купленной лицензии с over 9000 рабочих мест, чтобы все новые установки тоже были почти анлимными.
    Глупая была защита.
  • 0
    А DESkey пробовали?
  • +14
    >> Зачем нам понадобилась Windows RT 8.1

    Вы не понимаете, нам совсем не нужна Windows RT любой версии ни при каких обстоятельствах…
    • 0
      Да ладно вам, фоторамки с ней довольно неплохие, хотя и несколько дорогие.
  • 0
    А в чем (в случае с карточкой) была проблема считывать/писать каждый раз в новый файл, добавив информацию о названии следующего, например?
    • +1
      Увы, это ограничение со стороны производителя микроконтроллера. Договариваться с ним можно, но не ради Windows RT :) Кроме того, вариант был бы не слишком приятный для использования — постоянное создание и удаление сотен файлов с разными названиями — тут и износ файловой системы, и хаос на флешке для пользователя, и потеря совместимости с другими платформами (где есть один скрытый файл).

      Хотя соглашусь, что при полном и неограниченном контроле над микропроцессором на самом низком уровне — это очень логичный вариант обойти ограничения платформы MS.
      • 0
        Тогда вопрос отпадает, думал контроллер ваш, либо есть возможность менять его поведение.
  • +4
    Если защита программы не взломана — значит такая программа никому не нужна. Любую реально хорошую и нужную программу обязательно сломают. Тогда зачем?! Мучить лицензионных пользователей? И заставлять техподдержку (втихаря или даже официально?) советовать скачать кряк? Когда же это кончится то уже?.. Другие модели нужны в этом бизнесе для получения прибыли…
    • +3
      И часто по вашему ломают узкоспециализированное ПО с защитой основанной на сложной криптографии?

      А что касается бизнес-модели, то тут проявляется некая особенность русского бизнеса: клиенту, зачастую нужно что-то материальное при приобретение подобного ПО. Аппаратный ключ очень хороший выход. И для тетеньки из бухгалтерии, которая видит, что по счету пришел товар, и для далеких от IT руководителей компании.

      По занятому USB, тут надо учитывать специфику использования планшета: исключительно рабочие цели, работа в конкретном приложении, по максимуму заблокированы все возможные настройки для конечного пользователя. То есть USB это скорее головная боль для безопасников в этом случае, не более.
  • +4
    имхо приложениям на самом деле нужно не тотальное избавление от пиратства, а _контролируемое_ пиратство.
  • 0
    А если открывать файл на запись, ничего не писать, потом закрывать, Windows всё равно читает закешированные значения?
    • 0
      Да, это не имеет значения. Все равно читает.

      Для отмены кеширования есть специальный флаг FILE_FLAG_NO_BUFFERING в функции CreateFile2.
      И проблема в том, что функцию CreateFile2 нельзя использовать для доступа к SD-карте — а WinRT API не имеет такого функционала.
  • 0
    Откуда такие странное требование-скрытый файл? Скрытый это с флагом hidden или его имя начинается с .?
    И кстати-какая там ФС?
  • 0
    > Фактически, разработанная библиотека позволяет разбить приложение на две части

    Насколько мне известно, подобные трюки явно запрещены правилами Windows Store. Или вы имели в виду Windows Store app смысле «приложение, написанное под WinRT API»?
  • –3
    Такой вопрос: Как вы себе представляете свою ЦА? Идиотами-богачами? iPad 2 стал коммерчески использоваться потому что цена $400-500 и стабилен под уже имеющей хорошую репутацию iOS + уже развитый App Market. Surface 1/2 стоит в два-три раза больше, имеет отстойный App Market, с отстойными приложениями (когда приложение от самой Microsoft не работает на машине это более чем плачевно). Одним только сливом (себе в убыток?) в сферу образования Microsoft рынок не захватит, а значит Surface вымрет как динозавр.
    Не бросайте деньги на ветер, ведь умно поступили сначала же:
    "Подождали, сделали выводы — и положили Surface в дальний ящик стола."
    • +2
      Сколько-сколько стоит Surface?
      www.microsoftstore.com/store/msusa/en_US/html/pbPage.PDPS/productID.286870700
      • 0
        Пардон, я говорил по памяти. Сейчас за ценами не слежу, а во время запуска была ~ $900 за PRO, опять же просят $1000-1200 за Surface 2 в разных конфигурациях.
        • +2
          Просить можно хоть 10000$, а продают сейчас второй Surface от $449.00
          Какая вообще связь между версией Pro и айпадом?
          • 0
            Ну планшет же.
  • +1
    Когда же переведутся эти… создающие больше проблем своим потребителям чем пиратам,
    Каким же их пальцем их делают… то аппаратные ключи на планшеты… то защиту реализуют через dcom в кросплатформенную 1С 8.2…

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка