[C#] ICQ Gate

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by CodeSender:), 22 Dec 2010.

  1. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Собсна хочу написать свой ICQ гейт на подобии этого:
    http://www.exploit.in/modules.php?name=news&file=view&news_id=1512

    Как лучше это организовать?Думаю сделать так:
    1)Принимаем трафик на свой порт
    2)Выдёргиваем с него то что нам надо
    3)Перенаправляем его на реальный ICQ сервер.

    Схема реальная?В какую сторону гуглить?
     
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Проще socks5 сервер написать и дополнить его нужным функционалом.
    проще потому что не нужно реализовывать ВЕСЬ протокол, а лишь читать/изменять из трафика нужное.

    Я начинал делать и затормозил на реализации сокса
    /thread217458.html
     
    _________________________
  3. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Там софт построен на схеме ретранслятора.Интересно было бы почитать подробнее об этом, но инфы я найти не могу.

    P.S Писать через прокси не хочется ибо в некоторых клиентах нет возможности использовать прокси-сервер.
     
    #3 CodeSender:), 22 Dec 2010
    Last edited: 22 Dec 2010
  4. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    А чем прокси сервер тебе не "ретранслятор". Увидел незнакомое слово и все тут :)

    Вот тебе простейший "ретранслятор"
    Code:
    void copy_data(int src, int dst) {
        static char buf[BUFSIZ];
        ssize_t nr, nw, off;
     
        while ((nr = read(src, buf, sizeof (buf))) == -1) {
            if (errno != EINTR) {
                //syslog(LOG_ERR, "read failed: %m");
                exit(EXIT_FAILURE);
            }
        }
     
        if (nr == 0) /* reached EOF */
            done++;
     
        for (off = 0; nr; nr -= nw, off += nw) {
            if ((nw = write(dst, buf + off, (size_t) nr)) == -1) {
                //syslog(LOG_ERR, "write failed: %m");
                exit(EXIT_FAILURE);
            }
        }
    }
    
    ...
    // применимо к сокетам A - 1 соединение B - 2 соединение 
            FD_ZERO(&rdset);
            FD_SET(A, &rdset);
            FD_SET(B, &rdset);
            select(n, &rdset, NULL, NULL, NULL);
            
            if (FD_ISSET(A, &rdset))
                copy_data(A, B);
     
            if (FD_ISSET(B, &rdset))
                copy_data(B, A);
    
    
    aka туннель

    Кхм ну не хочешь прокси как вариант пиши обычный сервер
    при подключении клиента подключайся серверу icq и делай туннель между клиентским сокетом и сокетом сервера icq.
     
    _________________________
    #4 Gar|k, 22 Dec 2010
    Last edited: 22 Dec 2010
  5. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    обновил месседж.