Глазами хакера visual basic
Иногда при создании программ возникает необходимость несколько ограничить доступ к вашему продукту. В таких случаях обычно все используют стандартную форму в 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" то есть наш пароль с пробелами между буквами. Нажмите Найти далее и смотрите, что случилось!
Не удивляйтесь, но он действительно нашёл наш пароль! Компилятор совсем никак не прячет данные в переменных даже текстовые. Вот так! Не верится? Так попробуйте ещё раз! Поменяйте код в ЛогИне:
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. Идея! Пробуем. Да действительно, найти его невозможно!
Ну, что ж? Теперь вы знаете как защитить программу от нежелательного доступа. Но это не всё! Вы ещё приобрели опыт в том как вскрыть пароль. Если хотите узнавать пароли к программам вашего противника (или конкурента), то пользуйтесь этим и никогда не рассказывайте про эту статью :) ОК? Хочу добавить, что слишком большие программы Блокнот открывать не может и всегда будет спрашивать разрешение открыть Notepad"ом. В Notepad"е отыскать пароль может составить трудности, так как Notepad отображает данные программы не с пробелами (например "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". Поверьте, пароль будет где-то поблизости!
Если вам понравилось, то вы можете написать программку, которая сама будет отыскивать пароли в программе! Я что-то подобное уже делал, получилось. Нужно найти закономерности с учётом которых ставится пароль (например около чего он находится). Думаю, эта статья не оставит вас равнодушными и вы сразу приметесь улучшать свою программу (или ломать чью-то :)). Дерзайте!