Защита shareware приложения


Защита android приложений, shareware и прочее

Вопрос

Migel 0

Migel 0

  • Новичок
  • Пользователи
  • 4 сообщения

Приветствую всех коллег по программерскому ремеслу!

Всю жизнь писал программы на Delphi 7 под Windows, защищал их программой ASProtect (ключ после покупки записывается в реестр и программа работает в полноценном режиме), и вот жизнь заставила переводить проекты на операционку Android.

У меня множество вопросов, и я буду благодарен, если здешние гуру ответят на них:

1. Как и чем защищаются shareware программы под Android? Есть ли сторонние tools или можно обойтись встроенными в RAD средствами? (думаю, что первое лучше будет)

2. Насколько легко/просто взломать apk-файл? Думаю, что проще, чем exe под Windows. Возникла даже идея в демо-версии на этапе сборки отключить ряд функций ( <$IFDEF>в помощь), а после покупки давать ссылку на другой apk-файл, тогда просто нет смысла взламывать триальную версию.

3. Как идет взаимодействие с Google Play? Можно ли этот процесс автоматизировать? Допустим, человек оплачивает программу, а Google Play сам генерирует код (на основе моего сценария, конечно) и высылает его пользователю.

4. Есть ли в android-е какая-то защита от перевода системного времени смартфона? Или лучше забить на эту идею и пусть shareware программа работает не 15 дней, а вечно.

Изменено 31 октября, 2020 пользователем Andrey Efimov
Тема перенесена в соответствующий раздел

Защита программ от взлома

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

По неизвестной мне причине в большинстве современных программ данная защита сделана однообразно и для ее снятия необходимо 10-15 минут. В этой статье я постараюсь поделиться опытом в построении систем защиты. Могу сразу предупредить — хорошему хакеру противостоять практически бесполезно, да и не нужно — при желании любая защита может быть взломана, это вопрос времени.

Инструментарий хакера

Их можно подразделить на несколько категорий

  • Отладчики. Позволяют прерывать выполнение программы при достижении заранее заданных условий, производить пошаговое выполнение программы, изменять содержимое памяти и регистров и т.п. Наиболее популярным, удобным и мощным является отладчик SoftICE, который при достаточно примитивном интерфейсе обладает приличными возможностями и весьма стабильно работает.
  • Дизассемблеры. Производят дизассемблирование программы для дальнейшего изучения полученного кода. Один из наиболее мощных и популярных — IDA. От дизассемблера достаточно легко защититься — зашифровать или заархивировать программу. Тогда дизассемблируется только архиватор или кодировщик. Однако тот-же IDA имеет мощный встроенный скриптовой язык, позволяющий производить расшифровку программы
  • Средства мониторинга. Это набор утилит, отслеживающих операции с файлами, реестром, портами и сетью.
  • Средства пассивного анализа программы. Показывают разную информацию о программе — извлекают ресурсы, показывают связи, используемые библиотеки. Классический пример — утилита DEPENDS.EXE из комплекта Visual Studio. Она показывает, какие библиотеки используются программой и какие функции импортируются.
  • Прочие утилиты. Их великое множество (можно найти на диске типа «Все для хакера», причем в изобилии). Это разнообразные редакторы, анализаторы .

Наиболее популярны следующие программы мониторинга :

  • FileMon — утилита, позволяющая вести мониторинг всех операций с файлами. Имеет удобный фильтр, может сохранять отчет в файле. Поэтому нет смысла делать «секретные» файлы где-нибудь в Windows/System — их элементарно найти.
  • RegMon — аналог FileMon, только ведется мониторинг всех операций с реестром. Аналогично файлам, бессмысленно создавать в реестре «секретные» ключи — они сразу бросаются в глаза.
  • PortMon — мониторинг работы с портами ввода/вывода
  • TCP_VIEW — монитор соединений по TCP-IP
  • RegUtils — набор утилит для контроля за реестром — делает копии реестра, позволяет сравнивать копии и просматривать изменения.

Утилиты типа FileMon могут резко упростить взлом программы — легко определить место, в котором программа обращается к указанному файлу или ключу реестра.


Основы построения защиты — шаг за шагом

Как ввести регистрационный код. Ввод пароля или регистрационного номера является ответственным делом — хакер постарается отловить адрес памяти, в который будет записан пароль. Затем на обращение по этому адресу ставится точка останова (команда BPM в SoftICE), что позволяет поймать начало процедуры проверки регистрационного кода. Если для ввода используются стандартные элементы ввода Windows, то алгоритм действий хакера можно формализовать и выглядит он примерно так:

  1. Устанавливает точку останова на считывание текста из стандартного элемента ввода (функции GetWindowText, GetGlgItemText модуля KERNEL32)
  2. При вызове этой функции анализируем ее параметры и таким образом определяем, по какому адресу будет размещено считываемое значение и ставим обращение к этой области памяти точку останова. А достоверности определенного адреса легко убедиться — после выполнения функции там появится введенная строка
  3. При срабатывании этой точки останова мы попадаем в анализатор введенного значения и либо делаем генератор регистрационных ключей, либо ломаем процедуру проверки. И то, и другое весьма просто сделать — достаточно только изучить ассемблер и API

Набор этих действий стандартен и мне не раз попадались подробные руководства типа «Взлом Windows программ — шаг за шагом», ориентированные на продвинутого пользователя.

Рассмотри несколько решений, которые могут затруднить взлом на этом этапе.

Совет _0. Старайтесь как можно меньше применять стандартные функции (особенно API-шные) и компоненты VCL. Так что Assembler, Assembler и еще раз Assembler .

Сущность этого совета надеюсь очевидна — современные дизассемблеры умеют распознавать стандартные процедуры высокоуровневых языков, а API — вообще отдельный разговор — SoftICE обладает изумительной возможностью — загружать символьные имена для любых указанных библиотек (особенно для KERNEL32.DLL) — отладка резко упрощается, т.к. мы видим имена вызываемых функций и можем ставить точки останова на вызов функций по их имени.

Совет 1. Применяйте нестандартный способ ввода пароля.

Наипростейший путь — написать свой визуальный компонент для ввода регистрационного кода. Он конечно должен будет обрабатывать события от клавиатуры, но момент считывания кода нельзя поймать избитыми методами. Это уже что-то, но есть второй способ взлома, основанный на поиске введенного кода в памяти. Для этого в SoftICE есть удобная команда «S стартовый адрес L длина ‘образец'» , которая позволяет найти введенное значение в памяти.

Совет 2. Не храните введенный код в одном месте !

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

Совет 3. Не храните введенный код открытым текстом !

Итак, что же следует сделать. Для начала необходимо завести в программе 5-10 переменных типа STRING и после ввода кода переписать введенное значение в них. Делать это лучше всего не в одном месте, а распределить по программе. Таким образом поиск даст кучу адресов, по которым будет находиться введенный код. Я в таком случае поступаю так — по таймеру создаю в динамической памяти новую строковую переменную, пишу в нее код. Затем на следующем срабатывании таймера создаю новую переменную, переписываю в нее код, а старую уничтожаю. При определенном навыке можно заполонить память значениями введенного кода и сделать поиск почти бесполезным. Причем такое копирование можно совместить с проверкой кода или эмуляцией этой проверки. Затем с эти строками неплохо поделать какие-либо операции — сравнить с чем-нибудь .

Советы 3 и 1 можно объединить — создать свой компонент, который позволит вводить код нестандартным способом с его одновременной шифровкой.

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

Совет 4. Ни в коем случае не анализируйте код сразу после его ввода .

Чем дальше ввод кода от его анализа, тем лучше. Самое разумное — после ввода кода поблагодарить пользователя за сотрудничество и сообщить, что со временем будет выполнена регистрация программы. А анализ кода произвести, например, через 1-2 минуты в совершенно другом месте программы.

Совет 5. Не проверяйте код только в одном месте и не пишите для проверки функцию.

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

Совет 6. Не проверяйте пароль одним алгоритмом.

Рекомендуется разработать 2-3 алгоритма проверки, например 1-2 цифры должны делиться на 3, а 3-7 наложенные по какому-либо алгоритму на имя пользователя должны дать в сумме 4. Эти две проверки осуществляем в различных местах с достаточно большим временным разносом — взломав первый метод хакер не будет догадываться о существовании еще нескольких, которые проявятся со временем.

Совет 7. Ни в коем случае не предпринимайте никаких действий после проверки. По неизвестной причине большинство программ выглядят примерно так

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

Совет 8. Отвлекающие маневры.


Кроме реальных функций проверки кода очень неплохо сделать пару бутафорских — они будут вызываться после ввода кода, проводить активные манипуляции с введенным значением, выдавать сообщения о некорректности введенного кода . — т.е. отвлекать внимание от реальной проверки.

Совет 9. Не храните результатов проверки в переменной и не используйте ее для явного ограничения функций незарегистрированной программы.

Классический пример нарушения этого правила

Таким образом элементарный анализ показывает, что переменная LegalCopy хранит результат проверки и поставив на нее точку останова можно выловить саму проверку. Отредактировав это значения в памяти можно временно сделать копию «зарегистрированной»,а установка точки останова на изменение этой переменной выведет на место ее проверки. Да и взлом сводится к тому, что функция проверки кода урезается до двух команд ассемблера:

Совет 10. (вытекает из 9) Не храните результатов проверки на диске или в реестре.

Типичная ошибка — выяснили, что копия зарегистрирована и сделали где-нибудь метку. Отловить это достаточно просто (см. описание REGMON и FILEMON). Наилучший способ — сохранить пароль и имя пользователя в том виде, в котором он их ввел. Затем при каждом запуске программы проверять корректность этого кода, но не забывая Совет _11. Ничего не проверяйте сразу при запуске приложения или сразу после считывания сохраненного имени или кода. Помните, что считывание кода и его ввод в окне регистрации идентичны по мерам защиты — дублирование в разных областях памяти, шифрование .

Выводы: мы устроим проверку кода в нескольких местах программы, при этом применим несколько алгоритмов проверки, не будем использовать API.Кроме того, стоит проделать несколько отвлекающих маневров.

Общие советы по защите программ

  • CRC — контрольные суммы. Любой файл, строку или блок данных можно защитить контрольной суммой, которую затем можно рассчитать и сравнить с эталоном. При сравнении с эталоном конечно следует весть осторожно — см. первые 11 советов. Итак, совет 12. Защищайте программы и данные контрольными суммами. Это поможет не только от взлома, но и защитит программы от вируса или внедрения троянца.
  • Применяйте шифровку программ и данных. Очень неплохо сжать программу и данные. Я, например, разработал свой собственный архиватор — RAR-у и ZIP-у он конкуренции не составит, но сжатые им данные разжать очень непросто, придется изрядно повозиться. Да и изменить их проблематично — придется разжать, изменить и сжать.
  • Отлов пошаговой отладки программы. Существует много способов, я в свое время провел целое исследование этого вопроса под DOS, насобирал и придумал не менее 20 методов, но они мало приемлемы под Windows. Самый простой и надежный способ — таймер. При работе программы периодически фиксируем системное время и рассчитываем время работы фрагментов кода между ними. И если 200-400 команд процессора работают 2-3 минуты, то тут есть над чем задуматься.

Совет 13. Не определяйте дату и время стандартными способом !! Придумайте что-нибудь оригинальное.

Совет 14.Не стоит хранить что-либо секретное в файлах или реестре. Работа с файлами или реестром может быть детально запротоколирована и проанализирована, и все тайное станет явным.

Совет 15.Не храните ничего важного открытым текстом, особенно сообщения типа «Это незарегистрированная версия . «, «Введенный пароль не верен . «.
Они для хакера — как для быка красная тряпка, и действительно — находим такое сообщение, ставим точку останова на обращение к участку памяти с этим сообщением и получаем возможность поймать момент выдачи этого сообщения.

Советы по созданию меток для организации ограничения по времени

Защита «ограничение времени работы» состоит в том, что программа каким образом фиксирует момент своего первого запуска и работает установленное время (обычно 20-30 дней). После истечения этого срока программа отказывается запускаться. Как проверить текущую дату я уже где-то тут писал — нестандартным способом, например по дате на файлах реестра или свежесозданном своем файле. Весь фокус в другом — как зафиксировать на компьютере дату первого запуска (естественно так, чтобы изничтожение программы и ее повторная установка не давали эффекта). Использование «секретных» файлов в системных папках или изменения в существующих файлах легко отловить при помощи FILEMON. Реестр то же отпадает из-за REGMON. Прочие методы (типа записи в ВООТ сектор . ) тоже неприемлемы — не те времена, по Windows все это не пройдет. Наиболее оригинально (на мой взгляд) прошить дату в саму программу и постоянно обновлять ее на своем сайте (естественно, автоматически). Таким образом отсчет неявно идет от момента скачивания программы с сайта. Есть тут правда и минус — после завершения срока можно повторно скачать эту программу и получить еще 15-20 дней . . С другой стороны это оригинально — пользователю рано или поздно надоест скачивать эту программу и он или откажется от нее, или купит. Но при этом стоит помнить, что программу можно скачать несколько раз и сравнить варианты, выявив, где лежит дата. Поэтому стоит позаботиться о том, чтобы изменился почти весь файл (например, изменить пару опций компилятора)

Советы по формированию регистрационных кодов

Формирование кодов может вестись по следующим основным направлениям:

  • Жестко фиксированные коды, прошитые в программу. Их обычно немного и их огласка сводит защиту к нулю.
  • Некий алгоритм проверки кода. Немного лучше первого, но лишь немного. Возьмите за пример код Windows — его знает любой пользователь
  • Алгоритм проверки кода, использующий имя пользователя. Очевидно, что для каждого имени будет уникальный номер (или номера — их может быть несколько, в зависимости от алгоритма). Это уже лучше, но нелегальное распространение держится на эгоизме зарегистрированных пользователей — ничто не мешает им предать имя/пароль огласке, но тогда хотя бы можно вычислить виновника и заблокировать его код
  • Алгоритм проверки кода, использующий имя пользователя и некоторые уникальные или динамически изменяющиеся параметры, например информацию о компьютере. Это надежно, дает привязку к компьютеру, но в наш век постоянных апгрейдов очень неудобен.
  • On-Line регистрация. Состоит в том, что программа в On-Line связывается с сайтом разработчиков (или компании, осуществляющей продужу софта) и передает туда ревизиты пользователя. В ответ программе передается регистрационная информация. Этот метод может и хорош для ряда программ, но на мой взгляд не выдерживает никакой критики по двум соображениям:
    1. Никто не может гарантировать, что конкретно передаст программа в Инет. А передать она может все, что угодно — параметры компьютера, пароли, любые данные и т.п.
    2. Конкретный пользователь может не иметь доступа к Инет. Это особенно важно для программ, работа которых не связана напрямую с Сетью. И зарегистрировать такую программу его практически никто к себе на компьютер не пустит (из соображений п.п. 1)

Рекомендовать тут что-либо бесполезно, но я например использую разновидности метода 3.

PS: В качестве заключения я хочу отметить два момента:

  • Эта статья написана в 1998 году и размещена в Интернет в 1999. С этого момента в компьютерном мире все изменилось, но основные концепции остались. Когда будет время, я напишу новую статью — с учетом появления новых операционных систем.
  • Статья ориентирована на начинающего читателя

Что такое shareware и freeware программы

Подробная статья о том, что такое shareware и freeware.

Социальные опросы показали, что многие пользователи ПК довольно плохо понимают разницу между shareware и freeware лицензиями, а выбор между ними часто ставит многих в тупик. В этой статье я постараюсь объяснить разницу между этими типами лицензий.

Набор программ и инструкций для компьютера, отвечающий за выполнение требуемых задач, известен как программное обеспечение. Программное обеспечение претерпело множество изменений с момента своего зарождения. Сейчас для закачки из интернета доступно три типа программ: shareware, freeware и open source.

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

Shareware


Боб Уоллес (Bob Wallace) — первый, кто предложил термин shareware. Этот термин зародился ещё до появления персональных компьютеров от IBM. Shareware — это проприетарное программное обеспечение, которое предоставляется пользователям на испытательный период абсолютно бесплатно. Функциональность таких программ, как правило, ограничена, т.е. на самом деле, пользователям не предоставляется полная версия программного продукта. Такие программы доступны для загрузки на многих веб-сайтах, испытательных дисках, а также в CD-приложениях ко многим популярным журналам. Фразы «испытательный период» или «бесплатный испытательный срок» напрямую связаны с shareware программами. Сейчас такие программы совместимы со всеми компьютерными платформами.

Суть таких испытательных программ в том, чтобы обеспечить её широким кругом покупателей. Потенциальный покупатель получает право попробовать программный продукт, а потом решить, стоит ли оплачивать полную версию. Многие «shareware» не имеют ограничений в функциональности, но имеют ограничение на время использования.

По окончании испытательного периода программа перестаёт работать и, чтобы она снова заработала, необходимо оплатить полную версию. Во время испытательного периода для покупателей shareware программ не доступна техническая поддержка, обновления, а также вспомогательная документация. Всё это становится доступным после оплаты полной версии. Если вы пользуетесь shareware программой, то вы не можете делать её копии и распространять её среди друзей и коллег до тех пор, пока она находится на испытательном периоде, который обычно длится от 10 до 60 дней. Также бывают программы с ограничением на количество запусков.

Автор shareware программы может сделать её бесплатной для пользования и развивать её за счёт пожертвований. Такие программы остаются под защитой закона.
Исходный код shareware обычно не доступен, для того, чтобы никто другой не мог сделать на их базе свои программы.

Freeware

Эндрю Флюгельман (Andrew Fluegelman) — тот, кто ввёл термин «freeware». Он был отцом коммуникационной программы, называемой PC-Talk. Он хотел распространять свою программу, но хотел делать это не традиционным методом.

Freeware — это обычно полностью функциональное программное обеспечение, которое доступно в неограниченном количестве копий на неограниченное время. Эти программы распространяются абсолютно бесплатно. Также они могут быть проприетарными и цена у них, в таком случае, установлена нулевая.

Так или иначе, автор такой программы может удерживать права, например, на копирование, распространение или использование программного обеспечения для создания нового на его базе. Также такие программы могут иметь лицензию, ограничивающую её использование. Это означает, что на программу будут накладываться ограничения по сферам использования. Например, использование программы может быть: персональным, научным, коммерческим и некоммерческим, а также комбинированным. Я уверен, что вы сталкивались с программами, лицензия которых гласит «бесплатно для персонального и некоммерческого использования». Это и будет примером бесплатного программного обеспечения.

Если программное обеспечение является freeware, то не обязательно, что оно обладает открытым исходным кодом и не имеет ограничений, поэтому следует различать freeware и бесплатное программное обеспечение. «Фонд бесплатного программного обеспечения» даже попросил авторов программного обеспечения избегать использования слова freeware в бесплатном программном обеспечении, чтобы не порождать путаницу. На самом деле freeware отличается от бесплатного программного обеспечения тем, что оно может иметь какие-либо ограничения на использование.

Я надеюсь, что после прочтения данной статьи, вы поняли разницу между shareware и freeware. Для того чтобы узнать больше, вам следует почитать материалы на тему «Основные типы программного обеспечения».

Защита shareware приложения

В качестве примера приведен небольшой участок программного кода,
позволяющий быстро создать защиту для программ SHAREWARE,
которая, не влияет на функциональность самой программы,
но настоятельно «просит» ее зарегистрировать и закрывает при каждом повторном запуске.
Технология данного метода заключается в том, что пользователь
может запустить программу только один раз за текущий сеанс Windows. Используйте обработчик события FormShow:

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

Защита .NET приложений — всё же, во что заворачивать селёдку?

Защита .NET приложений — всё же, во что заворачивать селёдку?

В пику вот этому обзору. Решил написать собственный обзор обфускаторов, ибо считаю вышеобозначенный не только поверхностным, но и вводящим в заблуждение.
Актуален один вопрос — так ли хорошо защищает тот или иной продукт от снятия защиты? Учитывая, что производители обфускаторов честно предупреждают — сборка остается дизассемблируемой. И это краеугольный камень проблемы защиты .Net приложений. Тотальная защита приводит к неудобствам запуска сборки в разных средах, обфускация — к условной открытости кода. Остается решать задачу по усложнению получения кода, его читабельности и снятию защиты.

Итак, что мы имеем:
Есть 2 класса программ для защиты .Net приложений:

    Протекторы (native processor wrapper)
    Подобные машинки поставляются также в сочетании с обфускатором, достаточно слабым (предлагающим допустим обычно переименованием членов сборки, не больше). Обертка бывает различных видов, изящнее всего она представлена в Salamander Protector (здесь и обфускатор достаточно качественный), исключение в смысле слабости обфускатора — Salamander, но и здесь могут быть проблемы, как с отладкой, так и с запуском.

Представители: CodeVeil, Salamander Protector, .Net Reactor.

Преимущества: т. н. «недоступность» для декомпиляторов и ILDASM. Но дело в том, что эта недоступность – кажущаяся. .Net ограничивает права сборок находящиеся в оперативной памяти (in memory), сборки перед запуском надо где-то сохранять на диске – и вот тут они становятся доступны.
Недостатки: много проблем с запуском сборки в средах с более строгими policies, неадекватное реагирование антивирусов, приводят к тому, что пользователь начинает бояться защищенные подобным образом продукты, невозможность отладки защищенной сборки. Плюс – невозможность создания защищенной сборки для работы как в 32-битной, так и в 64-битных средах. Либо то, либо другое, хотя разработчик может скомпилировать программу в конфигурации AnyCPU для работы как в 32-битной, так и в 64-битных средах. Ну и собственно – кажущиеся преимущества. Производители протекторов обычно рекомендуют обфусцировать сборки, перед тем как защищать их протектором, тем самым признавая уязвимость защиты.

Обфускаторы
Представляют более естественные для среды .Net методы защиты, после которых сборка не требует дополнительных надстроек и шаманства для запуска и отладки.

a. Stand-alone обфускаторы, которые не используют сервисы и интерфейсы MS для доступа к метаданным и для генерации обфусцированной сборки, то есть имеющие свою машинку доступа, парсеры, генераторы и прочие инструменты для работы с .Net сборками.

Представители: Spices.Net Obfuscator, Dotfuscator,

Преимущества: независимость от внешних сервисов в выборе средств защиты, широкий спектр и нестандатные подходы в защите.
Недостатки: как честно и предупреждают ответственные производители — код остается дизассемблируемым (если не ILDASM, то каким-нибудь кустарным дизассемблером, исходники можно взять в SSCLI или Mono).

b. Зависимые от MS сервисов (тут списк большой – от эксплуатации ILASM/ILDASM, доступа через COM, а также использования сервисов от .Net 2.0). Функционал подобных заведомо ограничен, т.к сервисы е предоставляют возможности ввернуть что-нибудь нестандартное.

Представители: Salamander Obfuscator, Skater.Net, Demeanor от WiseOwl (это практически сейчас неизвестный обфускатор, хотя и неплохого качества, один из пионеров).


Преимущества: не знаю, но во всяком случае Salamander предлагает неплохой обфускатор.
Недостатки: нестабильность, зависимость от сервисов, в связи с чем ограниченность в средствах (Salamander не может работать с проектами, содержащими сборки от разных платформ, например .Net 2.0 и .Net 1.1). Плюс — те же недостатки пункта a).

Рекомендации разработчикам

Их немного: при начале разработки помните о том, что проект будет обфусцирован. Это означает, что видимость тех или иных членов сборки должна быть регламентирована, а значит – что должно быть обфусцировано, а что – нет. Основной проблемой для обфускатора является использование reflection/serialization. .Net предоставляет кучу возможностей для вызова методов, обращаясь к ним по имени, использования классов для структурированного запоминания и чтения данных. Обфускатор не может распознать подобные вещи, поэтому стоит в процессе кодирования использовать некоторые правила, для сравнительного легкого исключения из обфускации подобных случаев:

  • Классы, работающие в serialization-reflection помещать в отдельную сборку. Это нетрудно, ибо эти классы и их члены и так должны иметь публичную видимость.члены и так должны иметь публичную видимость.
  • Классы, работающие в serialization-reflection декларировать под определенным namespace и в этом случае исключать их из обфускации будет нетрудно, причем все скопом.
  • Если уж приходится использовать serialization-reflection в коде – то лучше помечать подобные методы специальным атрибутами. Не ставьте сейфовый замок на фанерную дверь. Умерьте свою паранойю. Лучше изучайте получившиеся после обфускации сборки, проверяйте классы и их члены – все ли вы скрыли от пытливого глаза, оптимизируйте найстройки, чтобы все, что нужно – было обфусцировано, скрыто и спрятано. Пробуйте открыть ILDASM-ом, reflector-ом – что видно из этих продуктов. Пробуйте сделать dump из ILDASM (если получится) – смотрите сгенерированный файл. Это нужно для понимания, насколько сложно будет изготовить из вашей сборки что-то другое, слепить код, или взять кусочек кода декомпилятором.
    Теперь насчет баланса. Ну вот возьмите Reflector, возьмите Spices.Net — вот они защищены обычным обфускатором, не протектором, и как предыдущий обозреватель написал — легко все видно в winDbg. А толку? Кто-то узнал какие-то секреты Reflector-а (а Pro версия сейчас небесплатна), кто-нибудь узнал секреты Spices.Net? А ведь эти приложения написаны в pure IL без native processor code (в отличие от Salamander).
  • Также хочется сказать некоторые вещи насчет тестирования обфускаторов — если вы попробовали некий продукт, после которого получили неработающие сборки, имеет смысл обратиться к производителю продукта, во-первых это хлеб для производителя — разбирать подобные проблемы, во-вторых — реальный шанс получить скидку (если производитель думает о клиентах), если вообще продукт забесплатно — сотрудничество всегда оплачивается. Дайте шанс производителю решить вашу проблему, это взаимовыгодно.

Вот теперь — сравнения

Сразу могу сказать, что многие представители обфускаторов не вошли в таблицу, только для того, чтобы не тратить ваше время. Да и Dotfuscator включен в этот список так как просто является продвигаемым Microsoft продуктом, хотя может далеко не всё из того, что заявляет. Будущее SmartАssembly также нельзя назвать ясным после покупки компанией Red-Gate за $1M — (имхо, сделка того не стоила). Reflector теперь обновляется редко (что хорошо разве что для общирного набора плагинов), что и будет наблюдаться и со SmartАssembly скорее всего. Зачем компании занимавшейся SQL влезать в рынок обфускаторов-декомпиляторов (хотя пакет «Обфускатор-Декомпилятор» — это продуктивный подход, он есть в Salamander, есть в Spices.Net) – ума не приложу, рынок достаточно специфичный и на нем уже умерло немало многообещающих проектов типа Decompiler.Net (даже позиции Salamander зашатались, например, они так и не выпустили технологию V-Spot Elimination, хотя в этом обзоре автор пишет, что они этим гордятся (вопрос только чем — тем что не выпустили, или типа «выпустили»? Реализовали-то и заявку на патент сделали 9Rays.Net, вообще-то).
Итак:

Возможности Dotfuscator Spices.Net Obfuscator Salamander Obfuscator
В пробной версии Собственно Community Edition c минималистическим набором. Дает полное представление, не ораничена по функционалу (только помечает обфусцированные сборки специальной watermark – «Obfuscated by Spices.Obfuscator. Not for commercial use») и идет в полном комплекте – GUI, VS Integration, MSBuild integration, консоль и SDK.
Можно использовать бесплатно для защиты некоммерческих программ.
Ограничения – предоставляется консольная версия. Функциональные ограничения.
Интерфейс, автоматизация, интеграция Интерфейс не очень. Кратко – ugly (ну тут на вксю и цвет. ).
Консольная версия присутствует. Есть возможность применения правил, но достаточно запутанная. применения правил, но достаточно запутанная.
Автоматизации нет.
Интеграция в MSBuild, интеграция с VS в виде Add-In, который не интегрируется в build-process текущего проекта.
Поставляется как в GUI версии в составе Spices.Net, так и в консоли. В GUI версии предоставляется немало дополнительных инструментов для исследования сборок.
Автоматизация есть – предоставляется пример на C# как написать собственный обфускатор с использованием машинки Spices.Net Obfuscator. Кроме этого поддерживаются ObfuscationEvents (по аналогии VS Build Events), позволяющие вставлять кастомные акции между шагами процесса обфускации.
Интеграция в MSBuild и VS присутствует – настраивать опции обфускации можно прямо в свойства проекта, включать-отключать любой проект солюшена, вообще выключать обфускацию.
Поставляется в GUI.
Консоль есть.
Автоматизации нет.
Интеграции нет.
Неплохой wizard-style простенький интерфейс.
Консоль присутствует.
Автоматизации нет.
Интеграции тоже нет.
Tamper-Resistance Модуль «стукач» поставляется в Enterprise, предназначен от внутрикорпоративных краж. Для обычного софта – достаточно отключить доступ в инет этой программе, или просто напросто удалить защиту ибо это достаточно легко. Есть. Взломанная, переименованная или подделанная сборка перестает работать. Защита как от ILASM/ILDASM roundtrip, так и от простого переименования сборки (то есть смены identity – сюда входит как ее название так и полное название в случае strong name сборки, а также номер версии).
И вот что интересно: после введения этой технологии хакнутых версий Spices.Net больше не найти, а Salamander и SmartAssembly (о да, предлагающие control flow!) — пожалуйста, лежат на варезниках.
Нет. Нет.
String Encryption Есть Есть. Дополнительно – защита ресурсов (без шифрования и компрессии, но работает
с защитой от подделки (tamper resistant))
Есть. Есть. Дополнительно – компрессия и шифрование ресурсов.
AntiILDASM, противодействие декомпиляции AntiILDASM есть, противодействия декомпиляции нет. AntiILDASM есть, противодействие декомпиляции есть (Reflector не берет, но Salamander Decompiler частично может. Автоматически защищает от Spices.Net Decompiler). АntILDASM есть, автоматически защищает от Salamander Decompiler. АntILDASM есть
Удаление неиспользуемого кода и деклараций (pruning) Может Может, гибко Может Может.
Software watermarking Может Может (с защитой от подделки – то есть используется технология TamperProof) Нет Нет
Control flow obfuscation Есть, частично распознаваемо декомпиляторами. Вместо нее предлагается технология CodeAnonymizer как более эффективное средство борьбы с декомпиляторами. Есть, но распознаваемо декомпиляторами.
Упоминается V-Spot Elimination — нереализованная технология, подобная реализованной в Spices.Net CodeAnonmizer
Есть, но распознаваемо декомпиляторами
Работа с mixed-code сборками Не очень хорошо, без оптимизации по размеру Может, с оптимизацией по размеру Есть, но бывает нестабильна Может, ограниченно (error reporting не вставляется в подобный код)
Поддержка 64-бит Есть Есть Нет Нет
Деобфускация StackTrace Нет в community edition, есть в enterprise, но не очень удобная, базирующаяся на карте обфускации Есть как инструмент Spices.Net и предлагается более детальное бесплатное решение. Нет Есть внедряемый Error Reporting модуль. Уникальная фича.
Преимущества Идет в каждой поставке с VS. В отличие от других обфускаторов – для каждой новой версии .Net выходит самым первым – инсайдер все-таки. Большой выбор средств для защиты. Две технологии, которые не предлагают другие обфускаторы. Наличие собственного неплохого декомпилятора, позволяет понимать, что обфускатор знает, что надо защищать.ать, что обфускатор знает, что надо защищать.
Из плюсов могу также назвать оперативную поддержку на русском и конструктивность в решении проблем.
Древнейший представитель, неплохое качество защиты. Простенький, идет навстречу основным потребностям маленьких разработчиков и заточен под них, но из-за этого малость негибок, хотя обладает неплохим арсеналом средств защиты.
Недостатки Неоправданно дорог. Список фичей и качество исполнения не соответствует цене.
Поддержка небесплатна.
Обилие настроек и инструментов иногда останавливает. Заточенность на профессиональное использование, а не для нужд маленьких разработчиков. Хотя для них как раз
все есть в консольной версии.
Негибкость настроек, несовременность. С выходом .Net 2.0 ребята уже бросали этот проект, но потом вышли с комбинацией Obfuscator + Protector. Не может работать с проектами различных .Net версий. На последних версиях .Net – неустойчив.
Сложно и долго идут на контакт по поддержке.
Непонятно будущее этого хорошего продукта. Отсутствие интеграции, tamper-resistance ухудшает характеристики. А ведь первое, что они могли бы предложить – защиту от reflector – Это была бы очень мощная фича.
Раньше была очень дружелюбная поддержка, сейчас не знаю.

Про цены

Специально не сравнивал цен. У Дотфускатора цены высоки и расценки за поддержку таковы, что служат барьером, судя по всему, они ориентируются на крупный корпоративный бизнес. По остальным производителям могу сказать, что тут есть место для принципа «цена – это то, что устроит и продавца и покупателя». Давно уже практикуется договариваться, чем например индусы овладели в совершенстве и давно не парятся насчет того, как купить 400-долларовый продукт за 150 баксов. Существуют недекларируемые скидки для студентов (academic discounts), для всяческих MVP и MCP, для членов user groups и сообществ, для некоммерческих организаций, региональные и национальные, за упоминание в блоге и размещение лого продукта на некторый срок. Об этом конечно производитель на сайте не пишет. В конце концов вы можете предоставить проблемный файл или наоборот — сообщить о дыре в защите, любое сотрудничество с производителем приведшее к улучшению качества продукта будет оценено.
Попробуйте попросить скидку, да обрящете. Успехов!

P. S. Есть есть желание дать инвайт опытному и хорошему человеку, активно участвовавшего в создании этой статьи — свяжитесь со мной, пожалуйста.

Защита shareware приложения

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

Наиболее мощная, на мой взгляд, программа для заморозки времени — Hall Of The Montain King. Разработка ее прекращена, офсайт также прекратил существование. Позволяет замораживать время на уровне ядра системы, техническая часть вопроса подробно расписана в прилагающейся документации. Для новичков вряд ли подойдет, да и при работе не исключены падения в синий экран.

Hall Of The Montain King 3.0.1b

RunAsDate — интересная программа, изменяющая дату и время, но только для выбранного процесса, оставляя системное время нетронутым. Для этого в запускаемом процессе перехватываются системные функции GetSystemTime, GetLocalTime, GetSystemTimeAsFileTime, и их обработчик возвращает нужное значение. Также можно создать ярлык для автоматического запуска программы с нужной датой. На мой взгляд оптимальное решение для эффективного обхода большинства самопальных защит.

Data Fuсk, как пишет сам автор, помогает «убедить» программу, которую дают тестировать только несколько дней, что она работает один день. При первом запуске создает файл данных, на основе которого будет запускать выбранное приложение. Перед запуском системное время переводится на нужную дату, а по прошествии выбранного интервала, возвращается обратно. К сожалению, такие манипуляции со временем срабатывают только на слабых защитах.

NI Anti Shareware работает по тому же принципу, что и предыдущая программа. Разница только в том, что на рабочем столе создается ярлык для выбранной шароварной программы, в котором прописана строка запуска NI Anti Shareware и нужной даты. Недостатки те же самые, на современных протекторах такие прыжки во времени приведут только к внеплановому срабатыванию защиты.

NI Anti Shareware 3.11

SetDate также меняет системное время перед запуском программы и возвращает его обратно по прошествии заданного интервала времени. Требует ручного редактирования ярлыков программ. Недостатки те же самые, что и у предыдущих программ.

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

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

Cracklock — судя по описанию на сайте автора, также использует перехват функций времени в процессе, причем делает это как классическим внедрением в процесс, так и загадочным «статическим инжектом», проще говоря, патчем. Из-за использования подобных технологий, многие антивирусы относятся к такой активности с большим подозрением. Русификатор прилагается.

Cracklock 3.9.44 (pass: manhunter.ru)


Time Stopper действует так же, как и многие программы из этой статьи. Создает ярлык для запуска «замораживаемой» программы, при запуске выставляет нужную дату, а при завершении работы откатывает ее до текущей. Самую последнюю версию можно скачать с офсайта.

Time Stopper 3.12

Если вы знаете еще какие-нибудь программы аналогичного назначения, то напишите об этом в комментариях, я обязательно добавлю их в обзор.

Защита shareware приложения

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

Я не собираюсь посвятить эту статью assembler’у и всяким низкоуровневым хитростям, методикам работы с отладчиком, распаковщиками и прочим специализированным софтом. Я уверен, что, если вы никогда не занимались ничем подобным, то вряд ли, прочитав пяток-другой статей по этой тематике, сможете создать защиту для вашей программы, способную противостоять опытному взломщику более 5 минут. Я полагаю, что, если у вас есть отличная идея, то вы должны сосредоточиться на ее полировке, может быть, ее реализации на каком-то из высокоуровневых языков программирования: visual c++, delphi… Что касается вопроса защиты ПО, то пусть лучше этим занимаются специалисты. Вы не первые, у кого возникает подобная потребность, и рынок давно сориентировался, предоставляя наборы высокоуровневых библиотек или специальных систем, играющих роль «сейфа» для вашей программы. С другой стороны, как раз эти программные комплексы становятся одной из целей всевозможных взломщиков. Верх идиотизма в этой ситуации, когда на пиратских сайтах можно найти кряк для программы, с помощью которой планируется защищать другой софт. Доступны специализированные пиратские утилиты, целью которых является взлом ЛЮБЫХ защищенных с помощью некоторой библиотеки программ. Имеет ли смысл вообще полагаться на такие универсальные защитные системы или стоит разрабатывать что-нибудь свое? Ни то, ни то решение не является идеальным. Большей частью подобные универсальные «взламыватели» срабатывают для программ, разработчики которых не удосужились проштудировать справку и решили, что, нажав одну большую кнопку «защитить», они решат свои проблемы. Грамотная защита должна быть комплексной, существует ряд методик, заточенных под конкретные программы защиты, и эти методики следует применять, комбинируя между собой.

Одна из самых лучших систем защиты, о которой я сегодня и расскажу, — это SoftwarePassport/Armadillo Software Protection System. Последняя версия: 5.0 вышла этим летом. Домашний сайт проекта: сайт Разработчики позиционируют armadillo как средство буквально за пять минут добавить систему защиты/лицензирования для ваших программ. Приятно, что авторы честно признаются в том, что armadillo пару раз уже была взломана, но ведется постоянный мониторинг пиратских сайтов, и оперативно выпускаются исправления. Armadillo может защищать 32-разрядные исполняемые файлы, также файлы dll, ocx, файлы screen saver. Не умеет защищать 16-разрядные приложения (это меня нисколько не огорчило — времена DOS безвозвратно ушли в прошлое), также не умеет защищать файлы office, базы данных (а это уже хуже). Таким образом, если вы написали программу- справочник, например, телефонов, то можете защитить исполняемый файл программы, но файлы с данными, ту же телефонную базу — нет. В этих ситуациях рекомендуется использовать всякие хитрые методики с расшифровкой на лету (в оперативную память) файлов с данными. Также невозможно защитить .net-программы, т.к. они исполняются средой .net framework. В этом случае рекомендуется выделить из вашей программы специальную библиотеку dll, в которой находится набор критически важных функций, и защитить с помощью armadillo именно эту библиотеку, без которой сама программа, естественно, работать не будет. С помощью armadillo можно защитить даже такие приложения, как сервисы.

Выпускается две версии armadillo: basic и professional editions. Различий между ними не так уж много: в версии professional больше возможностей работы с аппаратными ключами, поддержка передачи лицензий, больше возможностей управлять временем работы программы, ключа, количеством запусков по сравнению с basic-версией. В основе своей обе версии armadillo используют одинаковый способ защиты вашей программы. Прежде всего, программа шифруется с помощью некоторого секретного ключа, сам ключ помещается в специальное хранилище, которое и защищается armadillo. Если указать неверный ключ, то после расшифровки программы взломщик получит «мусор». Также файл программы сжимается — это дает еще один уровень защиты от взлома плюс, если вы планируете распространять программу через Internet, это позволит вам экономить немножко денег на трафике. Ключи, которые вы рассылаете клиентам, могут быть похищены и выложены на каком-нибудь пиратском сайте. В таком случае вам необходимо оперативно это отследить и добавить похищенный ключ в специальную базу Stolen Codes Database. Когда вы выпустите новую версию программы, к ней уже не подойдут те ключи, которые вы поместили в черный список. Если пираты не могут похитить ключ для программы, они могут создать для нее «патч» — например, аккуратно вырезав из программы часть кода, которая проверяет корректность введенного ключа. Надо сказать, подобный способ взлома является одним из наиболее популярных. Например, вы решили создать собственную систему защиты, проверяющую введенный в диалоговом окне пользователем ключ доступа, и, если код совпадает с некоторым значением, то программа продолжает работу, иначе же аварийно завершается. Так вот, путем несложной замены пары байт в двоичном коде программы можно изменить условие проверки на противоположное, и любой неправильный код будет принят за верный. Для защиты от этого armadillo контролирует целостность и неизменность кода программы и своей защиты. В случае модификации выводится сообщение, что программа была модифицирована, и ее запуск блокируется. Также популярный способ взлома основан на возврате системных часов назад. Так, если у вас есть лицензия на программу до 1 июня, то после истечения этой даты, вернув часы на месяц назад, вы снова получаете рабочую программу. С armadillo этот фокус не пройдет. Один из наиболее надежных способов защиты — custom build. Его задача — защита от универсальных взломщиков. Идея в том, что после покупки armadillo вы можете запросить для себя ее custom build версию. Возможности ее абсолютно идентичны возможностям «обычной» версии armadillo, но сам код системы защиты расположен немного по-другому, что резко повышает сложность взлома вашей программы. По крайней мере, до тех пор, пока она не станет настолько популярной, что для нее создадут специализированный «взломщик», а не будут пытаться обойтись универсальным. Система защиты armadillo активно использует понятие сертификата. Сертификат служит не только для защиты программы, но и для контроля правил ее использования. Например, вы можете ограничить время использования программы (т.е., по сути, реализовать основную идею shareware: попробуй, и, если понравится, можешь купить). Также можно ограничить максимальное количество раз ее запуска.

Давайте перейдем к практике и попробуем защитить, например, стандартный калькулятор windows. Для этого я сделал его копию и запустил SoftwarePassport (Armadillo Classic Interface). Прежде всего, необходимо создать новый проект: File -> New Project, после чего вы в появившемся диалоговом окне должны указать параметры будущего проекта (см. рис. 1). Прежде всего, укажите название проекта и его версию. Версия нужна для того, чтобы можно было создавать особый вид сертификатов, действующих на протяжении некоторого времени планируемых обновлений программы. Например, сертификат, ключи которого подходят для всего семейства версий, скажем, 4.1, 4.2… 4.10. На следующей закладке настроек проекта вам следует указать, какие файлы должны быть защищены: в дополнение к основному исполняемому файлу проекта вы можете указать еще пять вспомогательных файлов — например, библиотек dll. Закладка language отвечает за возможность добавления функций многоязычной поддержки. Если вы создаете ПО, распространяющееся не в англоязычных странах, возможно выполнить перевод всех сообщений, которые показывает armadillo во время своей работы. Следующая закладка — Splash Screen1 — служит для управления splash-окном, которое выводится во время загрузки программы. После того, как вы запустили защищенную с помощью armadillo программу, выполняется ее дешифровка и распаковка. Во время этого процесса armadillo отображает специальное splash-окно c надписью: «мол, подождите, идет загрузка». Вы можете заменить эту заставку своей и даже создать несколько заставок, отображающихся в зависимости от типа используемой лицензии. Закладка Enter Key Dialog Options служит для того, чтобы указать, как будет визуально выглядеть диалоговое окно для ввода имени пользователя и значения ключа. Интерес предоставляет возможность указать тип диалога html. В этом случае вы можете сами сверстать ту html-страницу, только будьте внимательны: в изначальном шаблоне html присутствуют специальные служебные пометки (обработка нажатия на кнопки «регистрация», «выход», «переход на сайт продавца ПО»). Если вы их измените, то диалог регистрации не будет работать. Следующая закладка Protection Options. Здесь вы должны указать, какие алгоритмы защиты будут использованы. Есть много хитрых методик взлома, позволяющих извлечь вашу программу из-под защиты armadillo, также существуют не менее хитрые способы этому противостоять. Вам следует помнить, что определенные способы защиты имеют побочные эффекты — например, программа может не запуститься под определенной версией windows или скорость ее работы будет катастрофически мала. Так, для того, чтобы противодействовать dumping’у — одному из наиболее популярных методов взлома, заключающемуся в том, что загруженная в память версия программы (после того, как была расшифрована и подготовлена для собственно использования) может быть сохранена на диск уже без всякой защиты — armadillo рекомендует использовать алгоритм CopyMem-II. Так вот, этот алгоритм не позволяет защитить dll-, ocx-файлы и приводит к значительной потере производительности плюс возникает вероятность сбоя программы, работающей под старой Windows 98. Закладка Compression Options служит для того, чтобы указать, следует ли выполнять сжатие программы одновременно с ее защитой. Закладка Soft Ice Detection служит для блокировки специализированных утилит для взлома. Если ваша программа стала целью взломщиков, то они будут использовать такое ПО — например, softice, — с помощью которого можно покопаться в ее внутренностях. Назначение softice — отладка, поиск ошибок в готовой программе, мониторинг утечек ресурсов памяти и других проблем. Поэтому разработчики armadillo поступили очень умно, введя три уровня защиты от softice и ему подобных программ. Первый уровень защиты — когда наличие softice не проверяется — например, если вы разрабатываете специальный софт для программистов, которые могут пользоваться softice в законных целях. Второй уровень — когда запуск защищенной armadillo программы блокируется, если обнаружен запущенный softice. И третий уровень — параноидальный — когда запуск программы невозможен, если softice не только не запущен, а просто установлен на вашем компьютере.

Остальные закладки я пропущу, т.к. планирую рассказать о методиках привязки проекта к аппаратным ключам в следующий раз. Пока же мы переходим на закладку Certificates. На этой закладке перечисляется список сертификатов (воспринимайте сертификат как способ указать, как именно можно использовать программу). Естественно, что сертификаты, а также ключи, служащие для активации сертификата, не возникают из ниоткуда. Так, когда вы создаете очередной сертификат, то должны придумать некоторую фразу: именно эта фраза — ваш самый главный секрет. Если кто-либо узнает эту фразу-секрет, он может выполнить генерацию любого количества ключей/сертификатов. Надо сказать, генерация этих ключей не такая уж простая задача — я имею в виду не технический фактор, а социальный. Например, вы написали программу, которую хотите продавать за деньги как shareware. Вы узнали, что существуют специальные сайты-регистраторы — они выступают в роли посредника между вами — автором программы — и клиентами. Клиент заходит на сайт регистратора, указывает, какую версию программы хочет купить, указывает банковские данные, номер кредитки и т.д. Регистратор берет на себя задачу проверки этих сведений, получает деньги от клиента и по мере накопления некоторой суммы высылает чек, переводит на счет или иным способом доставляет вам деньги. Самое интересное в том, как клиент получит ключ для скачанной с вашего сайта программы. В самом простом случае регистратор пишет вам письмо: «мол, так и так, вашу программу купили — вышлите, пожалуйста, ключик». Но вы не получаете это письмо, потому что оно потерялось в ходе пересылки, его посчитали за спам и удалили, или у вас приступ насморка. В любом случае вы не можете сгенерировать и выслать клиенту этот самый ключ. Как следствие клиент недоволен, а регистратор и вы теряете деньги. Кому это надо? Поэтому регистраторы предоставляют услугу автоматической генерации ключа и ее отправки клиенту. Так, в справке armadillo написано, что они сотрудничают с рядом регистраторов, и вам нужно всего лишь выслать регистратору эту самую секретную фразу, на основании которой при подтверждении оплаты сервер регистратора выполнит генерацию ключа и отправит ее клиенту — все полностью автоматизировано. Особенно полезна эта функция в случае действительно массовых покупок. С другой стороны, если вы потеряете секретную фразу или ее получит недобросовестный регистратор, то вы оказываетесь в очень неприятной ситуации. Вы вынуждены отозвать все ключи, выполненные по скомпрометированной схеме генерации, и выслать новый ключ для всех добросовестных клиентов. Иначе, когда вы выпустите обновление программы и защитите его новой схемой генерации ключа, старые ключи клиентов уже не подойдут. Вы можете создать любое количество сертификатов для вашей программы, но существует особый вид сертификата (он создается всегда по умолчанию) DEFAULT. Этот сертификат используется для запуска программы в режиме demo (ограниченной функциональности) или в режиме shareware (ограниченной по времени работы). В случае, если вы хотите распространять свою программу как коммерческую (здесь под коммерческой схемой распространения подразумевается схема, когда мы не можем предварительно опробовать в течение некоторого времени возможности и решить, будем ли мы покупать программу), то такой сертификат вам не нужен, и его следует удалить из проекта. Давайте разберем один из важнейших параметров сертификата: когда и как будет принято решение о его отзыве. На закладке Certificate Expires возможны следующие варианты:

1. Сертификат станет недействительным по истечении N дней после установки. Для сертификата default отсчет начинается после первого запуска, для остальных видов сертификатов отсчет идет от даты, когда ключ был введен в систему защиты armadillo.
2. Сертификат становится недействительным по достижении заданной даты.
3. Срок истечения сертификата определяется не временем, а количеством раз запуска программы.·Интересна возможность внести параметр количества запусков в процедуру генерации ключа. Т.е., когда клиент у вас запрашивает ключ, вы должны указать, сколько раз эту программу можно запустить.
4. Сертификат, перестающий действовать по достижении некоторой версии программы.
5. И, наконец, комбинированный случай: здесь задается и количество дней использования, и количество попыток запуска.
6. Интересен вариант с указаниеммаксимального промежутка времени, в течение которого программа будет работать. Так, по достижении, скажем, 10 минут после запуска программа будет аварийно закрыта. Причем вы вольны указать, будет ли пользователь извещен об окончании срока действия с тем, чтобы он мог сохранить результаты работы.
7. Возможно управлять временем, в течение которого программа должна быть установлена. Например, вы выпустили ключ «1.04.2007» и хотите, чтобы его установка была проведена до истечения данного года. Такую методику обычно применяют для beta-версий, рассчитывая к концу года выпустить следующую версию продукта, так что устанавливать и тестировать устаревший вариант уже не следует.

После того, как вы определили, как именно будет выполнена защита программы, и указали все виды сертификатов (каждый сертификат определяется набором параметров), вы выполняете генерацию защищенного файла exe программы, затем этот файл скачивает клиент и после оплаты покупки просит вас выслать ему ключ. Вы в среде armadillo используете меню keys -> create keys для того, чтобы сгенерировать ключ. При первом запуске программы вы должны будете указать имя пользователя и тот самый сгенерированный ключ (см. рис. 2).

В следующий раз я продолжу рассказ об armadillo. Мы завершим рассмотрение аппаратных ключей, а также методов программного взаимодействия с armadillo api.

Создание защиты Shareware программ

Лучше написать 2 программы, одна полная-вторая урезанная, ибо все защиты тем более в .net на ура ломаются.Вы можете написать самую невероятную защиту, но в итоге она сведется к одному bool значению, и для работы с программой достаточно его поменять, т.е. изменить один бит и вся ваша защита падает.

Можно сделать кучу условий и не только с bool и не в одном методе. Поверь я хоть и новичок ну не на столько глуп.

Цитата(CasperSC @ 27.1.2010, 17:21 )
Можно сделать кучу условий и не только с bool и не в одном методе. Поверь я хоть и новичок ну не на столько глуп.

мне интересно на это посмотреть

Короче попортить взлом ломающему, даже если сломает, то хотя бы помучается.

Да вообще можно такого бреда понаписать, что сам потом не разберёшься

Работает 1 — 5 тамер(ов) Имею ввиду например пользователь вводит пароль и нажимает принять, при этом происходит ложная проверка, можно ещё при ложной проверке как нибудь повлиять на какие нибудь переменные (опять же как нибудь замудрённо, чтобы это небыло очевидно). 1 из 5-ти таймеров проверяет нажимали ли кнопку, если да, то запустить 40 таймеров, 3 — 8 из которых реально проверяют, 1 из 40 таймеров проверяет ту переменную которая была изменена при нажатии на кнопку (где производилась ложная проверка), но в разное время, например 1 через минут 20, остальные позже.

Работает 1 — 5 тамер(ов) Имею ввиду например пользователь вводит пароль и нажимает принять, при этом происходит ложная проверка, можно ещё при ложной проверке как нибудь повлиять на какие нибудь переменные (опять же как нибудь замудрённо, чтобы это небыло очевидно). 1 из 5-ти таймеров проверяет нажимали ли кнопку, если да, то запустить 40 таймеров, 3 — 8 из которых реально проверяют, 1 из 40 таймеров проверяет ту переменную которая была изменена при нажатии на кнопку (где производилась ложная проверка), но в разное время, например 1 через минут 20, остальные позже. и если там переменная не изменена, а программа как бы работает, то завершить программу и удалить себя с компьютера пользователя или низнаю, мож зашифроваться или заархивироваться, короче как нибудь неявно стать неработоспособной. Да вообще можно такого бреда понаписать, что сам потом не разберёшься smile переменную с введённым паролем при вводе сразу рабивать пополам или задом наперёд, потом по таймеру создавать новую, перекидывать туда её. Хранить её в массиве таких переменных, эти переменные все разные и одна в чистом виде как вводили, но она не работает, так как в введённый код добавляется какие нибудь символы и при проверке учитывая их проверяются. Конечно я тут понаписал, но думаю такое можно вполне замутить, в ходе написани исправлять недочёты, что-то убрать, что-то добавить. Плюс обфускатор. Можно проверять запущен ли Reflector и подобные. Короче попортить взлом ломающему, даже если сломает, то хотя бы помучается.

БИС Лекция № 8 «Защита shareware программ»

БИС Лекция № 8 «Защита shareware программ»

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


Существует несколько различных схем распространения условно-бесплатных программ:

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

Ознакомительная версия с ограниченным сроком использования (time limited). Например, программа загружается только в течение 15-30 дней (или всего 100 раз) с момента первого запуска. В течение этого периода пользователь должен решить: покупать программу или стереть ее.

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

— Nagscreen shareware приложение выпускается с полным функциональным набором, но пользователю назойливо сообщают о том, что программа не зарегистрирована или не куплена (ACDSee, WinZip, Windows Commander).

— Adware (программы с принудительным показом рекламы) – также полнофункциональная программа содержащую рекламу (свою или чужую, баннерную или текстовую). Само рекламное сообщение или изображение может загружаться из Сети либо содержаться в самом продукте (Net Vampire).

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

Программы распространяемые на условиях shareware, как правило разрабатываются небольшими группами разработчиков или программистами-одиночками. Цена таких программ обычно колеблется от $10 до $100 поэтому нецелесообразным является использование профессиональных коммерческих систем защиты, например, на электронных ключах. Поэтому как правило применятся логические системы защиты, крайне редко встречаются защиты, основанные на криптографических методах.

Примеры способов реализации систем защиты.

Программы с ограниченным сроком использования

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

Процесс покупки shareware программы обычно называется регистрацией. При получении денежных средств разработчик программы высылает пользователю пароль или регистрационный номер, с помощью которого он может разблокировать программу. Существует также вариант с высылкой пользователю полнофункциональной версии программы, однако такой способ крайне уязвим из-за незащищенности полной версии.

Различают статические пароли и генераторы ключей.

При защите статическим паролем, программа «разблокируется» если введенный пароль, соответствует некоторым критериям. При этом сам пароль не является индивидуальным. Например, сумма цифр ключа компакт диска Windows ’95 должна делится на 7. Для реальной защиты необходимо применять гораздо более сложные и запутанные правила проверки корректности ключа. Недостатки, для обхода защиты необходимо опубликовать всего один ключ, пользоваться которым смогут все, ключ никак не привязан к имени пользователя (за исключением записи в базе данных разработчика).

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

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

— применять нестандартные средства ввода пароля (не EditBox)

— не хранить пароль в одном месте и в открытом виде

— создавать фиктивные проверки пароля и ложные переменные для его хранения

— проверять пароль спустя некоторое время после ввода (достаточно 1-2 секунд)

Защита с привязанным ключом

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

Методы усиления защиты

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

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


Причем вероятность проявления ошибок может изменяться в зависимости от времени суток и даты. Например, для финансовых программ, вероятность ошибки может повышаться в период сдачи годового баланса. Локализовать и обезвредить такие защиты крайне сложно, однако существует вероятность, что от такой «защиты» могут пострадать легальные пользователи.

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

Процесс оплаты shareware программ нередко сопряжен с риском т. к. разработчик не всегда достаточно компетентен в финансовых вопросах. Поэтому существуют специализированные фирмы, организующие весь процесс оплаты программы. Наиболее известные службы такого типа Regnow, PsL. Для регистрации в такой службе разработчику достаточно просто заполнить стандартную форму договора и отослать ее по факсу или даже по e-mail. Раз в месяц (или в квартал, или по мере накопления определенной суммы, службой высылается чек (или делается перевод на валютный счет) — по тому адресу, указанному в договоре. О каждом зарегистрировавшемся пользователе разработчик будет проинформирован тот же день. При этом присылается его e-mail, фамилию-имя, почтовый адрес, какую программу и сколько копий он заказал — в общем, всю информацию, которую пользователь сочтет необходимым о себе сообщить (кроме, естественно, номера кредитной карточки). Ряд служб регистраторов может также самостоятельно высылать покупателям регистрационные коды, предоставленные разработчиком. Многие регистрационные службы принимают платежи не только online, но и по факсу, электронной почте и даже по телефону, а также принимают чеки и переводы денег на их банковский счет, за обслуживание обычно взимаются комиссионные в размере 15-25% от стоимости программы.

Основные способы защиты программ

Наибольшее распространение получили программы типа «запрос пароля» или «запрос ввода регистрационного номера». Они реализуются по-разному, но сводятся к одному и тому же алгоритму:

1. Программа запрашивает пароль у пользователя.

2. Проводит с ним какие-либо действия, например, шифрует или получает хеш-функцию.

3. Сравнивает полученную на шаге 2 функцию или пароль и запрошенный пароль с шага 1

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

Программы с динамической проверкой ввода пароля

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

-правильность ввода символов проверяется «на лету», то есть одновременно с вводом;

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

Первое, что потребуется,- установить брекпоинт на доступ к памяти с вводимыми нами данными. Далее достаточно перехватить в самой программе процесс сравнения этих символов , и мы найдём верный пароль.

Основные способы защиты программ

Тут описаны распространённые способы защиты программ:
-проверка даты и времени;
-инструмент InqSoft Sign Of Misery;
-фиксированное количество запусков;
-CRC.

Проверка даты и времени

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

Инструмент InqSoft Sign Of Misery

InqSoft Sign Of Misery (автор CyberManiac) — это программный инструмент созданный главным образом для продолжения «жизни» shareware-программ. Эта программа вобрала в себя большое количество приёмов борьбы с ограничениями во времени пользования программой, подавления всплывающих окон, мешающих нормальной работе с программой, изменение и удаления «лишних» файлов и ключей реестра, а также множество других техник. Так как это программа универсальна, то не гарантирует 100% успеха. Но иметь такую программу довольно полезно.

Фиксированное количество запусков программы

Следующий способ защиты программ — создания Trial-программ, т. е. программ, запускаемых фиксированное число раз.

Защитный механизм таких программ реализуется с некоторыми отличиями:

-программа записывает количество запусков в реестр при установке на компьютер пользователя;

-программа записывает количество запусков в реестр при первом запуске;


-программа записывает количество запусков в ключевой файл при первом запуске;

-программа записывает количество запусков в ключевой файл при установке на компьютер пользователя;

-программа запускается и работает только определённое число дней.

Немного поясним последний пункт. Это ещё один вид реализации защиты «спроверкой даты».
-Записывать дату первого запуска программы в реестр или ключевой файл, а потом сверять её с текущей. Это простой, о не эффективный способ. Для взлома такой программы достаточно просто отследить такую запись и подправить её текущей датой.

-Сверять текущую дату с датой создания самого запускаемого файла. Этот способ посложнее, но до сих пор применяется в некоторых программах.

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

Программы, защищённые CRC

СRC (Cyclic Redundancy Code)- циклический избыточный код. Сейчас очень многие программы защищены таким видом защиты. Это очень правильно, поскольку CRC не только даёт дополнительную защиту от крекеров, но также позволяет защитить программы от компьютерных вирусов. Например, если программа была изменена или заражена, то контрольная сумма изменится; на основании этого можно выдать сообщение или вообще завершить работу программы.

Контрольные суммы применяются в следующих целях:

-защита от заражения вирусами;

-защита от изменения кода в памяти или на жёстком диске;

Некоторые менее распространённые способы защиты программ

1) Шифрование всей программы или её части.
Главная сложность этого метода заключается в том, что после шифрования кода программа должна сохранить работоспособность.

2) «Отлов» пошаговой отладки программы.
Самый простой и надёжный способ- использовать таймер.
При работе программы периодически фиксируем системное время и рассчитываем время работы кусков кода между ними. При нормальной работе процессор выполняет кусок кода программы за 5-10 мс ( зависит от размера куска кода). Если мы обнаружим , что этот кусок кода процессор выполняет за 2-7 минут, то тут появляется повод задуматься.
Здесь ни в коем случае нельзя прерывать работу программы и не выводить никаких сообщений сразу после того, как определили, что работает при пошаговой отладке. Самый лучший способ — направить работу программы по альтернативному руслу. Пока взломщик поймёт, что его «надули», пройдёт достаточно времени , и всегда есть шанс, что он отстанет от этой программы.

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

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

Методы противодействия.

Может быть применена к любым программам. Актуальность задачи анализа программных реализаций алгоритмов защиты обусловливается следующими факторами.

1. Компьютеризация всех областей национальной экономики России. В настоящее время компьютерные технологии активно применяются практически во всех новых областях нашей жизни. Автоматизированные средства обработки информации используются как

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

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

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

не являющиеся специалистами в области защиты информации. Нельзя исключить с их стороны ошибки при выборе алгоритмов защиты и просто программистские ошибки в процессе разработки программного обеспечения. Хотя сегодня откровенно слабые решения в области защиты информации встречаются гораздо реже, чем 10 —15 лет

назад, они все же встречаются. Одним из последних примеров такого рода, получивших широкую огласку, является система фильтрации информации порнографического характера на «Школьном портале», которая считала поисковый запрос «мокрый снег» непристойным, а целый ряд явно порнографических запросов — вполне допустимыми

4. Широкое распространение программных средств зарубежного производства. Среди всех программных средств, применяемых в России в настоящее время, львиную долю составляют программные средства зарубежного производства. В ряде стран, например в США и Франции, имеются ограничения на экспорт стойких систем защиты информации. Бесспорно высокий уровень квалификации подобных разработчиков, удобство эксплуатации информационной системы, сконструированной ведущими зарубежными фирмами, еще не дает гарантии, что информационная система обладает надежной защитой. Кроме того, для программных средств, применяемых в критически важных сегментах информационной инфраструктуры Российской Федерации, весьма важной является задача заблаговременного выявления в используемых программных средствах недокументированных возможностей, которые в случае начала информационной войны могут послужить информационным оружием. войны могут послужить информационным оружием.

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

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ — конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой.

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций.

Илон Маск рекомендует:  Что такое код atanh
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL