• STATISTIQUES
  • Il y a eu un total de 3 membres et 11960 visiteurs sur le site dans les dernières 24h pour un total de 11 963 personnes!


    2 membres se sont inscrits dans les dernières 24h!


    Membres: 2 447
    Discussions: 3 590
    Messages: 32 838
    Tutoriels: 77
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Secuser
    Actualité de la sécurité informatique, fiches virus et hoax, alertes par email, antivirus gratui...
    Hacking
    [EN] Net Force
    Javascript: 9, Java Applets: 6, Cryptography: 16, Exploits: 7, Cracking: 14, Programming: 13, Internet: 15, Steganograph...
    Challenges
    [EN] Framework Metasploit
    Le Framework Metasploit est un logiciel gratuit, open source de tests de pénétration développ&ea...
    Vulnérabilités
    [FR] Developpez.net
    Un forum communautaire qui se veut pour les développeurs en générale. Avec presque 500 000 membr...
    Programmation
    [EN] Gekko
    Site de challenge présenter sous la forme d'une quête. Vous êtes un agent secret qui répond sous le nom...
    Challenges
    [EN] Reddit
    Subreddit dédié à la sécurité informatique.
    Hacking
    [EN] xda-developers
    Très bon site pour les gros bidouilleurs de smartphone de windows à androïd et de Apple jusqu'...
    Phreaking

  • 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: 482
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: 482
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 : 2 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut