Unbestimmten Treiber zu installieren
lima-city → Forum → Programmiersprachen → C/C++ und D
argument
code
datei
frage
http
installieren
null
pfad
pointer
routine
service
share
start
starten
tag
test
treiber
type
url
windows
-
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; }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Oh, das hat ich vergessen...
2 Not Found -
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 :(
-
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? -
Nein, ich hab kein Leerzeichen.
Aber der 2. Schnippsel (installieren) geht ja...
mir geht es um das starten... -
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 -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage