ник: k@s
2007 снЁс проверить нет возможности. Попробуй защиту при помощи серийного номера жесткого диска. Кстати я им пользуюсь давно , удобная штука особенного когда проги стоят за 3 тысячи км.
Защита от перезаписи.(от Сергея Литовского litovsky@vstu.unibel.by)
После завершения разработки приложения, разработчик, как правило, совершает "вояж" к заказчику и устанавливает программу на конкретном компьютере (компьютерах). Если у него при этом даже не возникает мысли о необходимости защиты своего труда от несанкционированного копирования и тиражирования (бывают "узкие" задачи, которые нужны только на конкретном месте), то будем считать, что ему повезло. Если у Вас такая же ситуация - кликните крестик в правом верхнем углу. А если, наоборот, Вы ложитесь спать и размышляете, как уберечь свой "плод бессонных ночей" от реальных (чаще - вымышленных) взломщиков - читайте дальше.
Так вот, первое, что приходит на ум поднаторевшему в формах и отчетах разработчику - "насмерть" прибить свое детище к тому компьютеру, на котором оно размещено. Чтобы работало оно только там, а тем умникам, которые его скопировали и пытаются запустить на другой машине - показывало фигу. Тут, как правило, приходится разобраться с некоторыми API-функциями. Например, привязаться к номеру жесткого диска.
Но, при этом, появляются другие трудности. В процессе эксплуатации пользователь начинает методично и бессовестно издеваться над программой, находя так называемые "ошибки" - не знает, гад, что это не наши ошибки, а его, кнопки в нужной последовательности нажимать не научился. Так вот, разработчик начинает эти ошибки исправлять и обновлять приложение у заказчика, учитывая все защитные механизмы. Понятно, что если заказчик находится в радиусе мобильной досягаемости, то нет проблем. А если он на другом конце света или Ваш радиус очень маленький. Или, например, он захотел жесткий диск поменять, а может и всю машину - что тогда? Ехать, "отрывать" и снова "прибивать".
Кроме того, развитие глобальной сети позволяет разработчику создавать и реализовывать программы не под конкретного заказчика, а в режиме "shareware". Пользователь скачивает программу, использует в течение установленного срока и, если понравилось - платит.
Все вышесказанное предполагает установки на базу соответствующей системы защиты. Ниже изложен принцип действия такой системы:
1. Разработчик свободно распространяет дистрибутив программы.
2. При установке на компьютере и первом запуске программа опрашивает компьютер и формирует уникальную контрольную сумму, которая называется "Регистрационный номер". При формировании этого номера можно ограничиться серийным номером диска, а можно пойти дальше (процессор, имя компьютера в сети, пользователь и т.д.). Далее программа осуществляет преобразование регистрационного номера (можно пофантазировать, XOR и т.д.) в "регистрационный ключ". "Регистрационный номер" предъявляется
пользователю, а в ответ пользователь должен ввести "регистрационный ключ", который программа сравнит со своим.
3. Пользователь должен связаться с разработчиком и сообщить
"регистрационный номер" программы.
4. Разработчик должен (запустив спец.процедуру регистрации) сообщить пользователю "регистрационный ключ".
5. Пользователь вводит "регистрационный ключ". Если он правильный, то программа запоминает его и при дальнейших запусках не опрашивает пользователя.
Такие системы уже вовсю применяются в западных продуктах (например, смотри, как регистрируется WinZip 7.0).
Некоторые мысли:
- Данная система не отрицает, а, наоборот, требует наличия всех остальных средств защиты: администрирование, шифрование и MDE-интерфейс.
- Если при формировании контрольной суммы учитывается много констант (напр., имя компьютера, имя пользователя, название процессора и т.д.), то при изменении одного из этих факторов программа вновь потребует зарегистрироваться. Надо учитывать этот фактор, чтобы дать возможность пользователю делать UPгрейт.
- Используя приведенный выше принцип построения защиты можно совершенно свободно распространять программу, и не ставить различные Lock на дистрибутив (типа лазерных меток на дискете).
- Можно строить приложения, в которых будет Demo (с ограниченным набором функций) и Full-режим (после регистрации).
- Можно закладывать "временные бомбы", меняя "регистрационный ключ" при наступлении определенной даты. Это бывает необходимо, чтобы заставить пользователя рассчитаться.
- И т.д.
Теперь конкретная процедурная реализация данного метода, в которой регистрационный номер текущей версии приложения формируется на основании имени номера жесткого диска, на котором размещено приложение. Изучив функции API, можно усложнить формирование регистрационного номера, добавив, например, имя компьютера, идентификатора процессора, идентификатора продавца процессора, имя пользователя:
Option Compare Database
Option Explicit
'Функция доступа к серийному номеру жесткого диска
Private 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 Const MAX_FILENAME_LEN = 256
Public Function DriveSerial() As Long
'Считывает серийный номер носителя (диска, на котором размещена
программа)
'Определяет, на каком диске программа
Dim sDrv As String
sDrv = Left(CurrentDb.Name, 1)
'Считывает номер
Dim RetVal As Long
Dim str As String * MAX_FILENAME_LEN
Dim str2 As String * MAX_FILENAME_LEN
Dim a As Long
Dim b As Long
Call GetVolumeInformation(sDrv & ":\", str, MAX_FILENAME_LEN, RetVal, a,
b, str2, MAX_FILENAME_LEN)
DriveSerial = RetVal
End Function
Public Function Parol() As Long
'Формирует пароль (регистрационный номер программы)
Dim intLongParol As Double
'Формирует контрольную сумму. Здесь можно добавлять другие
'составляющие (имя пользователя и т.д.)
intLongParol = DriveSerial()
'Делает 8 цифр в числе. Желательно определить конкретное количество цифр
'если дальше будет использоваться XOR.
Do While True
Select Case intLongParol
Case Is > 99999999
intLongParol = intLongParol / 9
Case 1 To 10000000
intLongParol = intLongParol * 9
Case 10000000 To 99999999
Exit Do
Case Else
intLongParol = 45678912 'на всякий случай
End Select
Loop
Parol = intLongParol \ 1 'Делает целое число
End Function
Public Function Otzyv(lngParol) As Long
'Формирует отзыв (регистрационный ключ) по известному паролю (рег.
номеру)
'Данная функция должна быть и в приложении и отдельно у разработчика
'Она позволяет осуществить регистрацию программы
Dim strLongOtzyv As String, intLongOtzyv As Double
Dim PartStrLongOtzyv1 As String, PartStrLongOtzyv2 As String
intLongOtzyv = lngParol
'Значение, которое стоит после Xor, можно менять для
'каждой новой версии. Это позволит отмести незарегистрированные копии.
intLongOtzyv = intLongOtzyv Xor 123456789
strLongOtzyv = Trim(str(intLongOtzyv))
If Len(strLongOtzyv) > 7 Then 'ограничим размер ключа 7-ю цифрами
strLongOtzyv = Right(strLongOtzyv, 7)
End If
Otzyv = Val(strLongOtzyv)
End Function
Далее разработчик должен осуществить следующие действия:
- Разделить базу на интерфейс и данные, если не сделал это ранее.
- Создать модуль в интерфейсной части и разместить в нем вышеописанные процедуры.
- В одной из таблиц с данными создать поле "Ключ" для хранения регистрационного ключа.
- Создать "стартовую" форму и процедуру, которая: сформирует регистрационный номер (Public Function Parol()) и регистрационный ключ (Public Function Parol()); считает регистрационный ключ из поля "Ключ";
сравнить регистрационный ключ, рассчитанный программой и хранящийся в
поле;
в случае совпадения "пропустит" пользователя, не задавая лишних
вопросов;
в случае несовпадения (в том числе и в первый раз) предъявит пользователю регистрационный номер и потребует ввести регистрационный ключ. Если пользователь осуществляет правильный ввод, то запоминает ключ в поле "Ключ" и в дальнейшем не опрашивает. Если ключ неправильный - Quit.
- Данную процедуру можно вызывать не только из "стартовой" формы, но и при загрузке других основных объектов Вашего приложения - на случай, если кто-то обойдет параметры запуска при загрузке. Кстати, при грамотной установке защиты от Shift, которая обязательно требует администрирования, шифрования и MDE-интерфейса, все будет OK.
'Пример процедуры для "стартовой" формы
Dim dbfCurrentN As Database
Dim tdfCurrentN As TableDef
Dim rstCurrentN As Recordset
Set dbfCurrentN = CurrentDb
Set tdfCurrentN = dbfCurrentN.TableDefs("Таблица1") 'таблица с нужным
полем
Set rstCurrentN = tdfCurrentN.OpenRecordset
rstCurrentN.MoveFirst 'Отыскивает требуемую запись
If rstCurrentN.Fields("Ключ") <> Otzyv(Parol) Then
'Подготовка вопроса пользователю
Dim promptN As String, titleN As String
'Инициализирует строку.
promptN = "Для работы с программой необходимо осуществить " _
& "ее регистрацию. Регистрация осуществляется при первом " _
& "запуске программы и при изменении конфигурации " _
& "компьютера. Регистрационный номер данной копии программы: " _
& Eval(Parol) & ". Введите регистрационный " _
& "ключ, который необходимо получить у разработчика:"
titleN = "Регистрация программы"
'Проверка введенного пользователем значения.
Select Case InputBox(promptN, titleN)
Case Otzyv(Parol)
rstCurrentN.Edit 'Открывает запись для редактирования
rstCurrentN.Fields("Ключ") = Otzyv(Parol)
rstCurrentN.Update 'Сохраняет изменения
Case Else
rstCurrentN.Close 'Закрывает объект Recordset
MsgBox ("Введен неправильный регистрационный ключ")
DoCmd.Quit 'Выход из Microsoft Access.
End Select
End If
rstCurrentN.Close 'Закрывает объект Recordset