Платформа Palm OS: защита программного обеспечения

 

Платформа Palm OS: защита программного обеспечения

14.05.2003

Автор: Aaron Ardiri
Перевод: Ронин Виктор
Источник: ladoshki.com

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

 

1. Введение

 

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

 

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

 

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

 

2. Лицензирование программного обеспечения

 

Все программное обеспечение распространяется с определенными лицензиями, которые налагаются, когда пользователь получает копию программы. Существует множество видов лицензий, определенных в Free Software Foundation [3], но фактически это:

2.1 Free Software

 

Free Software — программы, которые идут с разрешением использования, копирования, распространения в том виде, в котором они распространялись, или в измененном виде, бесплатно или с оплатой. Наиболее важный фактор Free Software является то, что вместе с ним должны поставляться исходные коды программы. Смыслом Free Software является свобода, а не цена. GNU General Public License (GPL) является примером Free Software лицензии.

 

2.2 Freeware

 

Freeware — это программное обеспечение, в котором разработчик не просит оплаты лицензии, и программа может распространяться свободно в неизменяемом состоянии. Исходные коды в основном не поставляется, и продукт должен распространяться неизменным. Если исходные коды предоставляются, новые разработчики должны просить разрешения у автора на изменение и распространение измененного ПО.

 

2.3 Shareware

 

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

 

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

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

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

2.4 Commercial

 

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

 

3. Электронная дистрибуция программного обеспечения

 

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

 

3.1 Процесс покупки

 

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

 

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

 

3.2 Торговый знак RealTime Fulfillment

 

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

 

В первом квартале 2001 года, PalmGear H.Q. [5] позволил разработчикам генерировать коды разблокировки для пользователей во время оплаты счета при покупке программного продукта. jCode, система, предоставляемая PalmGear H.Q., позволяет разработчикам редактировать, компилировать и тестировать алгоритмы генерации ключей через веб-броузер без инсталляции средств разработки.

 

Введение такого сервиса позволяет разработчикам использовать для регистрации программ системы, основанные на ключах, предотвращая тем самым какие-либо задержки и необходимость ручной обработки заказов разработчиками. Демонстрационная версия данной системы находится на сайте http://www.ardiri.com/palm/jCode/.

 

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

 

4. Способы регистрации

 

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

 

4.1 Бит защиты от копирования базы данных

 

В платформе Palm OS реализована своя собственная форма защиты от копирования, которая защищает приложение или базу данных от передачи между устройствами в модуле запуска приложения. Приложение является по существу исполняемой базой данных ресурсов, и программист может установить определенные свойства приложения, используя простой вызов программного интерфейса приложения (API) [4].

Err DmSetDatabaseInfo(UInt16 cardNo, LocalID dbID, const Char* nameP, UInt16* attributesP, UInt16* versionP, UInt32* crDateP, UInt32* modDateP, UInt32* bckUpDateP, UInt32* modNumP, LocalID* appInfoIDP, LocalID* sortInfoIDP, UInt32* typeP, UInt32* creatorP);

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

{
	UInt16 card, attributes;
	LocalID dbID;
	SysCurrAppDatabase(&card, &dbID);
	if (dbID != NULL) {
		DmDatabaseInfo(card, dbID, NULL, &attributes, NULL, NULL, 
		NULL, NULL, NULL, NULL, NULL, NULL, NULL);
		attributes |= dmHdrAttrCopyPrevention;
		DmSetDatabaseInfo(card, dbID, NULL, &attributes, NULL, NULL,
		NULL, NULL, NULL, NULL, NULL, NULL, NULL);
	}
}

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

 

Эта идея упрощена и обеспечивает ограниченную защиту. Впрочем, многие утилиты управления файлами третьих сторон не проверяют этот атрибут — и передача базы данных (а также приложения) происходит достаточно легко. Также не представляет большого труда написать небольшое Palm OS приложение, которое устанавливает этот бит как «0» во всех базах данных и «обманывает» этот механизм защиты.

 

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

 

4.2 Серийный номер

 

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

program.c:
#define SERIALNUMBER 12345
#define incorrectSerialAlert 1001
{
	codeEntered = StrAToI(strCode);
	if (codeEntered != SERIALNUMBER)
		FrmAlert(incorrectSerialAlert);
	else
		registered = true;
}

При дизассемблирование исходного кода, мы получим код схожий с следующим:

program.s:
...
2F03 MOVE.L D3,-(A7)
4E4FA0CE TRAP #15
DC.W sysTrapStrAToI
4FEF000C LEA 12(A7), A7
0C403039 CMPI.W #12345!$3039,D0
6708 BEQ L9
3F3C03E8 MOVE.W #1000!$03E8,-(A7)
4E4FA192 TRAP #15
DC.W sysTrapFrmAlert
7000 L9 MOVEQ #0,D0
...

Итак, серийный номер прямо перед Вами! В этой неразберихе ассемблеровского кода спрятано сравнение регистра D0 (который содержит результат запроса StrAToI) с постоянным значением. В данном случае, значением, с которым идет сравнение, является 0x3039 или 12345. Это в том случае, когда речь идет о простых числах, если в качестве сравнивающих последовательностей символов используется вызов StrCompare API [4], а последовательность символов, с которой сравнивают, содержит свой адрес, загружаемый при помощи команды LEA (к метке в коде) до того, как сделан вызов. Поиск кода для этой метки приведет Вас прямо к тому месту в памяти, где содержится необходимая последовательность символов.

 

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

 

4.3 Окно Nag

 

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

 

Реализация окна Nag проста, если использовать следующий программный интерфейс приложения [4]:

UInt16 FrmAlert(UInt16 alertID);

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

program.c:
#define nagScreenAlert 1000
{
	FrmAlert(nagScreenAlert);
}