Защита программ

Денис Колисниченко

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

Глава 1. Демо-версия

Практически любую систему безопасности, разработанную одним человеком, другой может взломать. Чего так? Да потому что раз один человек сделал что-то, значит, найдется еще один, который сможет повторить это с точностью до наоборот. Кстати, о дизассемблировании программ мы тоже поговорим, только чуть позже. Предположим, в Интернет ты выложил «защищенную» версию своей программы. Например, программа в одном из файлов, нарочно «замаскированном» под DLL, хранит счетчик запусков. Как только счетчик превысил число 60 (или любое другое), выводится сообщение о том, что пора бы уже заплатить за программу и появляется окошко с полями ввода регистрационного имени и серийного номера.

Теперь попробуем проанализировать действия пользователей. А пользователи, как мы знаем, бывают разными. Один сразу же зайдет на твой сайт, свяжется по e-mail или позвонит по телефону. В конечном итоге он обменяет несколько зеленых бумажек на заветный серийный номер. Другой пользователь попробует переустановить программу. В зависимости от твоего алгоритма защиты, программа или сбросит счетчик, или сообщит пользователю все о том же – что пора купить серийный номер. В первом случае – сами знаете что – вашу программу будут использовать до очередного переформатирования жесткого диска. А во втором… Это зависит от пользователя. Или он попытается найти крэк или просто удалит программу и будет искать ее аналоги. Платить этот пользователь не будет – он бы это сделал с самого начала, разве что программа настолько уникальна, что нет в мире ее аналогов (в этом случае, не думаю, чтобы она была shareware). Почему не будет платить? А ты как часто платишь за используемые shareware-программы? Думаю, этот вопрос рассматривать больше не будем…

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

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

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

А теперь представим, что это демо-версия и в ней функции печати нет изначально. Будь у него хоть 10 серийных номеров, распечатать они все равно ничего не сможет. Выход один – связываться с тобой и заказывать полноценную версию. Как правило, демо-версии даже не взламываются – взламывать там нечего. Конечно, вся описанная ситуация немного надумана. Если твоя программа популярна, то в

Сети уже есть полноценная взломанная версия, которую можно использовать, если демка понравилась. Но несколько первых пользователей все равно заплатят деньги. И будь уверен: сами эти пользователи ни за что не опубликую где-то на сайте их собственные версии – сработает менталитет – я ж за нее деньги заплатил! Другое дело, что у них ее кто-то может украсть или они смогут ее продать за полцены. В этом случае нужно придумать такой алгоритм, который бы препятствовал запуску программы на другом компьютере.

Глава 2. Серийные номера

Вот мы только и говорим о серийном номере. А как написать эффективный алгоритм генерирования серийных номеров, чтобы номер было трудно подобрать? Если ты не математик, лучше воспользоваться какой-нибудь программой, позволяющей управлять серийными номерами, чем писать «очень сложный» алгоритм, который в качестве серийного номера принимает сумму кодов символов введенного регистрационного имени… Говорю: "Не нужно так делать", но найдется хотя бы один читатель, который подумает «Отличная идея!»… Еще раз повторяю: чем использовать такой алгоритм, воспользуйся какой-нибудь программой. Понимаю, что стандартные решения стандартно и взламываются, но для первой версии твоей программы этого будет достаточно. Одну из таких программ мы рассмотрим в этой главе, а пока поговорим о дизассемблировании.

Глава 3. Защищаем алгоритм

Ты же не хочешь, чтобы твой алгоритм генерации был взломан за пару часов с помощью любого дизассемблера. Как это так получается? Есть такая, я бы даже сказал целая наука - reverse engineering. Если по-нашему – обратная разработка (проектирование). Ты написал программу, компилятор ее откомпилировал – на выходе EXE-файл. Как обычно. Другой человек запускает дизассемблер (или какой-нибудь отладчик вроде SoftICE) и буквально «по косточкам» разбирает твою программу. Ясно, что сам исходный код он не увидит (а хотя это зависит от опций компилятора), то есть он не увидит “If Serial.Text= …”, но он увидит то, что ему нужно – поверь, если человек этим занимается, он знает, куда смотреть. По сути, он проходит обратный путь – его исходный код – это твой EXE-файл. Отсюда и название – обратное проектирование.

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

Глава 4. EXECryptor

EXECryptor – это специальная программа, позволяющая с минимальными затратами времени решить все вышеизложенные проблемы: она и серийный номер «придумает», и программу защитит от отладчиков. Функции программы внушают доверие:


EXECryptor

EXECryptor позволяет защитить любое 32-х разрядное PE-приложение (exe, dll, bpl, vxd, wdm). Программа тестировалась с операционками W9x/ME/NT/XP/2003. Кстати, доступно SDK для Delphi, C++ Builder, MSVC и MSVB.

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

writeln('Test OK');

Вот что получается после компиляции:


mov eax, [$004092ec]
mov edx, $00408db4
call @WriteOLSTring
call @Writeln
call @_IOTest

Даже человеку, не особо знакомому с процессом дизассемблирования, понятно, что сейчас происходит – выводится какая-то строка. А теперь применим к тем четырем строчкам метаморфическое преобразование кода:


xchg [edi],dl
db 3
add al,$30
xlat
call +$0000025b2
jmp +$00000eec
call +$00000941
or al,$4a
scads
call -$304ffbe9
rol eax,$14
mov edi,[ebx]
jmp +$000001738
mov ebx,eax
shr ebx,$03
push ebx
jmp +$00001b5e
call -$000001e8
jmp +$00003203
jmp +$00005df8
call +$000000910
adc dh,ah
fmul st(7)
adc [eax],al
les eax,[ecx+$0118bfc0]
stosb
…

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

Глава 5. Практика

Попробуем защитить произвольную программу. Для этого я написал небольшую программку на Delphi – test.exe. Нажимаем кнопку Project в окне EXECryptor и выбираем New, вводим имя проекта и сохраняемся. После этого сразу переходим в раздел Options. На закладке General Settings вводим основные параметры проекта – имя исходного EXE- файла и защищенного EXE-файла. Параметры защиты кода программы находятся на закладке Protection Options.


Опции защиты

Уровень метаморфического преобразования кода задается бегунком Virtualization level – чем больше, тем лучше, точнее тем сложнее будет что-то сделать с твоей программой. Не бойся и выбирай 100% - размер EXE-файла не увеличится до размеров папки Windows. В моем случае он даже стал меньше:

Можно включить опции анти-отладчика (у меня незарегистрированная версия, поэтому они все включены и выключить я их не могу):

Параметры сжатия:

Еще одна очень полезная опция – strip relocation info - удаляет из объектного файла таблицу имен и информации о номерах строк. После этого программа не допускает символьной отладки. Помнишь, команду strip в Linux – так это все та же функция.

Кажется все, программа защищена. Теперь переходим на закладку Serial number support. Первым делом измени режим Configuration. По умолчанию используется значение Manual protection, что означает, что твоя программа сама будет управлять серийными номерами. Выбери режим One-touch trial. После этого установи два самых главных параметра – название твоей программы и URL, где можно получить серийный номер.


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

На закладке Limitation установи параметры ограничений: количество дней и/или количество запусков программы – это уже на твое усмотрение. Можно включить параметр Allow lock serial to hardware. Данный режим позволяет привязывать серийный номер к железу. Когда закончится срок действия, пользователь увидит ID железа. Данный ID он будет должен сообщить тебе, а ты уже по этому ID сгенерируешь серийный номер, который будет работать только на той машине. Как это сделать? Подожди, через пару минут узнаешь.

На закладке Messages ты можешь изменить параметры окна регистрации – какое сообщение и когда будет выведено.


Сообщения окна регистрации

Закладка Advanced содержит дополнительные опции – будет ли программа реагировать на изменение даты и времени, а также, какая информация будет включаться в ID железа (по умолчанию о процессоре, о BIOS и о жестком диске).


Доп. параметры

Переходим в раздел Serials. Закладка Manager – это основная закладка, которую ты будешь использовать при создании серийного номера. Вводишь имя пользователя, выбираешь тип лицензии – обычная (Standard) или ограниченная временем (Time limited) – в этом случае тебе нужно будет указать дату окончания лицензии. Если ты установил параметр Allow lock serial to hardware, тебе нужно указать Hardware ID – ID железа пользователя. Все, нажимай кнопку Create и в поле Serial number увидишь серийный номер, который нужно передать пользователю.


Менеджер серийных номеров

На закладке History отображаются созданные ранее серийные номера


Созданные ранее серийные номера

Раздел Registry рассматривать не будем – ты и сам сможешь с ним разобраться. Все, нажимаем кнопку Protect, ждем пару секунд и наша программа защищена от взлома и неблагодарных пользователей:


Процесс защиты программы

Все, что осталось – запустить программу – кнопка Run. При запуске программы появляется окошко, в котором отображается ID железа и поля для ввода регистрационного имени и серийного номера.


Защищенная программа

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

Глава 6. ASProtect

EXECryptor – это не панацея, то есть не единственная программа такого класса. Есть еще одна удобная программка – ASProtect. Во многом ASProtect и EXECrytor похожи, поэтому очень подробно рассматривать эту программу мы не будем – да и объем статьи не позволяет - журнал ведь не резиновый (прим. статья первоначально была опубликована в журале СпецХакер).


ASProtect

На закладке Application Info нужно ввести общие параметры – имя исходного и имя защищенного файла, а также название продукта. Закладка Options содержит разные параметры – параметры сжатия, параметры защиты.


Параметры защиты и сжатия – ASProtect

Создать серийный номер можно на закладке Registration Key, а параметры «триальной» версии – на закладке Trial Info. Как и в EXECryptor, ты можешь задать количество дней и/или количество запусков.


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


Параметры триальной версии

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

Надеюсь, что этой статьи на начальном этапе будет достаточно для защиты твоих программ. Все твои вопросы буду рад выслушать по адресу dhsilabs@mail.ru


Cчетчик Linux coutner
Hosted by uCoz