Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Security_Descriptor ändern (https://www.delphipraxis.net/98954-security_descriptor-aendern.html)

Apollonius 4. Sep 2007 15:20


Security_Descriptor ändern
 
Ich habe mir kürzlich mal Gedanken gemacht, wie man verhindern könnte, dass ein anderer Prozess mit WriteProcessMemory Variablen meines Programms verändert. Da bietet sich natürlich an, zu verhindern, dass ein Handle meines Prozesses mit den nötigen Rechten PROCESS_VM_WRITE und PROCESS_VM_OPERATION geöffnet wird. Da ließe sich ja etwas mit dem Security-Descriptor meines Prozesses drehen. Kann man denn den eigenen Security-Descriptor verändern, oder ist das (zum Beispiel für Debugging etc.) verboten? Wenn ja - wie geht es? Ich habe die MSDN durchforstet, da ist zu dem Thema auch viel zu finden, aber auf eine Funktion zum Setzen eines neuen Descriptors bin ich nicht gestoßen.

Olli 4. Sep 2007 21:24

Re: Security_Descriptor ändern
 
Aehnliches Problem: http://assarbad.net/de/stuff/temp/KillMeSoftly/
Ansonsten frage "Dezipaitor" zum Thema :zwinker:

Dezipaitor 4. Sep 2007 21:36

Re: Security_Descriptor ändern
 
Du kannst die Prozess DACL mit SetSecurityInfo mit ObjectType =
SE_KERNEL_OBJECT setzen.
Theoretisch, da ich es selbst nicht probiert habe.

ABER: Der Besitzer eines Security Descriptor kann immer die ACL ändern! Besitzer kann jeder werden dem es über die ACL erlaubt ist.
Zudem können bestimmte Gruppen, auch ohne diese ACL Rechte, Besitzer übernehmen. Administratoren können dies z.B. RestoreOperatoren (auch Administratoren)
ist es auch erlaubt, den Besitzer beliebig zu wählen.
Das gilt übrigens natürlich auch für DIENSTE.

Debuggerbenutzer haben da jedoch nicht viel zu sagen, was den Security Descriptor angeht.

Einen Security kann man auf verschiedene Arten bauen..
Die einfachste Art mit Win32API Mitteln ist ConvertStringSecurityDescriptorToSecurityDescripto r

Am einfachsten wird es sowieso mit meiner Bibliothek.

Apollonius 5. Sep 2007 17:34

Re: Security_Descriptor ändern
 
Zitat:

ABER: Der Besitzer eines Security Descriptor kann immer die ACL ändern! Besitzer kann jeder werden dem es über die ACL erlaubt ist.
Zudem können bestimmte Gruppen, auch ohne diese ACL Rechte, Besitzer übernehmen. Administratoren können dies z.B. RestoreOperatoren (auch Administratoren)
Soll das heißen, dass Administratoren unabhängig von Descriptor den Prozess mit Process_All_Access öffnen können? Das wäre ja nochmal ein dicker Grund, nicht als Admin zu arbeiten.
Danke schonmal für eure Hilfe.

Dezipaitor 5. Sep 2007 18:03

Re: Security_Descriptor ändern
 
Zitat:

Zitat von Apollonius
Zitat:

ABER: Der Besitzer eines Security Descriptor kann immer die ACL ändern! Besitzer kann jeder werden dem es über die ACL erlaubt ist.
Zudem können bestimmte Gruppen, auch ohne diese ACL Rechte, Besitzer übernehmen. Administratoren können dies z.B. RestoreOperatoren (auch Administratoren)
Soll das heißen, dass Administratoren unabhängig von Descriptor den Prozess mit Process_All_Access öffnen können? Das wäre ja nochmal ein dicker Grund, nicht als Admin zu arbeiten.
Danke schonmal für eure Hilfe.

Können sie nicht unbedingt. Administratoren unterliegen wie alle anderen Nutzer auch dem Rechtesystem. Sie haben bloß den Vorteil, sich das Recht (wie auch immer) verschaffen zu können.
Man sieht es gut an dem Ordner "System Volume Information". Ein Admin kann es sich per default nicht ansehen. Er kann jedoch die DACL anpassen und dann sich den Inhalt ansehen.

Das hemmt schonmal einige Programme, die normal auf etwas zugreifen wollen. Die meisten Programme geben dann auf.

Apollonius 5. Sep 2007 18:09

Re: Security_Descriptor ändern
 
Hm. Irgendwo in meinem Code ist noch ein Fehler, denn auch als Gast kriege ich ein gültiges Handle...
Programm 1:
Delphi-Quellcode:
program Project2;

uses
  Forms,
  Windows,
  AclAPI,
  AccCtrl,
  sysutils,
  dialogs,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
const PROTECTED_DACL_SECURITY_INFORMATION = $80000000; //DACLs werden nicht vererbt
var desc: SECURITY_DESCRIPTOR;
begin
  InitializeSecurityDescriptor(@desc, SECURITY_DESCRIPTOR_REVISION);
  SetSecurityDescriptorDACL(@desc, false, nil, false);
  Showmessage(SysErrorMessage(SetSecurityInfo(getCurrentProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION or PROTECTED_DACL_SECURITY_INFORMATION, nil, nil, desc.Dacl, nil)));
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Ich hoffe mal, dass ich da mit der Api nicht ganz falsch liege. Auf Buttonklick wird eine Nachricht an ein zweites Programm mit geschickt, dabei wird die Adresse einer Variablen im WParam und das Hauptfensterhandle im LParam mitgeliefert.
Delphi-Quellcode:

procedure TForm1.rec(var Message:TMessage);
var ProcId, ProcHandle: Cardinal; buffer, dummy: cardinal;
begin
getWindowThreadProcessId(Message.LParam, ProcId);
ProcHandle:=OpenProcess(PROCESS_VM_WRITE or PROCESS_VM_OPERATION, false, ProcID);
if ProcHandle=0 then
 begin
  showmessage('Prozess-Handle ist Null!');
  exit;
 end;
showmessage('Gueltiges Prozess-Handle');
try
 buffer:=5;
 WriteProcessMemory(ProcHandle, Pointer(Message.WParam), @buffer, 4, dummy);
finally
 closeHandle(ProcHandle);
end;
end;
Und ich kriege immer ein gültiges Handle. Wo steckt der Fehler?

Dezipaitor 5. Sep 2007 19:02

Re: Security_Descriptor ändern
 
Zitat:

Zitat von Apollonius
Hm. Irgendwo in meinem Code ist noch ein Fehler, denn auch als Gast kriege ich ein gültiges Handle...
Programm 1:
[/delphi]
Und ich kriege immer ein gültiges Handle. Wo steckt der Fehler?

Du setzt nil für die DACL ein. Das bedeutet, dass JEDER (damit auch Gast) vollen Zugriff auf das Objekt hat. Du musst schon einen DACL erzeugen und auch Benutzer einfügen. Wenn du die DACL leer lässt, dann darf niemand mehr auf das Objekt zugreifen. Dann kommt wieder, wie oben schon geschrieben, der Besitzer ins Spiel.

Die DACL zu ändern ist etwas aufwendig in C. Deshalb meinte ich ja, dass du ConvertStringTo... verwenden sollst.

Apollonius 5. Sep 2007 19:31

Re: Security_Descriptor ändern
 
Hm. Ich zitiere mal aus SetSecurityDescriptorDACL:
Zitat:

When the pDacl parameter does not point to a DACL and the bDaclPresent flag is FALSE, a DACL can be provided for the object through an inheritance or default mechanism.
Ich habe das so interpretiert, dass dann niemand Zugriff hat. Tja, falsch gedacht...


Ich habe mir auch vorher schonmal diese tolle "Sprache" für die Descriptors angeschaut, aber das sieht einfach nur furchtbar aus. Und ich verstehe nicht ganz, wie ich zum Beispiel die Rechte, die es nur für Prozesse gibt, geben oder nehmen kann.

Apollonius 6. Sep 2007 20:33

Re: Security_Descriptor ändern
 
So richtig geklärt haben wir das ja nicht. Was für einen String brauche ich denn beispielsweise, wenn ich den Prozess-Handle-Öffnern das Recht PROCESS_VM_READ verwehren will, er aber alles andere bekommen soll? Diese Beschreibungen der Descriptor-Sprache sind für mich absolut kryptisch...
Danke im Vorraus
Apollonius

Dezipaitor 6. Sep 2007 23:43

Re: Security_Descriptor ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal schnell ein Progrämmchen geschrieben, dass Strings in einen Security Descriptor und zurück verwandelt.

Man kann den String ins Memo schreiben und dann den Button drücken - oder es einfach leer lassen und im ACL Editor die Einstellungen vornehmen und dann ins Memo schreiben lassen.
Mit der ComboBox kann man bestimmen, welche Art Objekt umgegangen werden soll - ich habe sie nicht alle getestet, daher kann es noch zu Merkwürdigkeiten kommen.

Ich hab das Programm sehr schnell runter-gehackt und daher nicht großartig getestet. Mit Fehlern müssen wir daher Leben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr.
Seite 1 von 3  1 23      

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