Защита от несанкционированного входа в систему собственными силами на Delphi

И так приступим к разработке нашей программы. Для начала нам понадобится: Delphi 7 и выше, руки в количестве двух штук (прямые), одна голова.
Создайте новый проект Delphi и измените свойства формы:
Caption – (на ваше усмотрение)
Align – alCustom
BorderStyle – bsNone
FormStyle – fsStayOnTop
Position – poDesktopCenter
Разместите на форме компонент Label категории Standard и измените его свойства:
Caption – (на ваше усмотрение)
Разместите под меткой компонент Edit категории Standard и присвойте его свойству Name значение pass. Для того чтобы скрыть ввод текста (то есть, вводимый пользователем пароль), следует указать в свойстве PasswordChar символ, который будет отображаться вместо вводимого текста.

Под полем pass разместите кнопку (компонент Button категории Standard) и присвойте ее свойству Caption значение Enter. По нажатию этой кнопки будет выполняться проверка корректности пароля.
Еще нам потребуется два компонента Timer категории System. Для первого таймера необходимо изменить значение свойства Interval на 10, для второго никаких свойств изменять не нужно.
Объявим в качестве закрытых членов класса формы переменную типа HWND и две процедуры, которые разработаем чуть позже:

type
TForml = class(TForm)
private
{ Private declarations }
hi: HWND; //переменная, содержащая идентификатор окна
procedure logon(); //блокирует все, пока пароль не будет введен верно
procedure check(); //проверка корректности пароля
public
{ Public declarations }
end;

Теперь в разделе implementation создадим сами процедуры. Сначала процедура check:

procedure TForml.check() ;
begin
if pass.Text = password1 then //если пароль верный
begin
//узнаем идентификатор Рабочего стола
hi := FindWindow(Progman, nil);
//разрешаем работу с Рабочим столом
ShowWindow(hi, sw_show);
// узнаем идентификатор панели задач
hi := FindWindow(Shell_traywnd, nil);
//разрешаем работу с панелью задач
ShowWindow(hi, sw_show);
halt; //закрываем программу
end // иначе, выводим сообщение о неверном пароле
else ShowMessage(Wrong password!);
end;

Процедура check проверяет корректность пароля. В данном случае в качестве пароля используется слово "password". Если в поле pass введено именно это слово, то разблокируем Рабочий стол и панель задач. После этого доступ ко всему открыт, и мы завершаем работу программы. Если же введенный пользователем текст не совпадает с корректным паролем, то мы продолжаем требовать ввод пароля.
Теперь очередь процедуры logon:

procedure TForml.logon();
begin
//узнаем идентификатор Рабочего стола
H1 := FindWindow(Progman, nil);
ShowWindow(hi, sw_hide); //прячем Рабочий стол
//находим панель задач
H1 := FindWindow(Shell_traywnd, nil);
ShowWindow(hi, sw_hide); //прячем панель задач
{проверяем, не запущен ли диспетчер задач}
H1 := FindWindow(nil, Диспетчер задач Windows);
(если да, то закрываем окно диспетчера задач}
if (hi О 0) then PostMessage(hi, WM_QUIT, 1, 0);
end;

Здесь мы блокируем Рабочий стол и панель задач, а затем проверяем, не пытается ли пользователь отключить нашу программу с помощью диспетчера задач. Если окно диспетчера задач открыто, то закрываем его.
Теперь нам почти не придется программировать — мы просто будем вызывать процедуры check и logon. При нажатии кнопки Enter вызывается процедура check:

procedure TForml.ButtonlClick(Sender: TObject);
begin
check;
end;

Для того чтобы не утруждать пользователя нажатиями кнопки на форме, имитируем эту операцию по нажатию в поле pass клавиши <Епter>. Для этого создайте обработчик события pass . ОпКеуРгеss:

procedure TForml.passKeyPress(Sender: TObject; var Key:Char);
begin
if key = #13 then // если нажата клавиша <Enter>
check; //вызываем процедуру check
end;

Для первого таймера событие OnTimer будет содержать только вызов процедуры logon:

procedure TForml.TimerlTimer(Sender: TObject);
begin
logon;
end;

Для второго таймера (у которого свойство Interval имеет значение 1000) добавьте в обработчик события OnTimer следующий код:

procedure TForml.Timer2Timer(Sender: TObject);
begin
h1 := FindWindow(Progman, nil); //поиск Рабочего стола
ShowWindow(hi, sw_hide); //прячем Рабочий стол
CloseWindow(hi); //сворачиваем окно Рабочего стола
pass.SetFocus; //переводим курсор в текстовое поле
end;

Сворачивание окна Рабочего стола приводит к закрытию системного меню Пуск, если оно открыто. В конечном итоге пользователь не имеет доступа к Рабочему столу, к панели задач, к меню Пуск и диспетчеру задач, однако, несмотря на то, что наша программа не имеет заголовка, ее можно закрыть с помощью комбинации клавиш <Alt+F4>. Для того чтобы отключить эту возможность, создайте обработчик события главной формы OnCloseQuery и добавьте в него следующий код:

procedure TForml.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := False;
end;

Единственное, что осталось сделать, —- обеспечить программе на Pascal автозагрузку, указав путь к ней в системном реестре. Для работы с реестром необходимо добавить в раздел uses ссылку на модуль Registry, а затем создать следующий обработчик события формы QnCreate:

procedure TForml.FormCreate(Sender; TObject);
var
Reg: TRegistry; //переменная для работы с реестром
begin
Reg:• TRegistry.Create;
Reg.RootKey :=> HKEY_CURRENT_USER; //только для текущего
//пользователя
Reg.OpenKey(SoftwareMicrosoftWindowsCurrentVersionRun,
true);//открываем раздел автозагрузки в реестре
//и записываем название и полный путь к нашей программе
Reg.WriteString(Logon, Application.ExaName);
Reg.CloseKey; //закрываем реестр
Reg.Free; //освобождаем память
end;

Теперь наша программа будет загружаться для текущего пользователя вместе с системой и требовать ввод пароля.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Дата публикации: