• STATISTIQUES
  • Il y a eu un total de 1 membres et 5911 visiteurs sur le site dans les dernières 24h pour un total de 5 912 personnes!


    Membres: 2 450
    Discussions: 3 572
    Messages: 32 822
    Tutoriels: 77
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Kalkulators
    Ce projet a plusieurs buts, le premier étant l’étude de toutes formes cryptographiques, le cot&ea...
    Cryptographie
    [EN] HackQuest
    Logic: 12, JavaScript: 14, Applet: 6, CrackIt: 13, Crypto: 11, Internet: 3, Exploit: 7, Stegano: 12, Flash: 1, Programmi...
    Challenges
    [EN] CS Tutoring Center
    Site de challenge spécialisé dans les challenges de programmation C++ et java cependant, d'autres langages pe...
    Challenges
    [FR] Root-Me
    Notre équipe se base sur un constat : à l'heure actuelle ou l'information tend à devenir...
    Hacking
    [FR] Microcontest
    Cryptographie: 7, Mathématiques: 8, Image Son Vidéo: 5, Intelligence artificielle: 3, Réseau: 2, Divers: 7, Phy...
    Challenges
    [EN] osix
    Site de challenge qui utilise un système de level on chaque épreuve doit être réussie avant d'accédÃ...
    Challenges
    [FR] Zenk-Security
    La communauté zenk-security a pour objet principal la sécurité informatique, nous sommes des tou...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!

    €



Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C] Robot IRC
20-05-2014, 10h36 (Modification du message : 20-05-2014, 19h17 par Ekroz.)
Message : #1
Ekroz Hors ligne
Membre actif
*



Messages : 77
Sujets : 13
Points: 43
Inscription : May 2013
[C] Robot IRC
Bonsoir N-PNien(ne)s,

Parce qu'il est 1h16 et des brouettes, que je suis au régime biscottes et bouillons d'épinard, et que j'ai transpiré pour coder toute la soirée sur Vim, le cross-compilateur GCC sous Debian, la VM Windows 7 sous VBox, toussa toussa... j'ai décidé de vous partager un petit bout de code (qui fait quand même 195 lignes indenté en K&R bien dégueulasse).

Il s'agit d'un bot IRC minimal codé en C principalement pour Windows (mais certainement adaptable sur les Unix-like).

Les paramètres requis sont -h pour l'hôte/l'IP et -n pour le pseudonyme. L'option -p permet quand à elle de définir le port si il ne s'agit pas du port IRC par défaut 6667.

Sans plus tarder (fiou j'ai failli marquer "sans plus tâter") :

Code C :
#define _WIN32_WINNT 0x0501

#include <stdio.h>
#include <ws2tcpip.h>

struct irc_robot
{
    int argc;
    int s;

    char **argv;
};

int irc_robot(struct irc_robot parameters);

int main(int argc, char *argv[])
{
    PCSTR pNodeName = NULL;
    PCSTR pServiceName = "6667";

    struct addrinfo hints;
    struct addrinfo *pResult = NULL;

    int code = 0;
    int flags = 0;
    int len = 0;
    int new_argc = 0;
    int i = 0;

    WORD wVersionRequested = MAKEWORD(2, 2);
    WSADATA WSAData;
    SOCKET s = INVALID_SOCKET;

    char buf[512] = {0};
    const char *strDelimit = "\r\n";
    char *line = NULL;
    char *word = NULL;
    char *strDestination = NULL;
    char **memblock = NULL;
    char *nick = NULL;

    size_t size = 0;

    struct irc_robot parameters;

    /* Setup the hints address info structure which is passed to the
     * getaddrinfo() function */

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    ZeroMemory(&WSAData, sizeof(WSAData));
    ZeroMemory(&parameters, sizeof(parameters));

    for (i = 0; i < argc; i++) {
        if (strcmp(argv[i], "-h") == 0 && ++i < argc)
            pNodeName = argv[i];
        else if (strcmp(argv[i], "-p") == 0 && ++i < argc)
            pServiceName = argv[i];
        else if (strcmp(argv[i], "-n") == 0 && ++i < argc)
            nick = argv[i];
    }

    /* Initiates use of the Winsock DLL by the process */
    if ((code = WSAStartup(wVersionRequested, &WSAData)) != 0) {
        printf("WSAStartup(%d, %p): %d\n", wVersionRequested, &WSAData, code);
        return code;
    }

    /* Protocol-independent translation from an ANSI host name to an
     * address */

    if ((code = getaddrinfo(pNodeName, pServiceName, &hints, &pResult)) != 0)
    {
        printf("getaddrinfo(%s, %s, %p, %p): %d\n", pNodeName, pServiceName,
               &hints, &pResult, code);
        printf("WSAGetLastError(): %d\n", WSAGetLastError());
        return code;
    }

    for (; pResult != NULL; pResult = pResult->ai_next) {
        /* Closes an existing socket */
        if (s != INVALID_SOCKET) {
            if (closesocket(s) == SOCKET_ERROR) {
                printf("closesocket(%d): SOCKET_ERROR", s);
                printf("WSAGetLastError(): %d\n", WSAGetLastError());
                continue;
            }
        }

        /* Creates a socket */
        if ((s = socket(pResult->ai_family, pResult->ai_socktype,
                        pResult->ai_protocol)) == INVALID_SOCKET) {
            printf("socket(%d, %d, %d): INVALID_SOCKET\n", pResult->ai_family,
                   pResult->ai_socktype, pResult->ai_protocol);
            printf("WSAGetLastError(): %d\n", WSAGetLastError());
            continue;
        }

        /* Establishes a connection to the specified socket */
        if (connect(s, pResult->ai_addr, pResult->ai_addrlen) == SOCKET_ERROR) {
            printf("connect(%d, %p, %d): SOCKET_ERROR\n", s, pResult->ai_addr,
                         pResult->ai_addrlen);
            printf("WSAGetLastError(): %d\n", WSAGetLastError());
            continue;
        }

        _snprintf(buf, sizeof(buf), "USER %s %s %s %s\r\nNICK %s\r\n", nick,
                  nick, nick, nick, nick);
        len = strlen(buf);

        /* Sends data on the connected socket */
        if (send(s, buf, len, flags) == SOCKET_ERROR) {
            printf("send(%d, %s, %d, %d): SOCKET_ERROR\n", s, buf, len, flags);
            printf("WSAGetLastError(): %d\n", WSAGetLastError());
            continue;
        }

        ZeroMemory(buf, len);
        len = sizeof(buf);

        /* Receives data from the connected socket */
        while ((code = recv(s, buf, len - 1, flags)) > 0) {
            /* Finds the next line in the string */
            for (line = strtok(buf, strDelimit); line != NULL; line =
                 strtok(NULL, strDelimit)) {
                new_argc = 0;

                /* Finds the next word in the line */
                for (word = strtok(line, " "); word != NULL; word = strtok(NULL,
                                                                           " ")) {
                    size = strlen(word) + 1;

                    /* Allocates memory blocks */
                    if ((strDestination = malloc(size)) == NULL) {
                        printf("malloc(%d): NULL\n", strlen(word) + 1);
                        break;
                    }

                    /* Copy the word */
                    strcpy(strDestination, word);
                    size = ++new_argc * sizeof(char *);

                    /* Reallocate memory blocks */
                    if ((memblock = realloc(memblock, size)) == NULL) {
                        printf("realloc(%p, %d): NULL\n", memblock, size);
                        break;
                    }

                    memblock[new_argc - 1] = strDestination;
                }

                parameters.argc = new_argc;
                parameters.s = s;
                parameters.argv = memblock;
                irc_robot(parameters);

                /* Deallocates memory blocks */
                for (i = 0; i < new_argc; i++)
                    free(memblock[i]);

                /* Deallocates the memory block */
                free(memblock);
                memblock = NULL;
            }

            ZeroMemory(buf, len);
        }

        if (code == SOCKET_ERROR) {
            printf("recv(%d, %p, %d, %d): SOCKET_ERROR\n", s, buf, len, flags);
            printf("WSAGetLastError(): %d\n", WSAGetLastError());
            continue;
        }
    }

    /* Closes an existing socket */
    if (s != INVALID_SOCKET) {
        if (closesocket(s) == SOCKET_ERROR) {
            printf("closesocket(%d): SOCKET_ERROR", s);
            printf("WSAGetLastError(): %d\n", WSAGetLastError());
            return SOCKET_ERROR;
        }
    }

    /* Frees address information that the getaddrinfo function dynamically
     * allocates in addrinfo structures */

    freeaddrinfo(pResult);

    /* Terminates use of the Winsock 2 DLL (Ws2_32.dll) */
    if (WSACleanup() == SOCKET_ERROR) {
        printf("WSACleanup(): SOCKET_ERROR\n");
        printf("WSAGetLastError(): %d\n", WSAGetLastError());
        return SOCKET_ERROR;
    }

    return 0;
}

int irc_robot(struct irc_robot parameters)
{
    char buf[512] = {0};

    int len = 0;
    int flags = 0;
    int i = 0;

    printf(">> ");

    for (i = 0; i < parameters.argc; i++)
        printf("%s ", parameters.argv[i]);

    printf("\n");

    if (strcmp(parameters.argv[0], "PING") == 0) {
        _snprintf(buf, sizeof(buf), "PONG %s\r\n", parameters.argv[1]);
        len = strlen(buf);
        send(parameters.s, buf, len, flags);
        printf("<< %s", buf);
    }

    return 0;
}


Voili voiloù, j'attends vos remarques, vos critiques ou même vos insultes si vous décelez des choses aberrantes.
+1 (3) -1 (0) Répondre
20-05-2014, 10h43
Message : #2
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 483
Inscription : Oct 2012
RE: [C] Robot IRC
je connaissais pas ws2tcpip.h, c'est spécifique à mingw ?
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (0) -1 (0) Répondre
20-05-2014, 13h46
Message : #3
Ekroz Hors ligne
Membre actif
*



Messages : 77
Sujets : 13
Points: 43
Inscription : May 2013
RE: [C] Robot IRC
Apparemment nope, ça date de Windows 2000, c'est le header nécessaire pour la fonction getaddrinfo() qui tend à remplacer gethostbyname() considéré comme deprecated par la doc Microsoft qui ne permettait que la résolution d'adresse en mode IPv4.
+1 (0) -1 (0) Répondre
20-05-2014, 19h25
Message : #4
Ekroz Hors ligne
Membre actif
*



Messages : 77
Sujets : 13
Points: 43
Inscription : May 2013
RE: [C] Robot IRC
Bon j'ai fais quelques corrections j'étais vraiment fatigué apparemment : 3 fuites de mémoire et 2 buffer overflow (un sprintf qui a comme source argv, et l'autre qui a comme source le buffer reçu par recv()).
+1 (0) -1 (0) Répondre
20-05-2014, 20h50
Message : #5
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 483
Inscription : Oct 2012
RE: [C] Robot IRC
j'ai pas examiné en détails mais pour le moins tu peux rajouter des strncmp() aussi au lieu de strcmp()
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut