Самое простое — защитить программу серийным номером, который элементарно программируется и не вызывает никаких конфликтов ни с чем. Конечно, это не помешает Пете скопировать понравившуюся ему программу у Васи или даже выложить серийный номер в Сеть напоказ всем желающим. Соответствующий способ борьбы — использовать черный список «засвеченных» серийных номеров, проверяя их на соответствие при установке обновлений. Если защищенная программа предполагает взаимодействие с удаленным сервером, процедура проверки валидности серийных номеров значительно упрощается и нелегальный пользователь просто не получит доступ к серверу (очень актуально для сетевых игр!).
Несетевые программы также могут периодически ломиться в Сеть, передавая свой серийный номер. Если этот номер не подтверждается, регистрация считается недействительной и работа программы прекращается. При этом возникают следующие проблемы: поддержка выделенного и постоянно работающего сервера стоит денег, к тому же такой сервер сам по себе представляет весьма нехилую мишень для атаки. Что если хакеры завесят его или, еще хуже, проникнут внутрь и украдут легальные номера? Значит, необходимо содержать толкового администратора и разрабатывать протокол проверки серийных номеров с учетом возможного перехвата, например использовать несимметричную криптографию — тогда украденная база не позволит восстановить ни один легальный серийный номер. Впрочем, что-то я все о мелочах да о мелочах.
Как быть с персональными брандмауэрами, популярность которых постоянно растет? Пользователь не выпустит программу в Сеть! Хотя любой брандмауэр легко обойти установкой собственного драйвера, так поступать нельзя. Журналисты тут же поднимут шумиху и обольют программиста грязью. Требовать обязательного наличия интернета нельзя. До сих пор он есть не у всех (если все-таки требовать, необходимо как минимум уметь работать через прокси). Правда, можно прибегнуть к одному очень хитрому маневру: через функцию InternetGetConnectedState определить, доступен ли в настоящее время интернет, и если сетевое соединение действительно присутствует, потребовать от пользователя открыть брандмауэр (или что там у него есть). Популярная программа Macro Express поступает именно так, но и этот путь не свободен от проблем. Если выход осуществляется через локальную сеть, функция InternetGetConnectedState не сможет сказать, имеется ли выход оттуда в интернет. С удаленным доступом по модему намного проще, однако не стоит забывать, что пользователь может подключаться не только к провайдеру, но и к своему приятелю, у которого стоит импровизированный «сервер», не предоставляющий доступа в интернет… Однако InternetGetConnectedState этого не объяснишь! Наконец, системную библиотеку WININET.DLL, которая экспортирует функцию InternetGetConnectedState, очень просто хакнуть в контексте памяти ломаемого приложения, и тогда защите настанут кранты.
Криптография и все, что связано с ней
Вместо серийных номеров некоторые разработчики предпочитают использовать криптографические ключи и прочие системы цифровой подписи типа сертификатов, усиленно продвигаемые на рынок компанией Microsoft и прочими гигантами. Все чушь собачья! Цифровая подпись хорошо работает только в связке «клиент-сервер», но на локальной машине она бессмысленна. Да, сгенерировать «левый» ключ в этом случае невозможно, но если как следует пошурудить hiew’ом в исполняемом файле, никакие ключи уже не понадобятся. Так что цифровая подпись должна использоваться совместно с шифровкой кода и проверкой целостности!
Можно (и нужно) шифровать ключевым файлом критические модули защищаемой программы, но главное тут — не перестараться! Независимо от алгоритма реализации, такая защита вскрывается при наличии одного-единственного ключа. Кроме того, она не защищена от распространения ключа.
Оборудование — физическое и виртуальное
Привязка к аппаратуре — это грязный и пакостный трюк, отравляющий жизнь легальным пользователям и все-таки не спасающий от взлома, поскольку любая привязка обнаруживается опытным хакером элементарно. Либо эмулируется, либо вырезается. Виртуальные машины типа VM Ware представляют собой большую проблему, на варезных серверах уже появились программы с примечанием «Запускать под VM Ware». Достаточно зарегистрировать программу один раз, и дальше можно тиражировать ее сколько угодно.
Распознать виртуальные машины довольно легко, они несут на своем горбу довольно специфичный набор оборудования. Однако уже появились патчи, которые скрывают присутствие VM Ware, и, что хуже всего, многие легальные пользователи предпочитают запускать второстепенные утилиты из-под виртуальных машин, чтобы не засирать основную систему. Защита не может (не имеет ни морального, ни юридического права!) отказывать VM Ware в исполнении, иначе пользователи снесут защиту к чертям, мотивировав это «производственной необходимостью». Они будут правы (правда, так они не освобождаются от регистрации). Некоторые даже подадут в суд за умышленное ограничение функциональности, не отраженное на упаковке. Перейдем к практике…
Лучше всего привязываться к жесткому диску. Как показывает практика, он меняется реже всего. Чтобы прочесть серийный номер, совершенно не обязательно писать собственный драйвер, достаточно воспользоваться библиотекой ASPI (но она не установлена по умолчанию) или SPTI (есть только в NT/XP и требует прав администратора). Есть и вот такой трюк. Вызываешь GetVolumeInformation и смотришь на размер тома в байтах. Не слишком уникальная информация, но на «другой» машине с вероятностью, близкой к единице, она будет иной. Плюс такая проверка реализуется очень просто, работает стабильно на всем семействе Windows-подобных систем (в том числе эмуляторы) и не требует никаких прав.
Компиляция on demand
При наличии ресурсов можно установить сервер, генерирующий программы индивидуально для каждого пользователя, специально под его регистрационные данные. Пользователь скачивает крошечный инсталлятор. Инсталлятор извлекает с компьютера ключевую информацию, необходимую для привязки (например размер тома), спрашивает имя пользователя и передает эту информацию серверу, который жестко прописывает все это «хозяйство» в исходном тексте, перекомпилирует его, зашифровывает любым понравившимся навесным упаковщиком и отсылает назад. Что выигрывает разработчик?
Во-первых, «отломать» защиту становится намного сложнее, поскольку она не спрашивает никаких серийных номеров, не требует ключевых файлов и хакеру просто не за что зацепиться. Во-вторых, даже если программа будет взломана, придется распространять ее только в исполняемом файле (в который легко внедрить «водяные знаки», идентифицирующие владельца, например зашифрованный MAC-адрес его сетевой карты). К исполняемым файлам, добытым противоестественным путем (то есть скачанным из ненадежных источников), народ испытывает традиционное недоверие, и далеко не каждый рискнет запускать их.