![]() |
Sich gegen KillProcess wehren
Hallo DP,
kann sich ein Delphi-Programm dagegen wehren, über den Taskmanager abgeschossen zu werden? Oder, kriegt man es hin, dass wenn das Programm abgeschossen wird, sich dieses korrekt beendet und evtl. ein LogFile schreibt? Ich glaube zwar nicht daran, aber vlt. wisst ihr es besser. Grüße :hi: gmc |
Re: Sich gegen KillProcess wehren
.CloseQuery() wird beim Beenden aufgerufen
|
Re: Sich gegen KillProcess wehren
Aber ob beim Prozess-Killen auch CloseQuery durchlaufen wird, bin ich mir nicht sicher, denn es wird auch trotz CanClose=False geschlossen. Müsste man mal testen und im CloseQuery ein Log schreiben. Dann sieht man ja, wenn man es über den Taskmanager killt, obs geschrieben wird.
|
Re: Sich gegen KillProcess wehren
CloseQuery wird nur aufgerufen, wenn das Fenster geschlossen wird. Der TaskManager beendet aber den Prozess. Und dass man sich nicht dagegen wehren kann ist auch gut so, denn überleg mal, was das für einen Virus bedeuten würde.
|
Re: Sich gegen KillProcess wehren
Luckie, das ist richtig, aber ein Log-Eintrag wäre doch bei manchen Anwendungen angebracht. Dass man im Nachhinein sehen kann, ob die Anwendung gekillt wurde.
Ich würde den umgekehrten Weg gehen: Im CloseQuery immer einen definierten Eintrag ins Log schreiben und wenn beim nächsten Start zwar ein Starteintrag der letzten Sitzung vorhanden ist, aber kein Ende-Eintrag, wurde das Prog nicht normal beendet. Man muss also gar keine tiefgehenden System-Functionen bemühen ;) |
Re: Sich gegen KillProcess wehren
Wenn der Prozess nicht geschlossen wird, sondern abgeschossen wird, dann wird der Prozessthread sofort beendet und der Prozessspeicher aus dem Speicher entfernt.
Das einzige was diesen Vorgang aufhalten würde, wäre eine andauernde Hardwareanforderung. MS hat entschieden, dass der Benutzer die Gewalt über das System hat. |
Re: Sich gegen KillProcess wehren
Wenn man will, kann man auch einen Eintrag in die Ereignisanzeige schreiben. (zur Fehlerdiagnose)
Wie wäre es, wenn man ein 2. Programm startet, das prüft, ob das erste noch läuft und darauf dann reagiert? (Wenn sowas nicht unsinnig ist für dein Projekt) |
Re: Sich gegen KillProcess wehren
Zitat:
|
Re: Sich gegen KillProcess wehren
Zitat:
Delphi-Quellcode:
beendet erst, wenn MachWasSinnvolles fertig ist.
procedure TForm1.WMQueryEndSession;
begin Msg.Result := 0; MachWasSinnvolles; Down := true; Msg.Result := 1; end; procedure TForm1.WMEndSession; begin while not Down do Sleep(100); Msg.Result := 1; Self.Close; end; |
Re: Sich gegen KillProcess wehren
Also ich hab mal nen Watchdog für ne Firma geschrieben der prüfte ob ihre
Programme noch laufen (Prozessliste überwachen). Das würde ich dir auch empfehlen, dann einfach Loggen wenn DEIN Programm erscheint oder verschwindet. Du kannst das ganze dann mit dem Log das im OnCreate und onClose erzeugt wird vergleichen und hast deine KillProcess angriffe. Evtl. ist es sogar noch besser nur die process ID deines Programms zu ermitteln und die WindowsMessageQueue auf KillProcessmessages mit besagter Pid zu überwachen. |
Re: Sich gegen KillProcess wehren
@kalmi01: Äh, was hat des Beenden der Sitzung mit dem Abschiessen eines Prozess zu tun? Und ob Vista das noch mit sich machen lässt, weiß ich nicht. Aber auch schon Windows < Vista bringt einen entsprechenden Dialog mit dem du den hängenden Prozess beim Beenden abschiessen kannst.
|
Re: Sich gegen KillProcess wehren
Ich hab mal verschiedenes mit WinXP-Sp2 ausprobiert.
WMQueryEndSession wird nur gefeuert, wenn der Benutzer abgemeldet wird. Beim Killen über den Taskmanager passiert nix. ( Aber gut zu wissen :zwinker: ) Auch CloseQuery wird nicht gerufen wenn man den Prozess killt. Ein zweites Programm, welches das Erste überwacht, halte ich für mein Projekt für etwas overkill. Außerdem nützt es mit ja nix, wenn ich weiß, das mein Programm abgeschossen wurde, weil ich es ja eigentlich verhindern will und es gezielt beenden möchte. Meine Überlegung: :coder2: Ein Delphi-Programm besitzt doch einen Haupt-Thread. Der Taskmanger beendet nicht den Thread, sondern unterbricht ihn irgendwie und wirft ihn aus dem Speicher. (hab von Threads relativ wenig Ahnung) Da Threads ja auch Messages erhalten können, müsste es doch eine Message geben (die den Thread unterbricht,stoppt, killt, was auch immer) die man abfangen könnte. Darin "MachSonstWas" rufen und danach dem sterben freien Lauf lassen. Funktioniert sowas? |
Re: Sich gegen KillProcess wehren
TerminateProcess ist so konzipiert, dass das abgeschossene Programm gar nichts davon mitbekommt, also auch keine Message o.Ä. Das einzige was du meiner Meinung nach tun kannst, ist, dem Taskmanager einfach nicht die Rechte zum Terminieren zu geben. Ich habe dazu mal etwas gepostet, siehe
![]() |
Re: Sich gegen KillProcess wehren
Über einen SSDT Hook auf NtTerminateProcess geht das ..
|
Re: Sich gegen KillProcess wehren
Was ist denn ein SSDT-Hook? Google spuckt mir da eine ganze Menge asiatischer Seiten aus...
|
Re: Sich gegen KillProcess wehren
Hi,
ein SSDT Hook ist ein kernelhook(ring0)... aber ich kann davon nur abraten mit delphi in ring0 zu "gehen"... MfG Carlo |
Re: Sich gegen KillProcess wehren
Ja .. Ring0 sowieso nur über Treiber, also in C oder ASM. Aber du könntest mit Adminrechten auch einen Ring3 Hook installieren.
|
Re: Sich gegen KillProcess wehren
wenn es nicht wirklich hinnzubekommen ist, das abschiessen zu verhindern, dann kann man den prozess ja immer noch verstecken, fündig hierzu wird man in der codelib..
![]() mfg |
Re: Sich gegen KillProcess wehren
@lbccaleb das hat Zacherl doch gesagt:
Zitat:
MfG Carlo |
Re: Sich gegen KillProcess wehren
Verstecken ist immer die schlechteste Methode. Man will ja kein Rootkit haben :P Ein Ring3 Hook wird das einfachste sein, wobei man als Admin diesen auch jederzeit wieder entfernen kann, wenn man weiß, dass er existiert.
|
Re: Sich gegen KillProcess wehren
:duck: Könnte mir irgendjemand einen link geben, wo man solche Sachen wie die Funktionsweise und Verwendung von Hooks in höherprivilegierten Ringen nachlesen kann (grundsätzlich weiß ich, wie man Hooks setzt)?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 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