通過OpenProcess(PROCESS_ALL_ACCESS,FALSE,dId)獲取ID較低進程的句柄時可能會得到錯誤代碼,這些進程都是保持系統活動的系統服務。一個普通用戶進程不允許執行針對系統服務的所有操作。如果一個程序意外終止了一個系統服務,那麼整個系統都將崩潰。因此,一個進程只有擁有確切的訪問權限才會有適當的特權 。
由於多種原因,調試器必須擁有大量的權限來完成他的工作。改變進程的特權可以通過以下三個簡單的基本步驟:
1.首先,必須打開進程的訪問令牌(accesstoken),使用advapi32.dll中的函數OpenProcessToken()。
2.如果上一步正確完成,接下來就是准備TOKEN_PRIVILEGES結構,該結構包含有關要請求的特權的信息。這個工作需要advapi32.dll中的另一個函數LookupPrivilegeValue()的幫助。特權通過名稱來指定。SDK文檔winnt.h定義了27中特權名稱和其對應的符號名稱。例如,調試權限的符號名稱為:SE_DEBUG_NAME,該名稱和字符串“SeDebugPrivilege”等效。
3.如果上一步正確完成,就可以使用進程的令牌句柄(TokenHandle)來調用AdjustTokenPrivileges()函數以初始化TOKEN_PRIVILEGES結構。該函數也是advapi32.dll導出的。
4.如果OpenProcessToken()調用成功,要記得關閉其返回的令牌句柄(TokenHandle)。w2k_dbg.dll包含一個dbgPrivilegeSet()函數,該函數合並了這幾個步驟,還有w2k_dbg.dll中的另一個函數:dbgPrivilegeDebug()。此函數是dbgPrivilegeSet()的一個外包函數,為了便於設定調試特權。