Пишем профессиональную защиту GPcH (www.dotfix.net) Хакер, номер #074, стр. 074-112-2 n = n + 1 If n > 10 Then n = 0 Next GetPass = sPass End Function Получение имени пользователя из пароля Public Function GetName(sPass As String) Dim n As Byte For i = 1 To Len(sPass) Step 2 sName = sName & Chr(Val("&H" & Mid$(sPass, i, 2)) Xor n) n = n + 1 If n > 10 Then n = 0 Next GetName = sName End Function Как видишь, функции похожи, и это является одним из свойств логической операции XOR - она полностью обратима. Вторая функция в данном случае отличается от первой лишь преобразованием HEX в CHR (без этого не обойтись, так как, если мы не будем преобразовывать пароль в HEX в первой функции, в нем могут появиться непечатаемые символы, что явно не понравится конечному пользователю :)). Теперь, когда пользователь введет пароль и имя, мы сможем легко проверить правильность этих данных, сгенерировав пароль функцией GetPass по имени и сравнив с паролем, что ввел юзер. В случае различия кодов мы можем вывести сообщение об ошибке. Но и это еще не все. Создадим глобальные переменные strName и strPass в разделе объявлений любого модуля: public strName as string public strPass as string и занесем в них имя и пароль, введенные пользователем. Зачем это нужно? Во всех расчетах в программе, в конце вычисления, мы будем плюсовать результат вычитания первого, введенного пользователем, и второго, который нам вернет процедура GetPass, пароля. Что это нам даст? Если пароли равны, то плюсоваться будет ноль и результат вычисления не изменится, в противном случае программа попросту начнет работать не так как нужно. Вот небольшой пример использования данного метода, если нам нужно посчитать произведение числа 2 на 2: srtResult=(2*2)+(val("&H" & GetPass(strName))-val("&H" & strPass)) В результате, если пароли будут одинаковы, то прибавляться будет ноль, а если крэкер взломал процедуру проверки, пароли будут различны и программа начнет глючить. К чему это приведет? Пользователь скачает крэк, поработает с взломанной прогой, заметит в ней кучу глюков и, если программа действительно ему нужна, переустановит ее и купит. Крэкеру же убрать все проверки будет крайне тяжело, так что не поленись их ввести везде, где прога выполняет арифметические вычисления. Если вычислений в твоей проге нет, результат сравнения легко можно пихать в вызов, например, диалоговых окон. Как? Очень просто: frmMain.Show (val("&H" & GetPass(strName))-val("&H" & strPass)) Если параметр будет не ноль и ты не напишешь что-нибудь типа «On error resume next», то прога может просто вызвать недопустимую операцию после взлома, так как в качестве параметра для функции загрузки формы в случае неверного пароля может передаваться что угодно. Однако этот способ защиты с трудом, но можно обойти. Ниже я рассмотрю действительно мощные алгоритмы, которые, тем не менее, желательно использовать совместно с рассмотренным методом глючной арифметики. Вызов функции по имени Допустим, нам нужно, чтобы пункт «Сохранить» в программе был доступен только после регистрации ее юзером. Для этого пишем отдельно функцию сохранения и именуем ее, к примеру, «save» (почему выбрано такое маленькое имя, станет понятно дальше). Теперь нам нужно, чтобы из имени пользователя можно было получить слово «save». Простейший способ - это использовать уже знакомый нам XOR. Для этого будем ксорить имя пользователя с этим словом побайтно: |