Как написать свой собственный WinLocker с нуля.

LeSora

Сперва нужно разобраться с теорией. Самым первым делом рассмотрим типичные варианты заражения. Способов заразиться – чрезвычайно много. Наибольшей популярностью пользуются:

1. Баги браузеров. Не для какого не секрет, что одна из целей современного вирусописателя браузер пользователя. Полезных web-сервисов пруд пруди и пользователи, конечно же, ими пользуются. Браузер для многих самая часто используемая программа, которая очень редко закрывается.

Тут и так ясно – нужно использовать уязвимости в самых популярных браузерах. Чтобы провернуть этот способ на практике – не нужно обладать особым интеллектом. Достаточно пробежаться по security-сайтам, найти соответствующий exploit и красиво оформить его под свои нужды. Быстро, просто и бесплатно.

2. Flash. Не успеют выпустить новую версию flash плеера, как хакеры умудряются обнаружить в ней критическую уязвимость. Находят, тыкают разработчиков носом, а те не спешат их (или не могут?) исправлять. Глупо полагать, что вирусописатели будут сидеть на месте и ждать, когда же залатают багу. Они не дремлют и пытаются эксплуатировать уязвимость в коростных целях. Вот так и выходит, что после просмотра забавного ролика, твоя система начинает вести себя странно.

3. Пользовательская наивность. И самое стандартное, конечно же наивные пользователи, на ютубе полно видео с такими примерами.



Язык
Лучше всего использовать хорошо проверенный временем Delphi. Возможно некоторые опытные пользователи могут возразить из-за размера самого экзешника. Весь код будет приведен на чистом API. Соответственно, скомпилированный проект будет весить меньше 100 килобайт. А если по нему пройтись архиватором байт кода, то удастся скинуть еще пару десятков кило.



Основа любого Winlocker'а
Главный кирпич любого Winlocker – форма, растянутая почти на весь экран. Причем это не, просто большая форма, а окно, которое перекрывает все остальные и совершенно не слушается никаких команд. Ни свернуть, не изменить размер, ни уж тем более завершить процесс программы.

На первый взгляд может показаться, что вирусописатели изобрели какое-то ноу-хау, но в реале все намного проще. По факту, это самое обычное окно, для которого установлен стиль отображения поверх всех окон. Чтобы окно вело себя как партизан и не реагировало на просьбы юзера, разработчики слегка модифицируют процедуру обработки сообщений из внешнего мира.

Модификация сводится к банальной обработке сообщения WM_SYSCOMMAND. Если быть еще точнее, то в процедуре обработки полученных сообщений, нужно всего, лишь объявить проверку на сообщение WM_SYSCOMMAND. Самое смешное, что в обработке этого сообщения можно вообще не писать код. Твоя форма и так перестанет реагировать на события внешней среды.



Автостарт
Вирус должен загружаться вместе с операционной системой. Чем раньше будет запущен вирус, тем больше шансов, что установленные антивирусы пойдут лесом. Существует несколько способов обеспечить своей программе автозагрузку. Условно их можно разделить на две группы: простые и продвинутые. На рассмотрение продвинутых не хватит места в статье, поэтому поглядим лишь на простые, основанные на использовании реестра. Итак, в реестре есть несколько уголков автостарта:

1.HKLM\Software\Microsoft\Windows\CurrentVersion\Run – отсюда стартуют программы, запускаемые при входе в систему любого юзера.

2.HKCU\Software\Microsoft\Windows\Current\Version\Run – место аналогично предыдущему, за исключением того, что отсюда стартует программы для текущего пользователя.

3.HKLM\Software\Microsoft\Windows\CurrentVersion\RunServices – список программ запускаемых до входа пользователей в систему.

4.HKLM\Software\Microsoft\Windows\CurrentVersion\policies\Explorer\Run – этот раздел реестра отвечает за старт программ, добавленных в автозагрузку через групповые политики.

5.HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows – еще одно место, содержащее список программ, загружаемых вместе с Windows.

6. KHLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon – в этой ветке указывается ссылка на винлогон, но ничего не мешает указать и путь до своей программы.

7. Папка автозагрузки. Пожалуй, самый примитивный способ, но тем немение, многие вирусописатели им пользуются.

Какое из предложенных мест автозагрузки выбрать для своего творения? Точного ответа нет, но крайне рекомендуется не ставить все на какой-то один их предложенных вариантов. Куда лучше использовать комбинацию, т.е. прописываться сразу в несколько мест. Пример записи в автозагрузку на WinAPI.



Незакрываемое окно на Windows API
wc.cbSize:=sizeof(wc); wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc; wc.cbClsExtra:=0; wc.cbWndExtra:=0;
wc.hInstance:=HInstance; wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow); wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil; wc.lpszClassName:='win_main';

RegisterClassEx(wc);

leftPos:=20;
topPos:=0;

windowWidth:=Screen.Width;
WindowHeight:=Screen.Height;

MainWnd:=CreateWindowEx(
0,
'win_main',
'test',
ws_overlappedwindow,
leftPos,
topPos,
windowWidth,
windowHeight,
0,
0,
Hinstance;
nil
);

SetWindowLong(MainWnd, GWL_HWNDPARENT,
GetDesktopWindow);

SetWindowPos(MainWnd, HWND_TOPMOST,
0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);

ShowWindow(MainWnd, CmdShow);

While GetMessage(Mesg,0,0,do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;


WinAPI для работы с реестром

var Key: HKey; begin //Сюда можешь подставить один из путей автозагрузки.
RegOpenKey(HKEY_LOCAL_MACHINE, PChar('путь в реестре'), Key);
RegSetValueEx(Key,PChar(paramstr(
), 0, REG_SZ, pchar(paramstr(
), lstrlen(pchar(paramstr(
))+1);
RegCloseKey(Key);
end;



Блокировка
Переходим к самой интересной части – блокировки системы пользователя. Как мы знаем, все блокировки производятся путем внесение изменений в реестр.

Перед тем как рассмотреть конкретные примеры объектов блокировки, я хочу поделиться с тобой одним советом. На основе него, очень легко придумывать новые «пакости». Идея проста до безобразия. В профессиональных редакциях Windows (те, что Pro и выше) имеется редактор групповых политик (gpedit). С его ты имеешь возможность создавать правила входа в систему и т.д. Например, ты запросто можешь назначить программу, которая будет запускаться после загрузки системы, заблокировать старт определенного приложения и т.д. Практически все операции, которые выполняются через эту оснастку, на самом деле изменяют определенные ключи реестра. Если ты умудришься разузнать, какие именно ключи реестра модифицируются, то без проблем сможешь изменять их прямо из своей программы. Как это сделать? Минимум существует два варианта: применить метод научного тыка или воспользоваться утилитой ProcessMonitor от Марка Руссиновича. Второй способе явно круче, поэтому советуем скачать утилиту и приступить к исследованиям.



Редактор реестра
Большинство пользователей привыкли редактировать реестр с помощью встроенного в Windows редактора реестра (regedit). Поскольку наш вирус будет вносить изменения в реестр, нам кровь из носа нужно не допустить, ковыряние в реестре со стороны нерадивого пользователя. Нечего ему совать свой любопытный нос, куда не надо. Решить это задачу лучше путем блокировки запуска редактора реестра. Чтобы выполнить блокировку, достаточно создать ключ DisableRegistryTools со значением 1 в ветке

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System.



Диспетчер задач
Все винлокеры без исключения блокировали запуск диспетчера задач. Что ж не будем от них отставать. Реализуется эта фича путем создания ключа DisableTaskMgr (тип dword) со значением 1 в той же самой ветке, где и DisableRegistryTools.



Установка и удаление программ
Особо мозговитые юзеры, путем аплета установка и удаление программ, в случае заражения системы пытаются инсталлировать антивирусы. Это легко присечь на корню, если создать ключ NoAddRemovePrograms со значением 1 (тип dword) все в том же разделе, где и DisableRegistryTools.



Блокируем доступ к дискам
Чтобы полностью испортить пользователю настроение можно вообще заблокировать доступ к присутствующим дискам в системе. Пусть юзер даже не пытается запустить антивирус со своей флешки! Выполняем это путем создания ключа NoViewOnDrive (тип dword) в разделе HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer. В качестве значения для ключа указываем битовою маску блокируемого диска. Например, для диска C эту будет 4. В случае если требуется заблокировать несколько дисков, то их маски придется сложить. Например, значение 12 будет соответствовать блокировке диска C ( 4 ) и D ( 8 ).



Ограничиваем запуск приложений
С помощью реестра реально определить список одобренных для запуска программ. Если этот список заполнен, то все приложение, которые в него не попали, пользователь запустить не сможет. Список одобренных к запуску приложений создается здесь: HKEY_CURRENT_USER\Microsoft\Windows\CurrentVersion\Policies\Explorer\RistrictRun. Создав в этом разделе ключи (тип REG_SZ) для каждой разрешенной программе, тебе нужно будет подняться на один уровень выше и добавить параметр RestrictRun типа dword со значением 1.



Управление компьютером
Много нехороших дел сможет натворить пользователь, если у него имеется доступ к запуску оснастки «Управление компьютером». Полностью отключить оснастку с помощью реестра нельзя, но удалить ссылку на ее запуск из контекстного меню ярлыка «Мой компьютер» - проще пареной репы. Всего лишь требуется создать параметр NoManageMyComputerVerb типа dword со значением 1 в разделе HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer.



Выключаем службы
Используя возможности реестра, без проблем можно отключить ненужные (например, антивирусы) пользователю службы. Полный список установленных в системе служб находится в ветке HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. Для деактивации службы нужно отредактировать значение ключа start. Например, чтобы установить службе «Тип запуска» в значение «вручную», ключу start необходимо присвоить 3. Если желаешь, чтобы твой вирус протянул во вражеской системе дольше, то советую вести в своем творении базу служб антивирусов. Т.е. тебе необходимо четко опознавать сервисы антивирусов и менять им тип запуска.



Улучшение
Типичные функции любого Winlocker'а мы рассмотрели, теперь самое время подумать о том, как улучшить наше детище. Всегда есть шанс увести с компьютера пользователя полезную информацию: пароли на различные сервисы, документы, записанные skype переговоры и т.д. Мы не будем вводить каких-то ограничений, а проапгрейдим наш вирус по полной программе.



Улучшение №1
В любом месте веселее вместе

Заразил компьютер бедного пользователя? Не забудь позаботиться о его друзьях! Помни, чем больше распространится вирус, тем больше шансов получить деньги. Обосновавшись на вражеском пк, нужно не терять времени зря, а пытаться найти новый плацдарм. Как это сделать? Один из простых и самых действенных способов – мониторинг и заражение флэшек. Поскольку пользователи постоянно пользуются флешками, нашему вирусу будет легко мигрировать из одной системы в другую. Определить факт подключения флешки – легко. Достаточно написать код, обрабатывающий событие WM_DEVICECHANGE.



Мониторим флешки
var disk:DWORD; begin case Msg.WParam of DBT_DEVICEARRIVAL: //Если подключили флэшку if (PDEV_BROADCAST_HDR(Msg.LParam)^ .dbch_devicetype = DBT_DEVTYP_VOLUME) then begin //Пытаемся определить букву диска disk := PDEV_BROADCAST_VOLUME(Msg.LParam)^ .dbcv_unitmask; //Выполняем свой зловредный код end;
DBT_DEVICEREMOVECOMPLETE: //Если флэшку извлекли
if (PDEV_BROADCAST_HDR(Msg.LParam)^
.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
//Флешку отмонтировали
end;



Улучшение №2
Ваши пассы будут наши!

Какими web-сервисами пользуется современный юзер? Не нужно иметь семь пядей во лбу, чтобы угадать хотя бы несколько из них: почта, одноклассники, в контакте, facebook, twitter, etc. Список можно продолжать до бесконечности. К чему это я клоню? А к тому, что находясь на вражеской территории, было бы неплохо собрать все пароли. Авось в будущем пригодятся. К тому же, имея на руках такие козыри, становится реальным простимулировать жертву. Например, получив пароли от всевозможных аккаунтов, автор вируса может воспользоваться ими для смены контактных персональных данных и изменения паролей на свои. В результате, реальный пользователь попадет в очень нехорошую ситуацию. Попросту говоря, он лишиться своего аккаунта. Это уже куда серьезней заблокированного рабочего стола, а раз так, то шансы оплаты «твоих услуг» возрастают.



Сразу возникает вопрос, а каким образом это проще всего сделать? Обычно юзеры хранят свои пароли прямо в браузере, поэтому сразу напрашивается вариант угнать файлик хранилища паролей. Пример такого угона был продемонстрирован в статье «Злобный комп». Сейчас повторяться не буду, а лучше покажу тебе альтернативный способ.

Идея заключается в банальном модифицировании hosts. В этом файле прописываются соответствия типа: «символьный адрес сайта:ip». Наша программа должна уметь модифицировать этот файл и добавлять соответствия для популярных web-сервисов. «А куда будем переадресовывать пользователя?». Можешь для этого замутить свой evil сайт, на котором и будут располагаться скамы популярных сервисов. Этот способ прост в реализации, но при массовом заражении пользователей, такие сайты наверняка будут умирать быстрей, чем самые дохлые бактерии. В связи с этим, откажемся от предложенного способа, а пойдем не совсем стандартным путем – встроим в вирус мини web-сервер. При таком раскладе пунктом назначения переадресации у нас будет localhost.



Рассматривать правка файла host не будем, лучше сразу взглянем на то, как с помощью Delphi поднять WEB-сервер. Если ты постоянный читатель нашего журнала, то ты уже должен хорошо ориентироваться в Winsock API. Где-то года два назад, в рубрике кодинг публиковали мои статьи про написание всевозможных клиентов (FTP клиент, PROXY сервер, IRC и т.д.) используя лишь api функции. Рекомендую тебе поднять подшивку и хорошенько ознакомиться с сабжевой темой



WEB-Сервер
var _buff: array [0..1024] of char; _request:string; _temp: string; _path: string; _FileStream : TFileStream; begin Recv(_client, _buff, 1024, 0); _request:=string(_buff);



_path := GetFilePath (Copy
(_request, 1, pos(#13, _request)));
_path := ReplaceSlash(_path);

if ((_path = '') or (_path = '\')) Then
_path := DocumentRoot +'\' + DirectoryIndex;
{ else

if ((_path[length(_path)] ='\')) Then
_path := DocumentRoot + '\' +
DirectoryIndex; }

if (FileExists(_Path)) Then
begin
_FileStream :=
TFileStream.Create(_Path, fmOpenRead);

SendStr(_Client, 'HTTP/1.0 200 OK');
SendStr(_Client, 'Server: xSrV');
SendStr(_Client, 'Content-Length:' +
IntToStr(_FileStream.Size));
SendStr(_Client, 'Content-Type: '
+ GetTypeContent(_Path));
SendStr(_Client, 'Connection: close');
SendStr(_Client, '');
SendFile(_Client, _FileStream);
_FileStream.Free;
End

Само собой, web-сервер должен быть вежливым и отобразить реальную страницу сайта который мы взяли. Ну а дальше все просто и банально – юзер вбивает свои данные для входа, после чего наш web-сервер их сохраняет. Чтобы не было откровенного палева, желательно сделать страницу, на которой описать, что одноклассники сейчас недоступны или что-то в подобном роде. Или как вариант, сразу отправлять введенные данные на реальные одноклассники.



Ловушка
Все winlocker просят у честного юзера денег за излечение компа (которое, кстати так и не делают), но как и следует ожидать, платить желают далеко не все.

К чему этого я все говорю? А к тому, что неплохо было как-то простимулировать пользователя. Дать ему допинг, от которого наверняка захочется распрощаться с парой кровных баксов. Как это сделать? Один из действенных вариантов будет совершение марш броска по директориям пользователя и шифрование найденных файлов. На какие файлы обращать внимание? Лучше всего на те, от которых может зависить работа/учеба жертвы, например: документы (doc, xls, mdb, ppt, txt), изображения (jpeg, png, bmp), исходные тексты (php, pas, c, h, cpp, dpr, py и т.д.). Если жертва писала дипломную работу или какой-нибудь сверхважный отчет, который завтра сдавать, то у тебя есть все шансы получить денежное вознаграждение.



Теперь поговорим о технической реализации это фичи. Поиск файлов осущетвляется с функциями FindFirst() и FindNext() из модуля Sysutils. Работать с ними легко, но простота фаст фуда отрицательно отразиться на фигуре нашего приложения. Поскольку, набирать лишний вес нам не к чему, мы воспользуемся более диетическими продуктами: FindFirstFile() и FindNextFile(). Работать с ними чуточку сложнее (см. пример поиска файлов на диске), но красота требует жертв.

Шифрование файлов, средствами Delphi также осуществляется достаточно просто. Все зависит от выбранного способа шифрования. Один из самых простых воспользоваться готовыми модулями, которых на torry.net и на других сайтах пруд пруди. Например, мне попался неплохой вариант от одного из разработчиков Delphi. В этом модуле реализованы следующие функции:

//Шифрование файла function FileEncrypt(InFile, OutFile: String; Key: TWordTriple): boolean; //Расшифровка файла function FileDecrypt(InFile, OutFile: String; Key: TWordTriple): boolean; //Шифрование текста function TextEncrypt(const s: string; Key: TWordTriple): string; //Расшифровка текста function TextDecrypt(const s: string; Key: TWordTriple): string; //Шифрование «памяти» function MemoryEncrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer; TargetSize: Cardinal; Key: TWordTriple): boolean; //Расшифровка «памяти» function MemoryDecrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer; TargetSize: Cardinal; Key: TWordTriple): boolean;



Улучшение №4
Попав в чужую систему нужно потрудиться и постараться удержаться в ней как можно дольше. Стопроцентно сказать, как это лучше всего это сделать, я не могу. Первое (и самое простое в реализации), что мне пришло в голову, встроить в winlocker мини джойнер. Алгоритм будет таким. При активации в системе жертвы основная программа будет заражать наиболее часто используемые программы. Причем, сам вирус прицепляться не должен. В качестве паразита будет выступать маленькая «безобидная» программка. Ее основной функцией будет выполнение проверки на наличие процесса вируса. Если его нет, то необходимо инициировать загрузку «вируса» из интернета и дальнейший его запуск.

С точки зрения программирования, создать joiner совсем не сложно. К тому же, пару лет назад мы поднимали эту тему на страницах нашего журнала.

Фишка №5: Играй в прятки по максимуму

Как показала практика, авторы Winlocker'ов не сильно забоятся о безопасности своих детищ. Защита большинства представителей этой группы вирусов, попавшихся мне на глаза, сводилась к банальному присвоению неприметного имени файла. Например: system.exe, user32.exe, csrss.exe, eplorer.exe и т.д.



И самое важное твоя безопасность:

1. Давай файлу вируса неприметное имя. Хоть это и примитивное правило, но соблюдать его крайне желательно.

2. Удали вирус из списка процессов. Этого можно добиться, разобравшись с перехватом API функций. Мы уже много раз писали про перехват API. Обязательно перечитай эти статьи!

3. Используй несколько способов автозагрузки.



Улучшение №4
Не поленись и напиши процедуру принудительного завершения процессов. Она обязательно поможет тебе уберечь свое детище от злобных антивирусов, которые пользователь будет пытаться запустить. В идеале вообще организовать перехват функций, использующихся для запуска программ и не допускать, чтобы они нормально отрабатывали.



Epidemic complete
Написать WinLocker и срубить на нем несколько сотен баксов – более чем реально. Пользователи по-прежнему не думают о безопасности и при возникновении щепетильной ситуации готовы отправить заветную смс'ку, нежели напрячь свои извилины. Сегодня я показал скелет типичного Winlocker'a. В принципе, довести его до боевого состояния дело нескольких часов. Только нужно ли это делать? Выбор за тобой! Главное не забывай о том, что написание и распространение вирусов уголовно-наказуемое деяние, за которое можно схлопотать реальный срок.



Заключение
Само собой эта статья была написана исключительно в ознакомительный целях и никто просто так не будет давать исходник винлока. Но все же для многих это было весьма информативно, как минимум потому, что использовался такой, уже весьма старый, язык, как Delphi.