AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Anwendung 100%ig garantiert beenden (lassen)?

Anwendung 100%ig garantiert beenden (lassen)?

Ein Thema von Furtbichler · begonnen am 11. Apr 2012 · letzter Beitrag vom 15. Apr 2012
Antwort Antwort
Furtbichler
(Gast)

n/a Beiträge
 
#1

Anwendung 100%ig garantiert beenden (lassen)?

  Alt 11. Apr 2012, 06:34
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 11. Apr 2012, 06:48
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 11. Apr 2012, 09:44
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#4

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

  Alt 14. Apr 2012, 16:13
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.

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.

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.

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 ...

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.

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?!
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

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

  Alt 14. Apr 2012, 17:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#6

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

  Alt 14. Apr 2012, 19:18
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.

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.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

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

  Alt 14. Apr 2012, 22:00
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:
Ich habe hier eine Anwendung, die beim Beenden manchmal im Speicher hängen bleibt. Das liegt an einer DLL, die offenbar schlampig programmiert ist.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

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

  Alt 14. Apr 2012, 22:53
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#9

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

  Alt 15. Apr 2012, 00:14
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
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:28 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