Winsock remote-shell mit Umlauten



  • Hallo, ich versuche eine cmd-shell zu implementieren, damit wir auf
    dem entfernten Rechner Abfragen darüber vornehmen können.

    Mein Ansatz besteht aus dem folgenden Quellcode.
    Nun ist das Problem, dass zwar via Telnet Umlaute korrekt angezeigt werden
    und ich mit "cd Überlegung" auch in der Ordner "Überlegung" wechseln kann,
    dies jedoch von meinem Clientprogramm aus nicht geht.

    Dort erhalte ich von der Konsole zurück "das System kann den angegebenen Pfad
    nicht finden". Er versucht auf den Ordner "berlegung" zu gehen....

    Ich frag mich ob es am Clientprogramm liegt, oder an der gebundenen Konsole an unserem Server 😕
    Denn zumindest Telnet kann die Umlaute ja korrekt verarbeiten und alles.

    char szSystemDir[MAX_PATH + 1];
    
    DWORD CALLBACK Thread_ShellSpawner(LPVOID lpParam)
    {
    
    /*
    	COORD FontSize = {16, 12};
    
    CONSOLE_FONT_INFOEX current = {0}; // zero all members
    
    current.cbSize = sizeof(CONSOLE_FONT_INFOEX);
    current.nFont = 11; // apparently this is Lucida Console (no consts are provided [3])
    current.dwFontSize = FontSize;
    current.FontWeight = FW_NORMAL; // = 400, but should use predefined consts
    current.FontFamily = FF_DONTCARE; // FF_ROMAN didn't work for me
    // FaceName is unused 
    
    */
    
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    	SOCKET sClient = (SOCKET)lpParam;
    
    	memset(&si, 0, sizeof(STARTUPINFO));
    	si.cb = sizeof(STARTUPINFO);
    	si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW | STARTF_USEPOSITION;
    	si.wShowWindow = SW_HIDE; //SW_SHOWDEFAULT
    	si.hStdError = si.hStdInput = si.hStdOutput = (HANDLE)sClient;
    
    	si.dwX = GetSystemMetrics(SM_CXSCREEN);
    	si.dwY = GetSystemMetrics(SM_CYSCREEN);
    
    	SetCurrentDirectory(szSystemDir);
    	CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
    
    	WaitForSingleObject(pi.hProcess, INFINITE);
    	closesocket(sClient);
    	return 0;
    }
    
    void Cremoteshell1Dlg::OnBnClickedButton2()
    {
    
    WSADATA wsaData;
    	WSAStartup(MAKEWORD(2,2), &wsaData);
    
    	SOCKET sServer = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, 0);
    
    	struct sockaddr_in sockAddr;
    	sockAddr.sin_family = AF_INET;
    	sockAddr.sin_port = htons(45810);
    	sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    	int sockAddrLen = sizeof(sockAddr);
    	bind(sServer, (struct sockaddr *)&sockAddr, sockAddrLen);
    	listen(sServer, 1);
    
    	GetSystemDirectory(szSystemDir, MAX_PATH);
    
    	while(TRUE){
    		SOCKET sClient = accept(sServer, (struct sockaddr*)&sockAddr, &sockAddrLen);
    		if(sClient == SOCKET_ERROR) break;
    		CreateThread(NULL, 0, Thread_ShellSpawner, (LPVOID)sClient, 0, NULL);
    	}
    
    	WSACleanup();
    
    }
    

Anmelden zum Antworten