Delphi-PRAXiS
Seite 2 von 3     12 3      

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 7. Sep 2007 16:34

Re: Security_Descriptor ändern
 
Dein Programm funktioniert bei mir nicht, das einzige, was erscheint, ist ein Eintrag in der Taskleiste.

Ich habe mittlerweile mal versucht, mich selbst mit dem Thema auseinanderzusetzen, allerdings schmeißt mir der Aufruf der Convert-Funktion immer einen ERROR_INVALID_SID. :(
Delphi-Quellcode:
program Project2;

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

{$R *.res}
type PPSECURITY_DESCRIPTOR=^PSECURITY_DESCRIPTOR;
     SecDescToStrFunc=function(StringSecurityDescriptor: PChar; StringSDRevision: DWORD; var SecurityDescriptor: PSECURITY_DESCRIPTOR; var SecurityDescriptorSize: ULONG): boolean; stdcall;

const PROTECTED_DACL_SECURITY_INFORMATION = $80000000;
      SDDL_REVISION_1=1; //Konstanten muss man sich wohl selbst deklarieren
      DLLName='Advapi32.dll';
var desc: PSECURITY_DESCRIPTOR; SecDescStr: ansistring; Size: ULong;
    func: SecDescToStrFunc; lib: hModule;
begin
  lib:=loadLibrary(DLLName);
  showmessage(inttostr(lib));
  func:=getProcAddress(lib, 'ConvertStringSecurityDescriptorToSecurityDescriptorA');
  showmessage(inttostr(integer(@func)));
  SecDescStr:='D:P(A;;0x'+inttohex(Process_All_Access xor Process_VM_Read, 8)+';;;WD)';//Ich hoffe mal, das ist nicht zu falsch...
  func(PChar(SecDescStr), SDDL_REVISION_1, Desc, size);
  showmessage(SysErrorMessage(getLastError)); //Fehler
  showmessage(inttostr(size)); //null
  Showmessage(SysErrorMessage(SetSecurityInfo(getCurrentProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION or PROTECTED_DACL_SECURITY_INFORMATION, nil, nil, SECURITY_DESCRIPTOR(desc^).Dacl, nil)));//Folgefehler Zugriffsverletzung
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  LocalFree(Cardinal(desc));
  FreeLibrary(lib);
end.
Irgendjemand Vorschläge? Bestürzenderweise bekomme ich selbst dann einen "invalid sid", wenn ich die Strings aus den Microsoft-Beispielen nehme...

Apollonius

Dezipaitor 7. Sep 2007 16:52

Re: Security_Descriptor ändern
 
Das Programm funktioniert. Nur hast du keinen zweite Bildschirm :D
Das Fenster ist deshalb außerhalb des sichtbaren Bereichs und man muss es über die Taskleiste verschieben.

Delphi setzt standardmäßig die Designkoordinaten für die Fensterposition.

Ich habe erneut hinaufgeladen.

Apollonius 7. Sep 2007 18:07

Re: Security_Descriptor ändern
 
:firejump: :party: ES FUNKTIONIERT!!! :dancer: :dp:
Wenn man auf die DACL-Falgs verzichtet, glückt der Aufruf der Convert-Funktion. Danach ist es nur noch eine Frage der Zeit, bis man darauf kommt, dass man mit MakeAbsoluteSD den Security-Descriptor wandeln muss, damit SetSecurityInfo die DACL akzeptiert und man darüber hinwegkommen ist, dass MakeAbsoluteSD streikt, wenn man für Parameter, die man nicht braucht, einfach nil eizusetzen versucht. Zuguterletzt ist es mir aber gelungen, meine Prozesshandles nur mit ganz spezifischen Rechten öffnen zu lassen. Ich werde das ganze jetzt in eine Funktion packen und in der Codelibrary posten.

:dp: und ein RIESEN-DANKE an Dezipaitor!

Dezipaitor 7. Sep 2007 18:42

Re: Security_Descriptor ändern
 
GetLastError ruft man nur dann auf, wenn eine API Funktion einen Fehler über den Rückgabewert meldet.
Es ist nämlich nicht definiert, dass LastError auf 0 gesetzt wird im Erfolgsfall.
Daher kann es auch im Erfolgsfall einen Wert ungleich 0 von GetLastError zurückgegeben werden.

Self-Relative SDs ist ein SD, der aus einem Stück Speicher besteht, der alles notwendige enthält. Diese Art wird
von API Funktionen zurückgegeben. Manche API Funktionen melden einen Fehler, wenn man so einen angibt.

Absolute SD ist ein SD, der zwar auch ein Speicherblock ist, aber nur Zeiger auf den Inhalt enthält. So zeigen
Owner, Group, DACL und SACL alle auf anderen Speicher. Diese Art von SD wird nur durch den Benutzer erstellt
und an API Funktionen übergeben.



Wie sieht denn nun dein String aus?
Meinst du mit DACL-Flags diese?: DACL_SECURITY_INFORMATION or PROTECTED_DACL_SECURITY_INFORMATION

PROTECTED_DACL_SECURITY_INFORMATION verwendet man, wenn übergeordnete Objekte ihre SD nicht ins aktuelle Objekt einbringen/vererben sollen. Soweit ich weiß unterstützt MS automatische Vererung nur bei Datei und Registry.
Wenn GetSecurityInfo bei einem Objekt UNPROTECTED_DACL_SECURITY_INFORMATION findet und es unterstützt Vererbund, dann sucht es beim Vorgänger rekursiv nach der DACL, bis es eine findet, die nicht vererbt ist. Dann wird die vererbte DACL zurückgegeben.

Man kann dieses System auf eigene Objekte übernehmen.

Apollonius 7. Sep 2007 19:01

Re: Security_Descriptor ändern
 
Ja, das mit getLastError ist mir bekannt, das war ja auch nur Quick&Dirty.
Mit DACL-Flags meine ich den einen Bestandteil des Strings, der nach 'D:', aber vor dem ersten ACE-String steht:
Delphi-Quellcode:
'D:P'{Dieses P!}+'(A;;0x'+inttohex(Process_All_Access xor Process_VM_Read, 8)+';;;WD)';
Meine derzeitige Version für die Codelibrary (etwas verschönert :-D ), sieht so aus:
Delphi-Quellcode:
uses Sysutils,
     AclApi, //Für SetSecurityInfo
     AccCtrl; //Für SE_KERNEL_OBJECT als Wert einer Aufzählung
function ConvertStringSecurityDescriptorToSecurityDescriptorA(StringSecurityDescriptor: PChar; StringSDRevision: DWORD; var SecurityDescriptor: PSECURITY_DESCRIPTOR; SecurityDescriptorSize: PULONG): boolean; stdcall; external 'Advapi32.dll';
//Der letzte Parameter wird nicht als var deklariert, damit nil eingesetzt werden kann

procedure SetProcessHandleRights(Rights: Cardinal);
const PROTECTED_DACL_SECURITY_INFORMATION = $80000000;
      SDDL_REVISION_1=1;
var Desc: PSECURITY_DESCRIPTOR; SDDLString: ansistring;
    DACL: pACL; err: cardinal;
    d1, d2: LongBool; //Dummies
begin
SDDLString:='D:(A;;0x'+inttohex(Rights, 8)+';;;WD)'; //Näheres im PSDK unter SDDL
if not ConvertStringSecurityDescriptorToSecurityDescriptorA(PChar(SDDLString), SDDL_REVISION_1, Desc, nil) then
 raise EOSError.CreateFmt('Error in function ConverStringSecurityDescriptorToSecurityDescriptorA: %s', [syserrormessage(getLastError)]);
if not getSecurityDescriptorDACL(desc, d1, DACL, d2) then
 raise EOSError.CreateFmt('Error in function getSecurityDescriptorDACL: %s', [syserrormessage(getLastError)]);
err:=SetSecurityInfo(getCurrentProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION or PROTECTED_DACL_SECURITY_INFORMATION, nil, nil, DACL, nil);
if err<>0 then
 raise EOSError.CreateFmt('Error in function setSecurityInfo: %s', [syserrormessage(err)]);
end;
Es funktioniert auf jeden Fall schonmal. Falls du keine Einwände hast, werde ich das dann mal für die Library posten.
Du kriegst natürlich eine Erwähnung, schließlich hast du einen großen Teil dazu beigetragen.
Apollonius

[edit] Dank Dezipaitor noch einen Lapsus behoben. [/edit]

Dezipaitor 7. Sep 2007 19:27

Re: Security_Descriptor ändern
 
Warum konvertierst du den SD überhaupt? Die Arbeit kannst du dir sparen, da du den neuen SD sowieso nicht verwendest.
Benutze stattdessen GetSecurityDescriptorDacl. Dann haste die DACL sofort.

Apollonius 7. Sep 2007 21:45

Re: Security_Descriptor ändern
 
Zitat:

Warum konvertierst du den SD überhaupt?
Irgendwie geht mir das mit der WinAPI oft so: ich finde eine Lösung, aber längst nicht die beste.
Irgendeine Idee wegen den DACL-Flags? Ist für die spezielle Aufgabe nicht von Belang, aber interessieren würde es mich trotzdem.

Dezipaitor 7. Sep 2007 22:18

Re: Security_Descriptor ändern
 
Zitat:

Zitat von Apollonius
Zitat:

Warum konvertierst du den SD überhaupt?
Irgendwie geht mir das mit der WinAPI oft so: ich finde eine Lösung, aber längst nicht die beste.
Irgendeine Idee wegen den DACL-Flags? Ist für die spezielle Aufgabe nicht von Belang, aber interessieren würde es mich trotzdem.

Sorry, ich verstehe nicht genau was du wissen willst, wegen den DACL-Flags.
Meinst du die SD ControlFlags oder
die SecurityInformationFlags.
Das erste gibt Information über den SD. Das zweite gibt einer API Funktion den Befehl, welche Art von Information
(DACL, Group, usw + Protected, Unprotected) im SD des Objekts geändert werden soll.

Die Grundlagen über Window Security Programming kannst du hier nachlesen. Davon hab ichs auch gelernt, wenn auch von der Buchversion.

Warnung:
Das Thema kann sehr aufregend, aber auch frustrierend sein. Bei der Implementierung der Security API hab ich das immer wieder durch gemacht. Aus Fehlern lernt man aber unglaublich viel :D

Apollonius 8. Sep 2007 12:02

Re: Security_Descriptor ändern
 
Ich meine mit DACL-Flags einen Bestandteil des Strings, der in die Control-Flags übersetzt wird. Wenn ich jedoch an der vorgesehenen Stelle den erlaubten string 'P' einsetze, ist das Format ungültig, wie getLastError sagt.
Zitat:

Aus Fehlern lernt man aber unglaublich viel :-D
Wie könnte ich das bestreiten?

Dezipaitor 8. Sep 2007 12:12

Re: Security_Descriptor ändern
 
also ich hab man dein Beitrag zur Codelib übersetzt
und konnte den String "D:P(..." damit ohne Probs ausführen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr.
Seite 2 von 3     12 3      

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