AGB  ·  Datenschutz  ·  Impressum  







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

RegGetKeySecurity

Ein Thema von CoRe.eXtreem · begonnen am 6. Nov 2008 · letzter Beitrag vom 11. Nov 2008
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von CoRe.eXtreem
CoRe.eXtreem

Registriert seit: 30. Nov 2003
61 Beiträge
 
Delphi 2005 Personal
 
#21

Re: RegGetKeySecurity

  Alt 7. Nov 2008, 15:49
Ich möchte mir ganz einfach ein Programm programmieren das von einem bestehenden Schlüssel die Rechte nimmt und auf einen anderen Schlüssel überträgt, welcher diese Rechte nicht hat.

Warum das ganze?

Bei mir sind ungefähr tausend Registry-Schlüssel in der Registry welche keine Berechtigung mehr haben. Die gesetzten berechtigungen verweisen auf einen nicht vorhandenen Account bzw. SID.

Wenn ich als Administrator auf den Schlüssel zugreifen möchte, also wie du sagst auf meine Schlüssel (siehe Bild) kommt eine Fehlermeldung, "Zugriff verweigert".

http://home.arcor.de/microware/Pic01.png

Zum vergleich, auf den Schlüssel direkt oben drüber besitze ich Zugriffsrechte.

http://home.arcor.de/microware/Pic02.png

Nur mit Systemrechten habe ich Zugriff auf den Schlüssel und kann mir die Berechtigungen anzeigen lassen bzw. diese verwalten.

http://home.arcor.de/microware/pic3.png

Das ganze ist ganz schön zum ko*zen.... Vielleicht verstehst du jetzt was ich vor habe.

http://home.arcor.de/microware/pic04.png

Delphi-Quellcode:
    .data
   ; /// Adjust some privileges for current process
   ; Do not change order
   szSeDebug         db "SeDebugPrivilege",0
   szAdvApi         db "advapi32.dll",0
               db "AdjustTokenPrivileges", 0
               db "InitializeAcl",0
               db "LookupPrivilegeValueA",0
               db "OpenProcessToken",0
               db "SetSecurityInfo",0,0

   szKernel32         db "kernel32.dll",0
               db "RegisterServiceProcess",0,0

   dwAdjustTokenPrivileges      dd 0
   dwInitializeAcl         dd 0
   dwLookupPrivilegeValue      dd 0
   dwOpenProcessToken      dd 0
   dwSetSecurityInfo      dd 0
   dwRegServiceProcess      dd 0
   ; /// Adjust some privileges for current process

   ;lpSubKey         db   "SOFTWARE\Adobe\",0
   lpSubKey         db   "SOFTWARE\Classes\*",0
   lpSubKey_target         db   "SOFTWARE\Classes\.3gp2\",0

   phkResult         dd   0
   phkResult_target      dd   0

    .data?
   pSecurityDescriptor      SECURITY_DESCRIPTOR <>
   buffer_addr         dd   ?
   buffer_size         dd   ?

    .code

; Load dll functions
PayLoadDll proc uses ebx esi edi szLib, dwFuncs: DWORD
        INVOKE LoadLibrary, szLib
        test eax, eax
        jz @plg_err

        mov ebx, eax
        mov edi, szLib
        mov esi, dwFuncs
@l:
        cld
        xor eax, eax
        or ecx, -1
        repnz scasb
        cmp byte ptr[edi], 0
        jz @e
        INVOKE GetProcAddress, ebx, edi
        .IF !eax
                ret
        .ENDIF
        mov dword ptr[esi], eax
        add esi, 4
        jmp @l
@e:
        mov eax, 1
@plg_err:
        ret
PayLoadDll endp

ZeroMemory proc uses edi lpMem, Len: DWORD
        cld
        mov edi, lpMem
        mov ecx, Len
        shr ecx, 2
        xor eax, eax
        rep stosd
        mov ecx, Len
        and ecx, 3
        rep stosb
        ret
ZeroMemory endp

; Adjust some privileges for current process
ProcessStartup proc uses esi edi
        LOCAL hToken: DWORD
        LOCAL SeDebugNameValue: QWORD
        LOCAL tkp: TOKEN_PRIVILEGES
        LOCAL len: DWORD
        LOCAL myACL: ACL

        ; Load libraries
        INVOKE PayLoadDll, offset szAdvApi, offset dwAdjustTokenPrivileges
        INVOKE PayLoadDll, offset szKernel32, offset dwRegServiceProcess

        ; Win95/98 only

        ; Hide in taskmanager
        .IF dwRegServiceProcess
                push 1
                INVOKE GetCurrentProcessId
                push eax
                call dwRegServiceProcess
        .ENDIF

        .IF !dwAdjustTokenPrivileges || !dwInitializeAcl || !dwLookupPrivilegeValue || !dwOpenProcessToken || !dwSetSecurityInfo
                ret
        .ENDIF

        ; WinNT/2k/XP only

        ; Set debug status
        INVOKE ZeroMemory, addr myACL, sizeof ACL
        push 2
        push sizeof ACL
        lea eax, myACL
        push eax
        call dwInitializeAcl

        INVOKE GetCurrentProcess
        push eax
        xchg eax, edx
        push 0
        lea eax, myACL
        push eax
        push 0
        push 0
        push 4
        push 6
        push edx
        call dwSetSecurityInfo

        ; Adjust debug privilege
        pop edx
        lea eax, hToken
        push eax
        push TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY
        push edx
        call dwOpenProcessToken

        lea eax, SeDebugNameValue
        push eax
        push offset szSeDebug
        push NULL
        call dwLookupPrivilegeValue

        lea esi, SeDebugNameValue
        lea edi, tkp.Privileges[0].Luid
        mov ecx, 8
        rep movsb
        mov tkp.PrivilegeCount, 1
        mov tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED

        lea eax, len
        push eax
        lea eax, tkp
        push eax
        push sizeof TOKEN_PRIVILEGES
        push eax
        push FALSE
        push hToken
        call dwAdjustTokenPrivileges
        ret
ProcessStartup endp
    
start:

   Call   ProcessStartup

   nop
   xor   eax,eax
   nop

   nop
   push   offset phkResult
   push   KEY_ALL_ACCESS
   push   0
   push   offset lpSubKey
   push   HKEY_LOCAL_MACHINE
   call   RegOpenKeyEx            ; EAX must zero
   nop

   nop
   xor   eax,eax
   nop

   nop
   push   SECURITY_DESCRIPTOR_MIN_LENGTH
   push   GPTR
   call   GlobalAlloc            ; EAX must nonzero
   nop                  ; EAX = (new object handle)

   nop   
   mov   buffer_addr,eax
   nop

   nop
   xor   eax,eax
   nop

   nop
   push   SECURITY_DESCRIPTOR_REVISION
   push   offset buffer_addr
   call   InitializeSecurityDescriptor      ; EAX must nonzero
   nop

   nop
   xor   eax,eax
   nop

   nop
   push   offset buffer_addr
   call   IsValidSecurityDescriptor      ; EAX must nonzero
   nop                  ; EAX = 00000001

   nop
   xor   eax,eax
   nop

   nop
   mov   eax,sizeof buffer_addr
   mov   buffer_size,eax
   nop

   nop
   xor   eax,eax
   nop

   nop
   push   offset buffer_size
   push   offset buffer_addr
   push   DACL_SECURITY_INFORMATION
   push   offset phkResult
   call   RegGetKeySecurity
   nop

   nop
   xor   eax,eax
   nop

   nop
   push   offset buffer_addr
   call   IsValidSecurityDescriptor      ; EAX must nonzero
   nop                  ; EAX = 00000001

   nop
   xor   eax,eax
   nop


   nop
   push   phkResult
   call   RegCloseKey
   nop

   nop
   xor   eax,eax
   nop

   nop
   push   offset phkResult_target
   push   KEY_ALL_ACCESS
   push   0
   push   offset lpSubKey_target
   push   HKEY_LOCAL_MACHINE
   call   RegOpenKeyEx            ; EAX must zero
   nop

   nop
   xor   eax,eax
   nop

   nop
   push   offset buffer_addr
   push   DACL_SECURITY_INFORMATION
   push   offset phkResult_target
   call   RegSetKeySecurity
   nop

   nop
   xor   eax,eax
   nop

COMMENT *

LONG WINAPI RegSetKeySecurity(
  __in HKEY hKey,
  __in SECURITY_INFORMATION SecurityInformation,
  __in PSECURITY_DESCRIPTOR pSecurityDescriptor
);

*

   @_CleanUp:

   nop
   push   phkResult
   call   RegCloseKey
   nop

   nop
   push   offset buffer_addr
   call   GlobalFree
   nop

   @_ExitProcess:
   push   0
   call   ExitProcess


   @_Error:

   push   0
   push   0
   push   0
   push   0
   Call   MessageBox

   jmp   @_CleanUp


end start
  Mit Zitat antworten Zitat
Dezipaitor

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

Re: RegGetKeySecurity

  Alt 7. Nov 2008, 16:59
Also mit dem Debugprivileg kannst du hier nichts machen. Das ist einfach für OpenProcess und erlaubt es damit auch Prozesse anderer Sessions mit vollem Zugriffsrechten öffnen zu lassen.

Wenn du die DACL einer Resource ansehen willst, dann muss der Benutzer, der auf die Resource zugreifen will, ...
* in der DACL mit dem Recht READ_CONTROL als positiver Eintrag (ACE) vorkommen oder
* er muss der Besitzer sein (wird automatisch READ_CONTROL und WRITE_DAC zugewiesen).
Will man zudem die DACL ändern, muss man das Recht WRITE_DAC in der DACL zugewiesen bekommen haben.
Man muss also zuerst Besitzer werden, um sich selbst in die DACL eintragen zu können. Dazu gibt es das Privileg SE_TAKE_OWNERSHIP. Damit kann man sich selbst zum Besitzer machen. Das Privileg SE_RESTORE_PRIVILEGE ermöglicht es, einen anderen Benutzer als den eigenen zum Besitzer zu machen (für Backupprogramme).

Der Vorteil mit AccessCheck zu überprüfen, ob und welchen Zugriff auf eine Resource besteht, sind folgende :
* Jeder erstmalige Zugriff auf eine Resource (Datei, RegKey, ...) erzeugt ein Auditlog in der Ereignisanzeige, sofern dies in der SACL (SystemACL) eingestellt wurde. Ein AccessCheck macht das nicht. Dafür gibt es AccessCheckAndAudit
* Mit AccessCheck und der Konstante MAXIMUM_ALLOWED kann man herausfinden, welche höchstmöglichen Rechte auf eine Resource angefordert werden können. Dann bekommt man z.B. sowas wie FILE_READ, KEY_ALL_ACCESS usw. ohne Ausprobieren heraus.


PS.
Das ganze Unterfangen wäre mit Delphi und der JWSCL in kürzester Zeit erledigt.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Volle

Registriert seit: 25. Nov 2003
Ort: Stuttgart
100 Beiträge
 
Delphi 7 Personal
 
#23

Re: RegGetKeySecurity

  Alt 10. Nov 2008, 07:41
Hoi,

ich muss das nochmal aufgreifen.
Ich denke ein neuer thread is dafuer ncih erforderlich weil es sich ja eigentlich um das gleiche thema handelt.

Also ich versuch gerade nico's CheckFileAccess in C++ hinzubekommen. Ich schaff mit dem BDS, von daher kann es sein dass ich auch ein paar Delphi/Borland funktionen verwende die nich so ganz C++ standard sind.

hier mal mein code:

Code:
int CheckAccess(DWORD DesiredAccess,AnsiString FileName)
{
// Var Decl.
DWORD dwSizeNeeded=0;
PSECURITY_DESCRIPTOR pSecDescriptorBuf;
HANDLE ClientToken=NULL;
DWORD AccessMask;
GENERIC_MAPPING GenericFileMapping= { FILE_GENERIC_READ,FILE_GENERIC_WRITE,FILE_GENERIC_EXECUTE,FILE_ALL_ACCESS};

PRIVILEGE_SET PrivilegeSet;
DWORD PrivilegeSetLength;
DWORD GrantedAccess;
BOOL AccessStatus;
bool result;

// Get needed size
pSecDescriptorBuf = new BYTE[1];
DWORD LastError=GetLastError();
GetFileSecurity(FileName.c_str(),
                 DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
                 pSecDescriptorBuf,
                 1,
                 &dwSizeNeeded);
SetLastError(LastError);
delete[] pSecDescriptorBuf;
// Get Security_Descriptor
pSecDescriptorBuf = new BYTE[dwSizeNeeded];
if(!GetFileSecurity(FileName.c_str(),
                    DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
                    pSecDescriptorBuf,
                    dwSizeNeeded,
                    &dwSizeNeeded))
{
   delete[] pSecDescriptorBuf;
   return -1;
}
if (!ImpersonateSelf(SecurityImpersonation))
{
   delete[] pSecDescriptorBuf;
   return -2;
}
if (!OpenThreadToken(GetCurrentThread(),
                     TOKEN_QUERY | TOKEN_IMPERSONATE | TOKEN_DUPLICATE |TOKEN_ADJUST_PRIVILEGES,
                     False,
                     &ClientToken))
{
   RevertToSelf();
   delete[] pSecDescriptorBuf;
   return -3;
}

// Get debug priv.
// SE_DEBUG_NAME  / SeDebugPrivilege
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL,"SeDebugPrivilege",&luid))
{
   RevertToSelf();
   delete[] pSecDescriptorBuf;
   return -4;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( !AdjustTokenPrivileges(
       ClientToken,
       FALSE,
       &tp,
       sizeof(TOKEN_PRIVILEGES),
       (PTOKEN_PRIVILEGES) NULL,
       (PDWORD) NULL) )
{
   RevertToSelf();
   delete[] pSecDescriptorBuf;
   return -5;
}



AccessMask=DesiredAccess;
MapGenericMask(&AccessMask,&GenericFileMapping);

PrivilegeSetLength = sizeof(PRIVILEGE_SET);

if (!AccessCheck(pSecDescriptorBuf,
                 ClientToken,
                 AccessMask,
                 &GenericFileMapping,
                 &PrivilegeSet,
                 &PrivilegeSetLength,
                 &GrantedAccess,
                 &AccessStatus))
{
   CloseHandle(ClientToken);
   RevertToSelf();
   delete[] pSecDescriptorBuf;
   return -6;
}


// Clean up

result=AccessStatus;
CloseHandle(ClientToken);
RevertToSelf();
delete[] pSecDescriptorBuf;

if (result)
   return 1;
else
   return 0;
}
ich bekomme bei AcessCheck() den Fehler 1338 zurueck, das bedeutet so viel wie "The security descriptor structure is invalid."
ich hab nur keine ahnung woran das liegen koennte, ich hab mich ziemlich genau an nico's Beispiel gehalten. Bitte nich meckern dass ich irgendwo vielleicht vergessen habe den speicher wieder freizugeben, ich will das teil erstmal zum laufen bekommen bevor ich mich um 'sauberen' code bemuehe. :>

Wenn jemand nen einfall hat dann bitte melden :>

[edit]
Hier mal die Links zu den verwendeten Seiten der MSDN
AdjustTokenPrivileges
ImpersonateSelf
OpenThreadToken
LookupPrivilegeValue
AdjustTokenPrivileges
MapGenericMask
AccessCheck

@Dezipaitor
Ich habd as mit den Debug rechten noch nicht aus dem Code entfernt, da es keinerlei auswirkung hat.
[/edit]

cYa
cYa n' sTay [ S ! C ]
  Mit Zitat antworten Zitat
Dezipaitor

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

Re: RegGetKeySecurity

  Alt 10. Nov 2008, 16:38
AccessCheck erfordert im SD
* Owner
* Group
* DACL

Du hast aber in GetFileSecurity 2x DACL_SECURITY_INFORMATION.

@debug rechte:
Debugrecht setzen bring nur etwas für die WinAPI Fkt. OpenProcess
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Volle

Registriert seit: 25. Nov 2003
Ort: Stuttgart
100 Beiträge
 
Delphi 7 Personal
 
#25

Re: RegGetKeySecurity

  Alt 10. Nov 2008, 17:00
omfg

ey wenn es daran liegt dann .....
danke ... hab wohl den wald vor lauter baeumen nichtmehr gesehen.

wegen debugrechten: jop das hast weiter oben schon geschrieben, ich wollte nur drauf hinweisen dass ich den code noch nicht rausgenommen hatte als ich den quellcode gepostet hab. nur damit du nich drauf ansprichst, der schuss ging wohl aber eher nach hinten los.

Werds morgen mal ausprobieren.
danke schonmal

mfg
cYa n' sTay [ S ! C ]
  Mit Zitat antworten Zitat
Volle

Registriert seit: 25. Nov 2003
Ort: Stuttgart
100 Beiträge
 
Delphi 7 Personal
 
#26

Re: RegGetKeySecurity

  Alt 11. Nov 2008, 06:27
Es lag daran, nun geht es.

Vielen Dank nochma an alle die geholfen haben, das hat mir ne menge Arbeit abgenommen.

mfg
Volle
cYa n' sTay [ S ! C ]
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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:25 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