AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TerminateProcess geht nicht die Zweite
Thema durchsuchen
Ansicht
Themen-Optionen

TerminateProcess geht nicht die Zweite

Ein Thema von QuickAndDirty · begonnen am 7. Jun 2011 · letzter Beitrag vom 25. Jun 2011
Antwort Antwort
Seite 2 von 2     12   
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: TerminateProcess geht nicht die Zweite

  Alt 10. Jun 2011, 09:39
If not(b<>False) Then ist ja echt abenteuerlich
Markus Kinzler
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#12

AW: TerminateProcess geht nicht die Zweite

  Alt 10. Jun 2011, 11:07
Als "LocalSystem" (nicht "LokalesSystem") kannst Du Dich nicht einfach so anmelden; Systemdienste etwa arbeiten unter diesem Account, manchmal auch LocalService, NetworkService sowie einige andere. Wenn Du im Windows Task Manager Dir die Prozesse aller User anzeigen lässt, wirst Du die (unter leicht anderem Namen) sehen. Das halt also nichts mit der Domäne zu tun.

Privileges betreffen Rechte, die sich ein Programm teilweise erst noch anfordern muss. Siehe auch MSDN: How to Use the SeDebugPrivilege - da wird sogar die OpenProcess/TerminateProcess-Thematik erwähnt.

Und nein, Privileges und auch Gruppenrichtlinien wurden nicht erfunden, um Programmierer zu ärgern, sondern in diesem Kontext auch, um Sicherheit zu schaffen - was zugegeben Programmierer manchmal zwingt, sich Gedanken über Sicherheit zu machen, was ich allerdings nicht als Ärgern einstufen würde

Ich glaube aber ehrlich gesagt, der Kindergarten ist die größere Baustelle Eigentlich würde ich ja empfehlen, euch ein bisschen in Tokens und Privileges einzulesen, aber ich glaube da täte erstmal ein Kommunikations und ggfls. Führungsseminar not, wenn jemand in einer kundenkritischen Situation einfach so Fehler in seinem Programm ignorieren darf
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#13

AW: TerminateProcess geht nicht die Zweite

  Alt 24. Jun 2011, 12:41
Gelöst ---
Ursache Eine Quelloffene Treiber-DLL im System-Verzeichis wurde genutzt um per IP einen Hardware in der Virtuellen Maschine des Kunden verfügbar zu machen.

Wann immer der IP Server mit dem die DLL sich verband, aus welchen gründen auch immer, nicht rechtzeitig antwortete, meldete sie es mit "::MessageBox" aufrufen....

Leider kann man wohl ein Programm nicht abschießen wenn es in einer System DLL hängt und im dienst ist die MessageBox ja nicht sichtbar.


1.
Mal ne frage aus Neugierde: Dürfen System DLLs überhaupt Messageboxen aufmachen? Weil das ist ja mit hinblick auf einen gebrauch in einem Dienst ziemlich suboptimal.

2.
Kann ich von außen herausfinden ob ein Dienst gerade in einer Messagebox hängt und diese "drücken".


Wir haben es jetzt so geregelt das wir besagter mini dienst die Hardware selbst direkt benutzt....
und jetzt seit einigen Tagen keine Probleme mehr ^^
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#14

AW: TerminateProcess geht nicht die Zweite

  Alt 24. Jun 2011, 15:43
1. Hängt sicherlich etwas damit zusammen, was Du unter Treiber-DLL bzw. System-DLL meinst. Ist es ein richtiger Treiber, sicherlich nicht. Meinst Du aber nur die Funktionalität - kann ja sein, daß die auch in einer normalen Anwendung eingebunden werden kann/soll. Dann ist es nur noch schlechter Stil Zudem lassen sich System Services per Flag auf "interaktiv" setzen. In älteren Windows-Versionen (Windows 2000?) war dieses Flag evtl. nicht notwendig, später kam es aus Absicherungsgründen hinzu (Prozesse mit Systemrechten sollten nicht direkt über das UI mit dem Benutzer kommunizieren).

2. "Einfacher" wäre es vermutlich, die MessageBox-Funktion innerhalb des Prozesses zu hooken und so einfach zu ignorieren (oder, um's ganz fein zu machen, ins Eventlog umzuleiten). Dazu gibt's hier in der DP glaub ich auch Beispiele
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#15

AW: TerminateProcess geht nicht die Zweite

  Alt 24. Jun 2011, 23:26
Ok, auch wenn es Offtopic in bezug auf den Threadtitel ist...es ist ja noch der selbe Fall...

1. Hängt sicherlich etwas damit zusammen, was Du unter Treiber-DLL bzw. System-DLL meinst.
Ist es ein richtiger Treiber, sicherlich nicht.
Ich meine ein Datei in C:\Windows\System32 es ist kein Treiber nur eine DLL die systemweit und von jeder X beliebigen Anwendung - oder auch Dienst - benutzt werden können sollte. Ist eben eine Capi2032.dll von Shamrock und dazu gibt es irgendwie zwischen 16Kb und 32Kb Opensource C++ Code... ich verwende die ja auch...aber ich muss mich nicht auf das dauerhafte Funktionieren dieser Geschichte verlassen...

CAPI ist für schon so die Schnittstelle zur ISDN-Karte...sollte eigentlich(wenn es verkauft werden würde und nicht umsonnst Opensourcezeug ist) mit der selben Sorgfallt und Misstrauen gegenüber den Randbedingungen programmiert sein wie ein Treiber.

Meinst Du aber nur die Funktionalität - kann ja sein, daß die auch in einer normalen Anwendung eingebunden werden kann/soll. Dann ist es nur noch schlechter Stil Zudem lassen sich System Services per Flag auf "interaktiv" setzen. In älteren Windows-Versionen (Windows 2000?) war dieses Flag evtl. nicht notwendig, später kam es aus Absicherungsgründen hinzu (Prozesse mit Systemrechten sollten nicht direkt über das UI mit dem Benutzer kommunizieren).
Das wäre leider keine lösung...aber da es Opensource ist...vielleicht werde ich mal in nem C++ board betteln das jemand mir den code ohne "::MessageBox" kompiliert...habe hier keine IDE dafür und betteln ist schneller als mich mit ner gnu C++ und Eclipse oder MS C++ und VS ... rumzuschlagen.
Es ist jetzt nicht WIRKLICH entscheidend, aber es wäre sicher von Vorteil für so manchen wenn es das Projekt so gäbe das es auch in Diensten funktioniert....
(Ich bereite morgen mal nen freundlich Text vor und Kommentiere die MessageBoxen aus)

2. "Einfacher" wäre es vermutlich, die MessageBox-Funktion innerhalb des Prozesses zu hooken und so einfach zu ignorieren (oder, um's ganz fein zu machen, ins Eventlog umzuleiten). Dazu gibt's hier in der DP glaub ich auch Beispiele
Vermutlich nicht "Einfacher", aber da ich ja im Prinzip immer damit rechnen muss das irgendwelche von meinen Diensten genutzten Treiber oder Bibliotheken oder sonnst etwas eine MessageBox werfen kann, würde es wohl der Stabilität des Produktes entgegenkommen, wenn ich den von dir vorgeschlagenen Weg einschlage.

Muss also was über Hooks lernen *nicht will*
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#16

AW: TerminateProcess geht nicht die Zweite

  Alt 25. Jun 2011, 14:17
Da es nur Hooks innerhalb Deiner Anweisung und nicht systemweit sein müssen, hält sich der Streß in Grenzen, denke ich

Schaue Dir mal die executehook.zip hier an. Davon brauchst Du quasi nur die HookUnit.pas, bzw. sogar nur einzelne Funktionen daraus (nämlich FinalFunctionAddress und PatchAddress).

Grob gesagt, machst Du ein:
Code:
type
   TMessageBoxA = function(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
   TMessageBoxW = function(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall;

var
   OldMessageBox: TOldMessageBoxA; // unter DXE: *W
   OldMessageBoxA: TOldMessageBoxA;
   OldMessageBoxW: TOldMessageBoxW;

...

procedure NewMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
   // log message to some kind of log instead.
   // to display message box, call OldMessageBoxA here.
end;
procedure NewMessageBoxW(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall;
begin
   // log message to some kind of log instead.
   // to display message box, call OldMessageBoxA here.
end;

...

initialization
   @OldMessageBox := FinalFunctionAddress(MessageBox);
   @OldMessageBoxA := FinalFunctionAddress(MessageBoxA);
   @OldMessageBoxW := FinalFunctionAddress(MessageBoxW);
   PatchAddress(@OldMessageBox, @NewMessageBox);
   PatchAddress(@OldMessageBoxA, @NewMessageBoxA);
   PatchAddress(@OldMessageBoxW, @NewMessageBoxW);
finalization
   PatchAddress(@NewMessageBox, @OldMessageBox);
   PatchAddress(@NewMessageBoxA, @OldMessageBoxA);
   PatchAddress(@NewMessageBoxW, @OldMessageBoxW);
end;
Das ist jetzt kein getesteter Code, sondern nur per copy'n'paste an Deine Situation angepasst, damit Du das Schema versteht. Ich arbeite inzwischen mit madCodeHook, kann mich daher nur noch grob erinnern, wie diese Methode ging.

Geändert von CCRDude (25. Jun 2011 um 14:23 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#17

AW: TerminateProcess geht nicht die Zweite

  Alt 25. Jun 2011, 22:17
cool danke .....Dude!
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:45 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