![]() |
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.
|
Re: Security_Descriptor ändern
Aehnliches Problem:
![]() Ansonsten frage "Dezipaitor" zum Thema :zwinker: |
Re: Security_Descriptor ändern
Du kannst die Prozess DACL mit
![]() 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 ![]() Am einfachsten wird es sowieso mit meiner ![]() |
Re: Security_Descriptor ändern
Zitat:
Danke schonmal für eure Hilfe. |
Re: Security_Descriptor ändern
Zitat:
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. |
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:
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.
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.
Delphi-Quellcode:
Und ich kriege immer ein gültiges Handle. Wo steckt der Fehler?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; |
Re: Security_Descriptor ändern
Zitat:
Die DACL zu ändern ist etwas aufwendig in C. Deshalb meinte ich ja, dass du ConvertStringTo... verwenden sollst. |
Re: Security_Descriptor ändern
Hm. Ich zitiere mal aus SetSecurityDescriptorDACL:
Zitat:
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. |
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 |
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 22:10 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