Obtenir le privilège Debug


Propriétés du code


Date de création : 02/11/2006 à 23:34:00
4 Commentaire(s)
  violent_ken

 

Présentation


Cette procédure permet à votre application d'obtenir le privilège Debug, ce qui lui permettra d'obtenir le handle (avec l'API OpenProcess) de n'importe quel processus (même système).
Droits admin requis.


Il n'est nécessaire d'appeler qu'une seule fois la procédure au début du programme :

Private Sub Form_Load()
GetDebugPrivilege 'obtient le privilège Debug
End Sub

 

Code


'//Déclaratios des Types
Private Type LUID
    LowPart As Long
    HighPart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
    pLuid As LUID
    Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    TheLuid As LUID
    Attributes As Long
End Type

'//Déclaration des constantes
Private Const TOKEN_ASSIGN_PRIMARY = &H1
Private Const TOKEN_DUPLICATE = &H2
Private Const TOKEN_IMPERSONATE = &H4
Private Const TOKEN_QUERY = &H8
Private Const TOKEN_QUERY_SOURCE = &H10
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_ADJUST_GROUPS = &H40
Private Const TOKEN_ADJUST_DEFAULT = &H80
Private Const TOKEN_ALL_ACCESS = TOKEN_ASSIGN_PRIMARY + _
    TOKEN_DUPLICATE + TOKEN_IMPERSONATE + TOKEN_QUERY + _
    TOKEN_QUERY_SOURCE + TOKEN_ADJUST_PRIVILEGES + _
    TOKEN_ADJUST_GROUPS + TOKEN_ADJUST_DEFAULT
Private Const SE_DEBUG_NAME As String = "SeDebugPrivilege"
Private Const SE_PRIVILEGE_ENABLED = &H2

'//Déclaration des APIs
'obtient et change les privilèges
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
'obtient le process courant
Public Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
'fermer un handle
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long


'-------------------------------------------------------
'donne le privilege Debug à l'application (permet d'accéder à tout les processus avec OpenProcess)
'-------------------------------------------------------
Public Sub GetAllPrivileges()
Dim lhTokenHandle As Long
Dim tLuid As LUID
Dim tTokenPriv As TOKEN_PRIVILEGES
Dim tTokenPrivNew As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long
Dim hProc As Long
    
    'obtient le handle de ce process
    hProc = GetCurrentProcess
    
    'change les droits de cette application
    OpenProcessToken hProc, TOKEN_ALL_ACCESS, lhTokenHandle
    LookupPrivilegeValue "", SE_DEBUG_NAME, tLuid
    
    'détermine le nombre de privileges à changer
    tTokenPriv.PrivilegeCount = 1
    tTokenPriv.TheLuid = tLuid
    tTokenPriv.Attributes = SE_PRIVILEGE_ENABLED
    
    'autorise le privilege SE_DEBUG_NAME
    AdjustTokenPrivileges lhTokenHandle, False, tTokenPriv, Len(tTokenPrivNew), tTokenPrivNew, lBufferNeeded
    
    'ferme les handles
    CloseHandle lhTokenHandle
End Sub


 

Historique


Voici l'historique des modifications de ce code :
02/11/2006 : Plus de bug daffichage sur la ligne Private Const TOKEN_ALL_ACCESS = ...
19/11/2006 : Avait oublié un CloseHandle :(
19/11/2006 : .
23/11/2006 : correction du bug daffichage pour les tabulations

 
 

Modifier le code

Seul les admins et l'auteur du code lui même peuvent modifier ce code.

 

Commentaires


De sebdraluorg le 06/02/2007 à 19:30


Salut a tous,

P'tite proposition d'amelioration, une seule fonction pour activer ou desactiver un privilege sur un processus depuis son Pid.

Private Const TOKEN_QUERY As Long = &H8&
Private Const TOKEN_ADJUST_PRIVILEGES As Long = &H20&

Public Const SE_PRIVILEGE_ENABLED As Long = &H2
Public Const SE_PRIVILEGE_DISBALED As Long = &H0
Public Const SE_PRIVILEGE_ENABLED_BY_DEFAULT As Long = &H1
Public Const SE_PRIVILEGE_USED_FOR_ACCESS As Long = &H80000000

Public Const SE_AUDIT_NAME As String = "SeAuditPrivilege"
Public Const SE_BACKUP_NAME As String = "SeBackupPrivilege"
Public Const SE_CHANGE_NOTIFY_NAME As String = "SeChangeNotifyPrivilege"
Public Const SE_CREATE_PAGEFILE_NAME As String = "SeCreatePagefilePrivilege"
Public Const SE_CREATE_PERMANENT_NAME As String = "SeCreatePermanentPrivilege"
Public Const SE_CREATE_TOKEN_NAME As String = "SeCreateTokenPrivilege"
Public Const SE_DEBUG_NAME As String = "SeDebugPrivilege"
Public Const SE_REMOTE_SHUTDOWN_NAME As String = "SeRemoteShutdownPrivilege"
Public Const SE_PROF_SINGLE_PROCESS_NAME As String = "SeProfileSingleProcessPrivilege"
Public Const SE_RESTORE_NAME As String = "SeRestorePrivilege"
Public Const SE_SECURITY_NAME As String = "SeSecurityPrivilege"
Public Const SE_SHUTDOWN_NAME As String = "SeShutdownPrivilege"
Public Const SE_SYSTEM_ENVIRONMENT_NAME As String = "SeSystemEnvironmentPrivilege"
Public Const SE_SYSTEM_PROFILE_NAME As String = "SeSystemProfilePrivilege"
Public Const SE_SYSTEMTIME_NAME As String = "SeSystemtimePrivilege"
Public Const SE_TAKE_OWNERSHIP_NAME As String = "SeTakeOwnershipPrivilege"
Public Const SE_TCB_NAME As String = "SeTcbPrivilege"
Public Const SE_MANAGE_VOLUME_NAME As String = "SeManageVolumePrivilege"
Public Const SE_INC_BASE_PRIORITY_NAME As String = "SeIncreaseBasePriorityPrivilege"
Public Const SE_INCREASE_QUOTA_NAME As String = "SeIncreaseQuotaPrivilege"
Public Const SE_LOCK_MEMORY_NAME As String = "SeLockMemoryPrivilege"
Public Const SE_LOAD_DRIVER_NAME As String = "SeLoadDriverPrivilege"
Public Const SE_MACHINE_ACCOUNT_NAME As String = "SeMachineAccountPrivilege"

Private Type LUID
lowpart As Long
highpart As Long
End Type

Private Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type

Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges As LUID_AND_ATTRIBUTES
End Type

Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPriv As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long 'Used to adjust your program's security privileges, can't restore without it!
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As Any, ByVal lpName As String, lpLuid As LUID) As Long 'Returns a valid LUID which is important when making security changes in NT.
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Long, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Public Function SetPrivilege(ByVal ProcessId As Long, ByVal seName As String, ByVal Status As Boolean) As Boolean

Dim hProcess As Long
Dim hProcessToken As Long
Dim Ret As Long
Dim p_lngToken As Long
Dim p_lngBufferLen As Long
Dim p_typLUID As LUID
Dim p_typTokenPriv As TOKEN_PRIVILEGES
Dim p_typPrevTokenPriv As TOKEN_PRIVILEGES

hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId)
If hProcess Then
hProcessToken = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, p_lngToken)
If hProcessToken Then
Ret = LookupPrivilegeValue(0&, seName, p_typLUID)
If Ret Then
p_typTokenPriv.PrivilegeCount = 1
p_typTokenPriv.Privileges.Attributes = GetStatusLong(Status)
p_typTokenPriv.Privileges.pLuid = p_typLUID
SetPrivilege = (AdjustTokenPrivileges(p_lngToken, False, p_typTokenPriv, Len(p_typPrevTokenPriv), p_typPrevTokenPriv, p_lngBufferLen) = 1)
End If
End If
End If

End Function


Exemple d'utilisation:

SetPrivilege(GetCurrentProcessId, SE_DEBUG_NAME, True)

++

 

De violent_ken le 07/02/2007 à 19:54


Effectivement, çà généralise le code et donc c'est meilleur. Je vais mettre la MAJ ;)

 

De violent_ken le 08/02/2007 à 13:30


Hum, il me semble qu'il manque la fonction GetStatusLong, qui n'est a priori pas une API.
@+

 

De sebdraluorg le 08/02/2007 à 19:29


Oup's sorry petit oubli...

la voici:

Private Function GetStatusLong(ByVal Status As Boolean) As Long
If Status = True Then GetStatusLong = SE_PRIVILEGE_ENABLED Else GetStatusLong = SE_PRIVILEGE_DISBALED
End Function

 

Ajouter un commentaire


Vous devez être connecté pour pouvoir poster un commentaire.

 
 

Valid HTML 4.01 Transitional Valid CSS

Site web de Vb System Library version 1.3
Developpement et design réalisé par : Matthieu Napoli (MadMatt)
© 2007 Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
Temps d'execution de la page : 0.052 s
www.mnapoli.fr