kostenloser Webspace werbefrei: lima-city


Unbestimmten Treiber zu installieren

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    Hallo,
    ich habe mir das buch Rootkits - Windows Kernel unterwandern ausgeliehen und hab da ne tag/frage">Frage:
    Wie krieg ich einen Treiber, der nicht für ein bestimmtes gerät ist ausgeführt ? Installieren funktioniert, aber das ausführen scheitert. Hier der Quelltext, des Scheiternden Programms:

    Erstmal die Hauptfunktion (main):
    SC_HANDLE   schSCManager;
    
            InstallDriver (schSCManager,
                           argv[1],
                           argv[2]
                           );
    
            StartDriver (schSCManager,
                         argv[1]
                         );
        }
    
        CloseServiceHandle (schSCManager);


    InstallDriver funktioniert zwar, aber zum besseren Nachvollziehen:
    BOOL
    InstallDriver(
        IN SC_HANDLE  SchSCManager,
        IN LPCTSTR    DriverName,
        IN LPCTSTR    ServiceExe
        )
    /*++
    
    Routine Description:
    
    Arguments:
    
    Return Value:
    
    --*/
    {
        SC_HANDLE  schService;
        DWORD      err;
    
    
    
        //
        // NOTE: This creates an entry for a standalone driver. If this
        //       is modified for use with a driver that requires a Tag,
        //       Group, and/or Dependencies, it may be necessary to
        //       query the registry for existing driver information
        //       (in order to determine a unique Tag, etc.).
        //
    
        schService = CreateService (SchSCManager,          // SCManager database
                                    DriverName,           // name of service
                                    DriverName,           // name to display
                                    SERVICE_ALL_ACCESS,    // desired access
                                    SERVICE_KERNEL_DRIVER, // service type
                                    SERVICE_DEMAND_START,  // start type
                                    SERVICE_ERROR_NORMAL,  // error control type
                                    ServiceExe,            // service's binary
                                    NULL,                  // no load ordering group
                                    NULL,                  // no tag identifier
                                    NULL,                  // no dependencies
                                    NULL,                  // LocalSystem account
                                    NULL                   // no password
                                    );
    
        if (schService == NULL)
        {
            err = GetLastError();
    
            if (err == ERROR_SERVICE_EXISTS)
            {
                //
                // A common cause of failure (easier to read than an error code)
                //
    
                printf ("failure: CreateService, ERROR_SERVICE_EXISTS\n");
            }
            else
            {
                printf ("failure: CreateService (%d)\n",
                        err
                        );
            }
    
            return FALSE;
        }
        else
        {
            printf ("CreateService SUCCESS\n");
        }
    
        CloseServiceHandle (schService);
    
        return TRUE;
    }


    und dannach noch die Scheiternde StardDriver:
    BOOL
    StartDriver(
        IN SC_HANDLE  SchSCManager,
        IN LPCTSTR    DriverName
        )
    {
        SC_HANDLE  schService;
        BOOL       ret;
        DWORD      err;
    
        schService = OpenService (SchSCManager,
                                  DriverName,
                                  SERVICE_ALL_ACCESS
                                  );
    
        if (schService == NULL)
        {
            printf ("failure: OpenService (%d)\n", GetLastError());
            return FALSE;
        }
    
        ret = StartService (schService,    // service identifier
                            0,             // number of arguments
                            NULL           // pointer to arguments
                            );
        if (ret)
        {
            printf ("StartService SUCCESS\n");
        }
        else
        {
            err = GetLastError();
    
            if (err == ERROR_SERVICE_ALREADY_RUNNING)
            {
                //
                // A common cause of failure (easier to read than an error code)
                //
    
                printf ("failure: StartService, ERROR_SERVICE_ALREADY_RUNNING\n");
            }
            else
            {
                printf ("failure: StartService (%d)\n",
                        err
                        );
            }
        }
    
        CloseServiceHandle (schService);
    
        return ret;
    }
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo ventos,

    welcher Fehlercode wird denn zurückgegeben?
  4. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    Oh, das hat ich vergessen...
    2 Not Found
  5. Hallo ventos,

    laut API-Doc bedeutet das, dass er den Treiber nicht findet.
    Hast Du beim installieren des Treibers den vollständigen Pfad angegeben, also "C:\foo\bar\...", und nicht nur einen relativen Pfad?
    Das könnte vielleicht ein Grund sein.
  6. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    Also, der Treiber liegt im verzeichnis, aus dem ich den installer ausführe als .sys datei. Bei angabe eines direkten pfads im aufruf gehts auch nicht :(
  7. Hallo ventos,

    die Doku sagt, dass man den vollständigen Pfad angeben muss:
    lpBinaryPathName [in, optional]
    The fully qualified path to the service binary file. If the path contains a space, it must be quoted so that it is correctly interpreted. For example, "d:\\my share\\myservice.exe" should be specified as "\"d:\\my share\\myservice.exe\"".

    The path can also include arguments for an auto-start service. For example, "d:\\myshare\\myservice.exe arg1 arg2". These arguments are passed to the service entry point (typically the main function).

    Dort steht auch, dass man extra Gänsefüßchen benötigt, wenn man Leerzeichen im Pfad hat. Ist das der Fall?
  8. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    Nein, ich hab kein Leerzeichen.
    Aber der 2. Schnippsel (installieren) geht ja...
    mir geht es um das starten...
  9. Hallo ventos,

    dass das Installieren funktioniert ist ja ok. Aber weil er beim Starten sagt, dass er die Datei nicht findet, bedeutet das ja, das beim Installieren etwas schief gegangen ist.
    Ich gehe davon aus, dass CreateService() den angegebenen Pfad nicht überprüft, weshalb erst bei StartService() auffällt, dass damit etwas nicht stimmt.
    Falls Du Lust hast, kannst Du mir den vollständigen Code ja irgendwie zukommen lassen, dann probiere ich es bei mir mal aus.

    Edit 1:
    Das erste, was ich festgestellt habe nachdem ich den Treiber für Win7/x64 gebaut habe, ist, dass Win7 keine nicht signierten Treiber mag. Also muss ich erst mal Test Signing aktivieren und rebooten.

    Edit 2:
    Also nachdem ich den Rechner im Test-Modus gestartet habe hat die Sache bei mir funktioniert. D.h. der Service konnte installiert und gestartet werden und zum Glück hat auch das Stoppen und Entfernen funktioniert. Das FileOpen() ist aber fehlgeschlagen.
    Jetzt bleibt die Frage, warum es bei Dir nicht funktioniert.
    Mit welchem Betriebssystem arbeitest Du denn? Der Treiber, den Du mitgeliefert hast war ja für WinXP/32 Bit. Falls Du ein anderes System hast dann musst Du vielleicht einfach den Treiber anders compilieren.

    Beitrag zuletzt geändert: 16.2.2013 21:14:10 von darkpandemic
  10. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    Ich hab Win7 x64, aber immer für x86 kompiliert, vlt liegt es daran. Das Datei öffnen kann noch nicht funzen, weil der Treiber im mom noch kein gerät registriert ;)
    Mit x64 und Kompletter pfadangabe hat er jetz endlich mal wegen was andres gemotzt, er will nen digital signierten treiber...
    Wie soll ich den testsignieren?

    Edit:
    Google ist dein Freund:
    Bcdedit.exe -set TESTSIGNING ON

    Beitrag zuletzt geändert: 17.2.2013 7:43:29 von ventos
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!