Svchost usage.



  • Hallo zusammen,

    Ich habe mir vor ein paar Tagen den Plan in den Kopf gesetzt herauszufinden wie ich meinen Service in svchost.exe hoste. Nun scheint alles was dieses Thema betrifft wie vom Internet verschluckt geworden zu sein. Alles was ich fand war dieser Beitrag :
    http://forum.sysinternals.com/writing-a-service-that-runs-under-svchost_topic11974_page3.html

    Es wurde nie eine Lösung gepostet und bestätigt. Und das was ich herausgefunden habe schient nicht zu funktionieren.

    Ich habe eine ServiceDll geschrieben und die besagten Registryeinträge gemacht. Das heißt ich habe den Namen meines zuvor bereits installierten Services (eine Exe) in die "netsvcs" Gruppe in eine neue Zeile geschrieben und einen "Parameters" Schlüssel zu meinem Serviceschlüssel hinzugefügt der die Werte "ServiceDLL = Dllpath (REG_EXPAND_SZ)" und "ServiceMain = ServiceMain (REG_SZ)" trägt. In dem Serviceschlüssel selbst habe ich den Wert "ImagePath" in "ImagePath = %SystemRoot%\System32\svchost.exe -k netsvcs" geändert.

    Ich habe dabei auch Service wie Akamai (Kollektiver Trojaner :D) und AudioSvr (Windows Audio) als Referenz benutzt und meine Registryeinträge stimmen überein. Jedoch wenn ich versuche meinen Service zu starten bekomme ich folgenden Fehler:"Fehler 127: Die angegebene Prozedur wurde nicht gefunden."

    Also wie ich mir denke funktioniert es doch so. Der Service-control Manager started anstatt meiner erst angegeben Executable (Imagepath = C:\\ExampleService.exe oder so), svchost.exe mit dem Parameter "-K", der mit der Spezifizierung der angegebenen Servicegruppe (die sich in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost in Form von REG_MULTI_SZ in Listen aufhalten) vollended wird, gestartet.
    Svchost.exe geht alle Servicenamen in der Liste durch und checkt die verschiedenen namensbezogenen Registryschlüssel wie HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MisterX'sServiceThatWasMentionedInTheServiceGroup\Parameters durch.
    Dort finded das Programm unter anderem "ServiceDLL" welches den Pfad der zuladenden DLL repräsentiert und "ServiceMain" welches (meinen Vermutungen nach) den C-style namen des Entrypoints tragen muss (in meinem Fall der Defaultname "ServiceMain").

    Ich könnte nur darauf tippen das es eine seperate Datenbank für den SVCManager gibt in der Service profilisiert werden. Vielleicht ist es auch nur previlegierten Servicen möglich unter svchost.exe gehostet zuwerden um Malware vorzubeugen. Wie auch immer, ich suche jemanden der sich in dem Thema auskennt und mir weiterhelfen kann.



  • Ich kenn mich zwar nicht besonders gut damit aus aber der Fehlermeldung nach zu urteilen exportiert deine DLL offenbar wohl keine Funktion namens "ServiceMain". Hast du vielleicht vergessen sie als extern "C" zu deklarieren!?



  • dot schrieb:

    Ich kenn mich zwar nicht besonders gut damit aus aber der Fehlermeldung nach zu urteilen exportiert deine DLL offenbar wohl keine Funktion namens "ServiceMain". Hast du vielleicht vergessen sie als extern "C" zu deklarieren!?

    Nein, ich habe alle Funktionen (DllMain miteinbezogen) in C-Style deklariert. Es muss etwas anderes sein.



  • Hm, ich würde zur Sicherheit trotzdem mal einen Blick in die DLL mit DependencyWalker riskieren. Die Fehlermeldung ist imo ziemlich eindeutig. Vielleicht wird es auch notwendig sein ein .def File zu verwenden da ja eine extern "C" Funktion mit einem _ vor dem Namen exportiert wird.



  • Ich habe gerade (tierisch dummer Fehler sorry) gemerkt das ich die __stdcall Callingconvention (WINAPI-Macro) benutzt habe und das natürlich extern "C" ungültig macht (jetzige Deklaration : extern "C" VOID _cdecl ServiceMain( DOWRD, LPWSTR *)).
    Doch jetzt bekomme ich einen neuen Fehler:
    "Fehler 126: Das angegebene Modul wurde nicht gefunden."



  • __cdecl wird sicherlich Probleme machen da Windows durchgehend __stdcall verwendet. Ich bin mir sicher dass das dann zumindest crashen wird. Ich würde auf jeden Fall WINAPI verwenden und, wie gesagt, mal depends.exe bemühen und ein .def File verwenden um den richtigen Namen in die Exporttable zu bekommen.



  • dot schrieb:

    __cdecl wird sicherlich Probleme machen da Windows durchgehend __stdcall verwendet. Ich bin mir sicher dass das dann zumindest crashen wird. Ich würde auf jeden Fall WINAPI verwenden und, wie gesagt, mal depends.exe bemühen und ein .def File verwenden um den richtigen Namen in die Exporttable zu bekommen.

    Danke, die export datei(.def) hat sehr geholfen. Mir war Dumpbin zum kontrollieren der exports sehr hilfreich, vielleicht sollte ich das noch erwähnen.


Anmelden zum Antworten