OpenProcessToken令牌函數使用方法


>GetCurrentProcessID 得到當前進程的ID OpenProcessToken得到進程的令牌句柄LookupPrivilegeValue 查詢進程的權限AdjustTokenPrivileges 調整令牌權限 要對一個隨意進程(包括系統安全進程和服務進程)進行指定了寫相關的訪問權的OpenProcess操作。僅僅要當前進程具有SeDeDebug權限就能夠了。要是一個用戶是Administrator或是被給予了相應的權限,就能夠具有該權限。但是,就算我們用Administrator帳號對一個系統安全進程執行OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID)還是會遇到“訪問拒絕”的錯誤。什么原因呢?原來在默認的情況下進程的一些訪問權限是沒有被使能(Enabled)的。所以我們要做的首先是使能這些權限。與此相關的一些API函數有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我們要改動一個進程的訪問令牌。首先要獲得進程訪問令牌的句柄,這能夠通過OpenProcessToken得到,函數的原型例如以下: BOOL OpenProcessToken( HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle ); 第一參數是要改動訪問權限的進程句柄。第三個參數就是返回的訪問令牌指針;第二個參數指定你要進行的操作類型。如要改動令牌我們要指定第二個參數為TOKEN_ADJUST_PRIVILEGES(其他一些參數可參考PlatformSDK)。通過這個函數我們就能夠得到當前進程的訪問令牌的句柄(指定函數的第一個參數為GetCurrentProcess()就能夠了)。接着我們能夠調用AdjustTokenPrivileges對這個訪問令牌進行改動。AdjustTokenPrivileges的原型例如以下: BOOL AdjustTokenPrivileges( HANDLE TokenHandle, // handle to token BOOL DisableAllPrivileges, // disabling option PTOKEN_PRIVILEGES NewState, // privilege information DWORD BufferLength, // size of buffer PTOKEN_PRIVILEGES PreviousState, // original state buffer PDWORD ReturnLength // required buffer size ); 第一個參數是訪問令牌的句柄。第二個參數決定是進行權限改動還是除能(Disable)全部權限;第三個參數指明要改動的權限,是一個指向TOKEN_PRIVILEGES結構的指針,該結構包括一個數組。數據組的每一個項指明了權限的類型和要進行的操作;第四個參數是結構PreviousState的長度。假設PreviousState為空,該參數應為NULL;第五個參數也是一個指向TOKEN_PRIVILEGES結構的指針,存放改動前的訪問權限的信息,可空。最后一個參數為實際PreviousState結構返回的大小。在使用這個函數前再看一下TOKEN_PRIVILEGES這個結構,其聲明例如以下: typedef struct _TOKEN_PRIVILEGES { DWORD PrivilegeCount; LUID_AND_ATTRIBUTES Privileges[]; } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; PrivilegeCount指的數組原素的個數,接着是一個LUID_AND_ATTRIBUTES類型的數組,再來看一下LUID_AND_ATTRIBUTES這個結構的內容,聲明例如以下: typedef struct _LUID_AND_ATTRIBUTES { LUID Luid; DWORD Attributes; } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES 第二個參數就指明了我們要進行的操作類型。有三個可選項:SE_PRIVILEGE_ENABLED、SE_PRIVILEGE_ENABLED_BY_DEFAULT、SE_PRIVILEGE_USED_FOR_ACCESS。

要使能一個權限就指定Attributes為SE_PRIVILEGE_ENABLED。第一個參數就是指權限的類型,是一個LUID的值,LUID就是指locallyuniqueidentifier,我想GUID大家是比較熟悉的,和GUID的要求保證全局唯一不同,LUID僅僅要保證局部唯一,就是指在系統的每一次執行期間保證是唯一的就能夠了。另外和GUID同樣的一點。LUID也是一個64位的值,相信大家都看過GUID那一大串的值。我們要怎么樣才干知道一個權限相應的LUID值是多少呢?這就要用到另外一個API函數LookupPrivilegevalue。其原形例如以下: BOOL LookupPrivilegevalue( LPCTSTR lpSystemName, // system name LPCTSTR lpName, // privilege name PLUID lpLuid // locally unique identifier ); 第一個參數是系統的名稱。假設是本地系統僅僅要指明為NULL就能夠了,第三個參數就是返回LUID的指針。第二個參數就是指明了權限的名稱,如“SeDebugPrivilege”。

在Winnt.h中還定義了一些權限名稱的宏,如: #define SE_BACKUP_NAME TEXT("SeBackupPrivilege") #define SE_RESTORE_NAME TEXT("SeRestorePrivilege") #define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege") #define SE_DEBUG_NAME TEXT("SeDebugPrivilege") 這樣通過這三個函數的調用。我們就能夠用OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID)來打獲得隨意進程的句柄。而且指定了全部的訪問權。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM