• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            微塵--KeepMoving

            為了忘卻的記憶
            posts - 3, comments - 2, trackbacks - 0, articles - 13
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            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(其它一些參數可參考Platform SDK)。通過這個函數我們就可以得到當前進程的訪問令牌的句柄(指定函數的第一個參數為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就是指locally unique identifier,我想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)來打獲得任意進程的句柄,并且指定了所有的訪問權。

            ==微塵附加:完整源代碼, 出自Windows核心編程
            BOOL EnableDebugPrivilege(BOOL bEnable)
            {
                  //Enabling the debug privilege allows the application to see
                  //information about service application
                 BOOL fOK = FALSE;     //Assume function fails
                 HANDLE hToken;
                 //Try to open this process's acess token
                 if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
                {
                     //Attempt to modify the "Debug" privilege
                     TOKEN_PRIVILEGES tp;
                     tp.PrivilegeCount = 1;
                     LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
                     tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
                    AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
                    fOk  = (GetLastError() ==  ERROR_SUCESS);
                    CloseHandle(hToken);
               }
               return fOk;
            }
                }
            精品午夜久久福利大片| 国产精品久久婷婷六月丁香| 久久天天躁狠狠躁夜夜96流白浆| 久久亚洲精品人成综合网| 91精品国产综合久久四虎久久无码一级| 久久夜色精品国产亚洲| 亚洲国产天堂久久综合| 99久久99久久久精品齐齐| 欧美久久久久久午夜精品| 久久婷婷五月综合国产尤物app| 久久无码人妻一区二区三区| 国产亚洲色婷婷久久99精品91| 伊人久久大香线焦AV综合影院| 国产精品久久亚洲不卡动漫| 久久婷婷午色综合夜啪| 久久精品这里热有精品| 久久综合久久自在自线精品自 | 欧洲国产伦久久久久久久| 一本色道久久综合狠狠躁| 久久伊人亚洲AV无码网站| 国产成人无码久久久精品一| 中文字幕无码久久久| 色综合久久久久网| 91精品国产色综合久久| 久久人人爽人人爽人人片av麻烦| 久久se精品一区二区影院| 国产精品久久久久9999| 久久久久无码精品国产不卡| 欧美日韩久久中文字幕| 久久久久亚洲av成人无码电影| 亚洲国产成人久久综合一| 欧美亚洲色综久久精品国产| 国产精品久久久久免费a∨| 久久国产热这里只有精品| 国内精品久久久久久久久电影网| 国产精品久久国产精麻豆99网站| 久久夜色精品国产网站| 97精品伊人久久久大香线蕉| 成人午夜精品无码区久久| 久久精品中文无码资源站| 久久精品国产亚洲AV蜜臀色欲 |