Иногда при создании программ возникает необходимость несколько ограничить доступ к вашему продукту. В таких случаях обычно все используют стандартную форму в VB — Log In Dialog полагая, что это даёт стопроцентную защиту.
На самом деле это совсем не так! Меня давно интересовал вопрос о том возможно ли как-то подглядеть пароль из файла EXE и я понял, что действительно можно. Сегодня мы поговорим о том, как можно узнать пароль в программе EXE и о том, как защитить вашу программу от подобного рода взломов. Итак для начала создадим новый проект (Standart EXE) и кроме основной формы добавим в проект форму Log In Dialog (делается это с помощью диалогового окна Add Form, изображённого на предыдущей картинке). Теперь откроем код формы ЛогИн и увидим в процедуре обрабатывающей щелчок на кнопку cmdOK:
‘check for correct password
If txtPassword = «password» Then
‘place code to here to pass the
‘success to the calling sub
‘setting a global var is the easiest
LoginSucceeded = True
Me.Hide
Else
MsgBox «Invalid Password, try again!», , «Login»
txtPassword.SetFocus
SendKeys «{Home}+{End}»
End If
То есть если вы введёте в поле txtPassword пароль «password», то LoginSucceeded будет равняться True (пользователь ввёл верный пароль!), если же вы впишете что-то другое, то выйдет сообщение «Invalid Password, try again!». Затем сделайте форму ЛогИн стартовой и скомпилируйте ваш проект — File/Make Project1.exe (Файл/Компилировать Project1.exe). Теперь откройте вашу программу с помощью Блокнота и посмотрим на файл EXE в виде текста.
Выберите в Блокноте Поиск/Найти и введите в поле Образец строку «p a s s w o r d» то есть наш пароль с пробелами между буквами. Нажмите Найти далее и смотрите, что случилось!
Внимание: на самом деле надо было бы декомпилировать программу, но я решил показать вам насколько открыто хранится содержимое переменных в компилированной с помощью VB программе.
Не удивляйтесь, но он действительно нашёл наш пароль! Компилятор совсем никак не прячет данные в переменных даже текстовые. Вот так! Не верится? Так попробуйте ещё раз! Поменяйте код в ЛогИне:
If txtPassword = «password» Then
Например на:
If txtPassword = «ABCDE-12345″ Then
и проверьте ещё раз! Совпадений быть не может. Теперь вы знаете, что пароль в стандартном ЛогИне можно подглядеть. И читатель скажет: «Что это он всё стандартный, стандартный, а что можно сделать? Свой придумывать, новый?». Отвечу — оставить прежний, но доработать! Как? Давайте поэксперементируем. Сменим стандартный код кнопки cmdOK на следующий:
Private Sub cmdOK_Click()
Dim A As String, B As As String, C As String, D As String
A = «p»
B = «a»
C = «s»
D = «w»
A = A + B + C + D
‘check for correct password
If txtPassword = A Then
‘place code to here to pass the
‘success to the calling sub
‘setting a global var is the easiest
LoginSucceeded = True
Me.Hide
Else
MsgBox «Invalid Password, try again!», , «Login»
txtPassword.SetFocus
SendKeys «{Home}+{End}»
End If
End Sub
Проверяем!
Всё таки он есть, правда в другом виде. Как же нам запутать кракера, который попытается найти пароль к вашей программе разглядывая её в виде текста? Может запутать пароль в прямом смысле? Попробуем!
Private Sub cmdOK_Click()
Dim A As String, B As As String, C As String, D As String
B = «a»
D = «w»
C = «s»
A = «p»
A = A + B + C + D
‘check for correct password
If txtPassword = A Then
‘place code to here to pass the
‘success to the calling sub
‘setting a global var is the easiest
LoginSucceeded = True
Me.Hide
Else
MsgBox «Invalid Password, try again!», , «Login»
txtPassword.SetFocus
SendKeys «{Home}+{End}»
End If
End Sub
Смотрим!
Изменилось? Да! Правда если честно не знаю как вас, но меня такая защита не устраивает. А если пароль будет коротким? Например DAN. У нас выйдет в Блокноте A ^ N ^ D. И что? За одну минуту можно подобрать пароль поменяв полжение букв! Тогда путаницу попробуем вставить в процедуру Form_Load, а проверять переменную А будем в cmdOK. Идея! Пробуем. Да действительно, найти его невозможно!
То, что я описал для запутывания взломщика не очень подходит. Во-первых, увеличивается код программы — недолго и самому запутаться. Во-вторых, писать для каждой переменной такие вещи тоже неудобно. Лучший способ: сжать (компрессовать) программу. Для этого есть много разных утилит. Тут выгода двойная: 1) размер файла ЗНАЧИТЕЛЬНО (!) уменьшится; 2) Прогру нельзя будет декомпилировать (если взломщик не догадается чем её сжали и не декомпрессует) и просмотреть код, а Блокнот тем более не сможет хакеру помочь!
Ну, что ж? Теперь вы знаете как защитить программу от нежелательного доступа. Но это не всё! Вы ещё приобрели опыт в том как вскрыть пароль. Если хотите узнавать пароли к программам вашего противника (или конкурента), то пользуйтесь этим и никогда не рассказывайте про эту статью ОК? Хочу добавить, что слишком большие программы Блокнот открывать не может и всегда будет спрашивать разрешение открыть Notepad’ом. В Notepad’е отыскать пароль может составить трудности, так как WordPad отображает данные программы не с пробелами (например «p a s s w o r d»), а с какими-то квадратиками. Но всё равно кто ищет, тот всегда найдёт! Если поиск составил трудности, то можно при помощи Поиска найти «I n v a l i d P a s s w o r d, t r y A g a i n». Поверьте, пароль будет где-то поблизости!
Если вам понравилось, то вы можете написать программку, которая сама будет отыскивать пароли в программе! Я что-то подобное уже делал, получилось. Нужно найти закономерности с учётом которых ставится пароль (например около чего он находится). Думаю, эта статья не оставит вас равнодушными и вы сразу приметесь улучшать свою программу (или ломать чью-то :)). Дерзайте!