winsocket - warten bis eine verbindung beendet ist



  • Hi,

    Ich versuche mich grade an einer simplen Remoteshell, diese funktioniert beim ersten Zugriff auch. Jedoch möchte ich das der Socket danach nicht geschlossen wird sondern wieder in den accept modus geht und auf neue Verbindungen wartet.

    Hier mein jetziger code ( thx @ c-worker.ch für das socket tut )

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    int startWinsock(void);
    
    int main(int argc, char *argv[]){
    
      long rc;
    
      SOCKET acceptSocket;
      SOCKET connectedSocket;
      SOCKADDR_IN addr;
    
            STARTUPINFO si;
            PROCESS_INFORMATION pi;
            struct sockaddr_in adik_sin;
            memset(&si,0,sizeof(si));
    
      rc=startWinsock();	//winsock start
    
      if(rc!=0){
      		printf("Fehler: startWinsock, fehler code: %d\n",rc);
    		return 1;
      }
    
    while(1){
      acceptSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,NULL,NULL);
    
      if(acceptSocket==INVALID_SOCKET){
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
    
      memset(&addr,0,sizeof(SOCKADDR_IN));
    
      addr.sin_family=AF_INET;
      addr.sin_port=htons(1010);
      addr.sin_addr.s_addr=ADDR_ANY;
    
      rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
      if(rc==SOCKET_ERROR){
    	printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
    	return 1;
      }
    
      rc=listen(acceptSocket,10);
      if(rc==SOCKET_ERROR){
      	printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
      	return 1;
      }
    
      connectedSocket=accept(acceptSocket,NULL,NULL);
    
      if(connectedSocket==INVALID_SOCKET){
      	printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());
      	return 1;
      }
    
      //socketstream wird mit cmd.exe stream verbunden
      si.cb = sizeof(si);
      si.dwFlags = STARTF_USESTDHANDLES;
      si.hStdInput = si.hStdOutput = si.hStdError = (void *)connectedSocket;
      CreateProcess(NULL,"cmd",NULL,NULL,1,NULL,NULL,NULL,&si,&pi);
      ExitProcess(0);
    }
      return 0;
    
    }
    
    int startWinsock(void){
    
      WSADATA wsa;
    
      return WSAStartup(MAKEWORD(2,0),&wsa);
    
    }
    

    Fehlerausgabe nach dem ersten Verbindungsaufbau:

    Fehler: bind, fehler code: 10048
    

    Ich denke er kann den Socket nicht an den gewünschten Port binden da dieser noch blockiert ist.

    Wie kann ich das besser machen ?

    Thanx in advance c°h°



  • habs hier mein code jetzt sogar mit pwabfrage 🙂 mfg

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    #pragma comment(lib,"ws2_32")
    
    int startWinsock(void);
    
    int main(int argc, char *argv[]){
    
      if( argc < 1 ) return 1;
    
      long rc;
    
      SOCKET acceptSocket;
      SOCKET connectedSocket;
      SOCKADDR_IN addr;
    
      STARTUPINFO si;
      PROCESS_INFORMATION pi;
      struct sockaddr_in adik_sin;
      memset(&si,0,sizeof(si));
    
      char buf[10];
    
      while(1){
    
      		rc=startWinsock();
    
      		if(rc!=0){
      			printf("Fehler: startWinsock, fehler code: %d\n",rc);
    			return 1;
      		}
    
      		acceptSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,NULL,NULL);
    
      		if(acceptSocket==INVALID_SOCKET){
        		printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        		return 1;
      		}
    
      		memset(&addr,0,sizeof(SOCKADDR_IN));
    
      		addr.sin_family=AF_INET;
     		 addr.sin_port=htons(atoi(argv[1]));
     		 addr.sin_addr.s_addr=ADDR_ANY;
    
      		rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
      		if(rc==SOCKET_ERROR){
    			printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
    			return 1;
      		}
    
      		rc=listen(acceptSocket,10);
      		if(rc==SOCKET_ERROR){
      			printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
      			return 1;
      		}
    
      		connectedSocket=accept(acceptSocket,NULL,NULL);
    
      		if(connectedSocket==INVALID_SOCKET){
      			printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());
      			return 1;
      		}
    
      		strcpy(buf,"GiMMiX");
      		rc=send(connectedSocket,buf,6,0);
    
      		rc=recv(connectedSocket,buf,10,0);
    
    		if(strncmp(buf,"passwort",8)==0){
      		//socketstream wird mit cmd.exe stream verbunden
      		si.cb = sizeof(si);
      		si.dwFlags = STARTF_USESTDHANDLES;
      		si.hStdInput = si.hStdOutput = si.hStdError = (void *)connectedSocket;
      		CreateProcess(NULL,"cmd",NULL,NULL,1,NULL,NULL,NULL,&si,&pi);
    
      		WaitForSingleObject(pi.hProcess,INFINITE);
    		}
      		closesocket(acceptSocket);
      		closesocket(connectedSocket);
    		WSACleanup();
    
      }
      return 0;
    
    }
    
    //-----------------startWinsock-----------------------
    int startWinsock(void){
    
      WSADATA wsa;
    
      return WSAStartup(MAKEWORD(2,0),&wsa);
    
    }
    


  • Es ist aber nicht garantiert das du das ganze Passwort mit einem Aufruf von recv bekommst.


Anmelden zum Antworten