Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #74, ФЕВРАЛЬ 2005 г.

Пишем профессиональную защиту

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. Для этого будем ксорить имя пользователя с этим словом побайтно:

Назад на стр. 074-112-1  Содержание  Вперед на стр. 074-112-3