AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Security_Descriptor ändern

Ein Thema von Apollonius · begonnen am 4. Sep 2007 · letzter Beitrag vom 8. Sep 2007
Antwort Antwort
Seite 2 von 3     12 3      
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Security_Descriptor ändern

  Alt 7. Sep 2007, 17:34
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
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#12

Re: Security_Descriptor ändern

  Alt 7. Sep 2007, 17:52
Das Programm funktioniert. Nur hast du keinen zweite Bildschirm
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Security_Descriptor ändern

  Alt 7. Sep 2007, 19:07
ES FUNKTIONIERT!!!
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.

und ein RIESEN-DANKE an Dezipaitor!
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#14

Re: Security_Descriptor ändern

  Alt 7. Sep 2007, 19:42
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Security_Descriptor ändern

  Alt 7. Sep 2007, 20:01
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:
'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 ), 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]
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#16

Re: Security_Descriptor ändern

  Alt 7. Sep 2007, 20:27
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Security_Descriptor ändern

  Alt 7. Sep 2007, 22:45
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#18

Re: Security_Descriptor ändern

  Alt 7. Sep 2007, 23:18
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
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Security_Descriptor ändern

  Alt 8. Sep 2007, 13:02
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
Wie könnte ich das bestreiten?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#20

Re: Security_Descriptor ändern

  Alt 8. Sep 2007, 13:12
also ich hab man dein Beitrag zur Codelib übersetzt
und konnte den String "D:P(..." damit ohne Probs ausführen.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 19:33 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