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/)
-   -   Anwendung 100%ig garantiert beenden (lassen)? (https://www.delphipraxis.net/167643-anwendung-100ig-garantiert-beenden-lassen.html)

Furtbichler 11. Apr 2012 06:34

Anwendung 100%ig garantiert beenden (lassen)?
 
Hallo Leute,

Ich habe hier eine Anwendung, die beim Beenden manchmal im Speicher hängen bleibt. Das liegt an einer DLL, die offenbar schlampig programmiert ist.

Manchmal bleibt also die Anwendung im Speicher kleben. Da sie als "Singleton-EXE" umgesetzt ist, d.h. nur einmal gestartet werden kann, blockiert diese Leiche alle Versuche, die Anwendung neu zu starten (logisch, sie ist ja noch 'da').

Ich habe also diverse Dinge probiert, u.a. schickt die Anwendung einer anderen EXE (=der Wächter) eine Message, die daraufhin mit Killprocess versucht, das Teil zu entfernen. Klappt nicht immer.

Das blöde Ding will manchmal auch über den Taskmanager nicht weichen. Da hilft dann nur "abmelden", wobei Windows es irgendwie hinbekommt, das Teil entgültig zu vernichten.

Meine Fragen:
1. Gibt es eine 'best practice', um mit DLLs umzugehen? z.b. nicht statisch (eh blöd), kontrollierter Shutdown (d.h. die DLL entladen) usw.
2. Gibt es eine 100% sichere Möglichkeit eine EXE aus dem Speicher zu entfernen?
3. Wie schafft Windows es beim Abmelden / Runterfahren, jede EXE aus dem Speicher zu kicken. Welche API-Funktion ist das (außer "Shutdown" ;-) )
4. Wenn ich die Anwendung in der Delphi-IDE ausführe und sie mal wieder bockig ist, schafft Delphi das mit Strg-F2. Was steckt dahinter?

Sir Rufo 11. Apr 2012 06:48

AW: Anwendung 100%ig garantiert beenden (lassen)?
 
Probier mal den Prozess mit dem pskill von SysInternals zu entfernen, evtl. schafft der das.

Warum Windows das beim Abmelden schafft (oder auch der Debugger von Delphi) liegt wohl darin begründet, dass dort beim Beenden dem Prozess die Grundlage entzogen wird, also der Ast abgesägt wird, auf dem der sitzt :)

Uwe Raabe 11. Apr 2012 09:44

AW: Anwendung 100%ig garantiert beenden (lassen)?
 
Vielleicht hilft es, wenn du eine Art Wrapper-Anwendung um die eigentliche Exe legst, die diese mit CreateProcess zum Leben erweckt. Als Owner dieses Prozesses müsste man den mit TerminateProcess eigentlich immer beendet bekommen.

Assarbad 14. Apr 2012 16:13

AW: Anwendung 100%ig garantiert beenden (lassen)?
 
Zitat:

Zitat von Furtbichler (Beitrag 1161147)
Ich habe hier eine Anwendung, die beim Beenden manchmal im Speicher hängen bleibt. Das liegt an einer DLL, die offenbar schlampig programmiert ist.

Sprich: die Anwendung wird garnicht beendet. Vielleicht wird das zugehörige Fenster geschlossen, aber die Anwendung ja offenbar nicht. Denn aufgrund des Speicher- und Prozeßmodells in Windows ist es ein Ding der Unmöglichkeit, daß da etwas zurückbleibt.

Zitat:

Zitat von Furtbichler (Beitrag 1161147)
Ich habe also diverse Dinge probiert, u.a. schickt die Anwendung einer anderen EXE (=der Wächter) eine Message, die daraufhin mit Killprocess versucht, das Teil zu entfernen. Klappt nicht immer.

Unter welchen Bedingungen klappt es denn? Seit Vista können Anwendungen selber entscheiden ob sie Fensternachrichten von außen annehmen und wenn ja welche.

Zitat:

Zitat von Furtbichler (Beitrag 1161147)
1. Gibt es eine 'best practice', um mit DLLs umzugehen? z.b. nicht statisch (eh blöd), kontrollierter Shutdown (d.h. die DLL entladen) usw.

"Nicht statisch"? Du könntest die DLL teils ersetzen. Wenn sie nur wenige Funktionen exportiert und es sich um keine wohlbekannte (System-)DLL handelt, ist das trivial. Bekannt sein dürfte dir ja der Begriff "DLL placement attack" - die von mir vorgeschlagene Methode ist eine Variante davon. Man kann sie benutzen um die eigene DLL in den Zielprozeß zu befördern welche dann wiederum die echte DLL lädt und die Funktionen weiterleitet soweit das nötig ist. Für alles andere kann die eigene DLL dann die Kontrolle übernehmen und bspw. MSDN-Library durchsuchenExitProcess aufrufen, womit der Prozeß dann auch das zeitliche segnen würde.

Zitat:

Zitat von Furtbichler (Beitrag 1161147)
2. Gibt es eine 100% sichere Möglichkeit eine EXE aus dem Speicher zu entfernen?

Nein. Wenn du die Frage so stellst lautet die einzige (aber nicht sinnvolle) Antwort: bei Zimmertemperatur den Rechner mehrere Minuten vom Stromnetz trennen.

Wenn es dir um die EXE als Abbild für den Prozeß geht, dann reicht einfaches Beenden des Prozesses. Schließen des zugehörigen Fensters reicht nicht immer ...

Zitat:

Zitat von Furtbichler (Beitrag 1161147)
3. Wie schafft Windows es beim Abmelden / Runterfahren, jede EXE aus dem Speicher zu kicken. Welche API-Funktion ist das (außer "Shutdown" ;-) )

Erstens gibt es einige APIs die zum Umfeld der Terminal Server API gehören, welche brutalere Geschütze auffahren und zweitens noch die Native API. Beim Shutdown dürfte der Fall aber meines Wissens nach anders liegen. Hier dürfte wohl der Session Manager (smss.exe) das Sagen haben und ohne weiteres in der Lage sein die Prozesse abzuschießen, denn der Session Manager ist es auch der bspw. das Win32-Subsystem startet.

Zitat:

Zitat von Furtbichler (Beitrag 1161147)
4. Wenn ich die Anwendung in der Delphi-IDE ausführe und sie mal wieder bockig ist, schafft Delphi das mit Strg-F2. Was steckt dahinter?

Der Debugger?! :stupid:

Delphi-Laie 14. Apr 2012 17:22

AW: Anwendung 100%ig garantiert beenden (lassen)?
 
Viele Köche verderben eben den Brei. Die Frage, ob eine bereinigte Version der DLL zu bekommen ist, wage ich gar nicht erst zu stellen.

Kann man das Programm nicht mit Debugprivilegien wahrscheinlicher beenden? Ich habe keine Ahnung, ob die nur "von außen" möglich sind, oder ob das Programm selbst mit solchen Privilgien sich wahrscheinlicher selbst beenden kann, ist nur so eine Idee von mir.

Assarbad 14. Apr 2012 19:18

AW: Anwendung 100%ig garantiert beenden (lassen)?
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1161854)
Viele Köche verderben eben den Brei. Die Frage, ob eine bereinigte Version der DLL zu bekommen ist, wage ich gar nicht erst zu stellen.

Keine Ahnung was du mit bereinigt meinst. Ich meinte nur, daß du dem Programm eine eigene DLL unterschieben könntest, der du dann ggf. mitteilst, daß sie ExitProcess aufrufen soll. Welcher Code innerhalb einer Anwendung diese Funktion aufruft ist nämlich im Endeffekt egal.

Zitat:

Zitat von Delphi-Laie (Beitrag 1161854)
Kann man das Programm nicht mit Debugprivilegien wahrscheinlicher beenden? Ich habe keine Ahnung, ob die nur "von außen" möglich sind, oder ob das Programm selbst mit solchen Privilgien sich wahrscheinlicher selbst beenden kann, ist nur so eine Idee von mir.

Warum wahrscheinlicher? Die Privilegien sollten hier allerhöchstens für jemanden von außen eine Rolle spielen. Das Programm selber kann sich normalerweise immer beenden. Kannst ja nochmal mit dem Process Explorer nachgucken welche ACEs gesetzt sind, also welche Rechte außenstehende Entitäten an dem Prozeß haben.

Delphi-Laie 14. Apr 2012 22:00

AW: Anwendung 100%ig garantiert beenden (lassen)?
 
Zitat:

Zitat von Assarbad (Beitrag 1161878)
Zitat:

Zitat von Delphi-Laie (Beitrag 1161854)
Viele Köche verderben eben den Brei. Die Frage, ob eine bereinigte Version der DLL zu bekommen ist, wage ich gar nicht erst zu stellen.

Keine Ahnung was du mit bereinigt meinst.

das:
Zitat:

Zitat von Furtbichler (Beitrag 1161147)
Ich habe hier eine Anwendung, die beim Beenden manchmal im Speicher hängen bleibt. Das liegt an einer DLL, die offenbar schlampig programmiert ist.


jaenicke 14. Apr 2012 22:53

AW: Anwendung 100%ig garantiert beenden (lassen)?
 
Es kann sich auch lohnen die aktuellen Warteschlangen anzuschauen um herauszufinden, ob es nur ein Deadlock oder so ist. Denn in so einem Fall könnte man (wie es auch Windows 7 anbietet, wenn es das bei einem Prozess erkennt) den Deadlock auflösen und dem Prozess so die Beendigung ermöglichen.

Typisch sind solche Fehler bei Verwendung von Threads, z.B. mit den Indy Komponenten.

Die Warteschlangen kannst du am einfachsten (aber nicht vollständig) über den Process Explorer sehen und auch Delphi bringt entsprechende Möglichkeiten im Thread-Fenster mit.

Assarbad 15. Apr 2012 00:14

AW: Anwendung 100%ig garantiert beenden (lassen)?
 
Zitat:

Zitat von jaenicke (Beitrag 1161912)
Die Warteschlangen kannst du am einfachsten (aber nicht vollständig) über den Process Explorer sehen und auch Delphi bringt entsprechende Möglichkeiten im Thread-Fenster mit.

... oder WinDbg


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 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