Как защитить программу от копирования

Опубликовано в Безопасность
/
8 Апр 2014

Добрый день, дорогие читатели. Сегодняшняя статья будет несколько иного содержания, нежели чем опубликованный раннее, в ней я расскажу вам о том как защитить написанную на языке visual basic.net программу от незаконного копирования. Это пригодиться преимущественно для тех, кто собирается продавать свое творение в интернете и не хочет что бы первая же копия его платного ПО появилась на сотнях файлообменников.

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

Как всё работает

Защищаем от копирования

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

Но про ключ я расскажу немного позже, я начала составляющие. Самая главная часть всей системы, это непосредственно сама функция обработке и отправки ключа для сравнения на сервер, она располагается в теле вашей программы и вызывается при запуске формы. Далее идёт серверный скрипт, написанный на PHP, который методом POST запроса принимает введённый ключ и проверяет его, путем поиска по базе данных. А в роли базы у нас будет обычный txt документ, в котором на каждой новой строке записано по ключу.

Первое, и самое основное что нам понадобится, это среда разработки Visual studio (у меня 2013), так же любой текстовой редактор (я рекомендую notepad++). В качестве тестового сервера мы будем использовать всем известный denwer или любой другой виртуальный сервер. Если же вы хотите работать сразу с «реальным», то можете использовать обычный web хостинг.

Приступаем к работе

Проверка ключа вид

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

Пишем программу

Проверка ключа программа

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

 Imports System.Security.Cryptography
Imports System.Text.Encoding
Imports System.IO
Imports System.Net 

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


Function VALKEY(ByVal Key As String) As Boolean
Key = TextBox1.Text
Dim postData As String
postData = "key=" & Key
Dim request As HttpWebRequest
Dim response As HttpWebResponse
request = CType(WebRequest.Create("http:/mysite.ru/key.php"), HttpWebRequest)
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = postData.Length
request.Method = "POST"
request.AllowAutoRedirect = False
Dim requestStream As Stream = request.GetRequestStream()
Dim postBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(postData)
requestStream.Write(postBytes, 0, postBytes.Length)
requestStream.Close()
response = CType(request.GetResponse(), HttpWebResponse)
Dim Result As String = New StreamReader(response.GetResponseStream()).ReadToEnd()
Console.WriteLine(Result)
If Result = Key Then
Return True
Else
Return False
End If
End Function

Не стоит забывать что «http:/mysite.ru» это созданный вами локальный сайт на денвере. После того как мы создали функцию, программа работать ещё не будет. Нам нужно условие, которое будет проверять возвращенную серверным скриптом информацию и делать на её основе выводы о правильности введённого ключа. Оно будет выполняться при нажатии на нашу единственную кнопку. Для этого нужно скопировать следующий код на событие клика:


If VALKEY("000-000-000-000") = True Then
MsgBox("Успешно!")
Else
MsgBox("Ключа не существует!")
End If

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

Form2.Show()

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

Работаем с сервером

Файлы на сервере проверка ключа

Заголовок я сформулировал немного не правильно, работать мы будем не с сервером, а со скриптом, который находится на нём. Для этого нам нужно создать два файла: key.php и key.txt. Первый из них это сам скрипт проверки ключа, а второй это наша база данных, в которой будут храниться все ключи (каждый на новой строке). Начнём пожалуй с php файла.

Для этого откройте key.php при помощи notepad++ или любого другого текстового редактора и скопируйте в него следующий код:


<?php
$key_msg = $_POST['key'];
$lines = file('Key.txt');
foreach ($lines as $line) {
if (substr($key_msg, 0, 15) == substr($line, 0, 15)) {
echo substr($line, 0, 15);
break;
}
}
?>

Данный скрипт принимает параметр key, в котором содержится введённый в текстовое поле вашей программы ключ, далее он передается в переменную key_msg и сверяется с базой, если такой ключ существует, то скрипт его же и возвращает, в противном же случае оставляет ответ пустым.

Ключи база

Теперь сохраним изменения в файле и преступим к работе с key.txt. Его мы так же открываем при помощи notepad++ и вставляем произвольные ключи. Но не нужно забывать, каждый из ключей должен содержать ровно пятнадцать знаков, в противном случае проверка работать не будет. Количество знаков ключа можно отредактировать в файле key.php, заменив все числа 15 на нужное вам. Так же тоже самое не забудьте проделать и в программе. И напоследок я рекомендую использовать ключи вида 000-000-000-000, они более понятны и читаемы, а так же осуществлять шифрование данных, а то мало ли что.

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

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

комментариев 16 Добавить комментарий

  • Круто, по сегодняшнего дня не знал что можно защищать программы самостоятельно.

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

    • Конечно, если человек задастся целью сломать — его ничто не остановит, это понятно.

    • Тоже не был в курсе)) так что спасибо за статью!

    • Пожалуйста! Планирую ещё написать несколько постов на эту тему.

  • Напиши) слушай Кирилл ты программ серьезных не знаешь для монтажа видео клипов, чтобы там можно было добавлять множества эффектов?

    • По моему самые лучшие, это Adobe after effects и Vegas pro. Но с программами видео монтажа я работаю редко, по этому многого не знаю. Могу дать контакт друга, он хорошо в этом разбирается.

  • хорошо если че напишу тебе в контакте )))

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

  • Блин, осталось самому написать какую-нибудь программу и её защитить 🙂

  • Кирилл, спасибо за статью. Очень нужная и актуальная информация. Возьму на заметку:)

  • Привет!
    Мне хотелось бы прочитать про связку системы покупки с автогенерацией серийников.

  • Подскажите, а что мешает взломщику просто удалить событие If на кнопке? Я так думаю с тем же успехом тхт с верным ключом можно и в программу вшить, также обходится. Для чего пляска с php?
    Вот если бы с тхт брало какую-то переменную, а не писало открыто — код принят!

  • Как я писал выше, это простейший пример для демонстрации примерной работы системы лицензирования, который конечно же в таком виде ни где не используется. А для защиты кода от внедрения или изменения можно использовать средства обфускации или упаковку исполняемого файла в дополнительную среду исполнения, что в отношении к не слишком дорогим и популярным программам достаточно действенно. Главное соблюдать планку, при которой купить программу легче, чем взломать.
    В качестве подобного средства защиты могу посоветовать .NET Reactor, а если нужно что по серьезнее то VMWare ThinApp (хотя им не пользовался, так что точно сказать не могу).
    В любом случае, лучшая защита от взлома, это регулярное обновление программы.

  • Кирилл большое спасибо за информативную статью! Очень понравилось. просто и доступно! Есть над чем подумать. «Если хотите, я могу рассказать о подключении системы покупки программы с автоматической генерацией ключа. Ответы в комментарии.» Очень бы хотелось почитать об этом! Ждем с нетерпением!

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

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

    Но вот беда.. локально красиво все работает, но на хостиинге нет возможности из vb.net соединяться к базе. т.е. соединяться то можно но только статическому ip, т.е. нескольким юзерам уже не подключиться никак, да и в принципе невозможно это, т.к. на хостинге необходимо добавить ip для которого хотим получить доступ для удаленного подключения.. я естественно никаких ip не знаю…
    Может есть какие то мысли на этот счет? я что-то никак не могу понять как другие защищают свои программы, неужели нет возможности сделать регистрацию и авторизацию в программе vb.net в удаленную базу данных… это просто в уме неукладывается…

Оставить комментарий