Продолжение предыдущей статьи о защите программ от копирования. На этот раз речь пойдёт о создании регистрационного ключа для вашей программы.
После публикации статьи "Защита программ от копирования" я получил отзыв от Valentin'а, который подсказал мне другой способ защиты программ. Каждый из вас встречался с программами, при установке или запуске которых они требуют ввести регистрационный ключ. В этой статье и пойдёт речь, как создать программу, для запуска которой требуется пройти регистрацию. И снова регистрационный ключ будет зависеть от серийного номера диска, определяемого с помощью API функции GetVolumeInformation)
Для начала создаём новый проект и добавляем в него стартовый модуль, главная подпрограмма которого будет выполняться при запуске программы. Теперь объявляем необходимые переменные и API функцю GetVolumeInformation:
Type Config RegKEY As String username As String End Type
Public Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
Public Cfg As Config
Тип данных Config необходим для хранения в нём имени пользователя и регистрационного ключа. Далее пишем стартовую подпрограмму:
Sub Main() If Dir(App.Path & "config.cfg") = "" Then frmReg.Show Exit Sub End If
Open App.Path & "config.cfg" For Binary As #1 Get #1, , Cfg Close #1 If Cfg.RegKEY = "" Then frmReg.Show: Exit Sub If GetSN(Left$(App.Path, 3)) = GetDecodeSN(Cfg.RegKEY) Then frmMain.Show Else frmReg.Show End If End Sub
В этом коде сначала проверяем, существует ли файл настроек (вместо файла настроек можно использовать реестр), если нет, то показваем форму регистрации. Если же файл существует, считываем его данные в переменную Cfg, проверяем значение RegKEY на пустую строку. Далее идёт самый важный код - мы проверяем серийный номер, текущего накопителя (на котором запущена программа) с расшифрованым регистрационным ключём (т.е. введённый регистрационный ключ расшифровываем по специальному алгоритму, и если ключ введён правильно, то после расшифровывания он будет равен сирийному номеру накопителя, и если так, то открываем главную форму нашего проекта). Далее пишем функции для получения серийного номера и дешифрации ключа:
Function GetSN(strDrive As String) As String Dim SerialNum As Long Dim res As Long Dim Temp1 As String Dim Temp2 As String Temp1 = String$(255, Chr$(0)) Temp2 = String$(255, Chr$(0)) res = GetVolumeInformation(strDrive, Temp1, Len(Temp1), SerialNum, 0, 0, Temp2, Len(Temp2)) GetSN = SerialNum End Function
Function GetDecodeSN(coded As String) As String On Error GoTo ErLine tmpstr = ((coded * 3) - 500) 2 GetDecodeSN = coded Exit Function ErLine: GetDecodeSN = "" End Function
В функции GetDecodeSN используем алгоритм для восстановления серийного номера из регистрационнго ключа. Здесь приведён довольно простой алгоритм, но на самом деле, вам нужно будет создать свой, более сложный. Теперь надо добавить регистрационную и главную формы (в регистрационной форме необходимо проверить серийный номер с регистрационным ключём). Пример посмотрите в исходнике RegKEY, думаю, что проблем с кодом не будет. Программа почти готова к запуску. Остаётся создать генератор ключей с алгоритмом шифрования серийного номера диска (в нашем случае: ((серийный номер * 2)+500)3 ).
Смысл этой защиты состоит в том, что каждый пользователь, который захочет приобрести вашу программу, будет вынужден указать вам серийный номер своего диска. Вы же в свою очередь с помощью генератора ключей отправите регистрационный ключ, который будет действовать только на данном диске. Всё очень просто.