關於程序訪問令牌 access token

2021-09-30 05:50:53 字數 2589 閱讀 7480

訪問令牌是乙個被保護的物件,包含了與使用者帳戶相關的辨識和特權資訊。當使用者登陸到一台windows計算機,登陸程序會驗證使用者的登陸憑據。成功後,登陸程序返回乙個對應使用者的sid和乙個使用者的安全組sid列表。計算機lsa使用這些資訊建立乙個訪問令牌(主訪問令牌)。該訪問令牌包括了由登入程序返回的sids和乙份由本地安全策略分發給使用者以及使用者安全組的特權列表。此後,這份訪問令牌的拷貝會跟每個代表使用者執行的執行緒和程序鏈結。

如果拿到訪問令牌,登入成功,要是訪問某台本域內計算機的共享資源時,則必須出示訪問令牌。從而來決定將擁有何種許可權來訪問。

在使用openprocess()函式開啟乙個程序時,通常是沒有許可權的,這時就需要設定程序訪問令牌,更改程序的許可權。

我們要修改乙個程序的訪問令牌,首先要獲得程序訪問令牌的控制代碼,這可以通過 openprocesstoken得到,函式的原型如下:

bool openprocesstoken(

handle processhandle,

dword desiredaccess,

phandle tokenhandle

);第一引數是要修改訪問許可權的程序控制代碼;第三個引數就是返回的訪問令牌指標;第二個引數指定你要進行的操作型別,如要修改令牌我們要指定第二個引數為token_adjust_privileges(其它一些引數可參考platform sdk)。通過這個函式我們就可以得到當前程序的訪問令牌的控制代碼(指定函式的第乙個引數為getcurrentprocess()就可以了)。

要修改程序的什麼許可權?通過函式lookupprivilegevalue()設定

bool lookupprivilegevalue(

lpctstr lpsystemname, // system name

lpctstr lpname, // privilege name

pluid lpluid // locally unique identifier

);第乙個引數是系統的名稱,如果是本地系統只要指明為null就可以了,第三個引數就是返回luid的指標,第二個引數就是指明了許可權的名稱,如「sedebugprivilege」(winnt.h有詳細定義),如果要對乙個任意程序進行指定了寫相關的訪問許可權,設為"sededebug"許可權就可以了。

typedef struct _token_privileges token_privileges

該結構包含乙個陣列,資料組的每個項指明了許可權的型別和要進行的操作,privilegecount指的陣列元素的個數,接著是乙個luid_and_attributes型別的陣列,再來看一下luid_and_attributes這個結構的內容,宣告如下:

typedef struct _luid_and_attributes luid_and_attributes, *pluid_and_attributes

第乙個引數就是指許可權的型別,是乙個luid的值,luid就是指locally unique identifier,保證區域性唯一,就是指在系統的每一次執行期間保證是唯一的就可以了。這個就是lookupprivilegevalue()返回的值。第二個引數就指明了我們要進行的操作型別,有3個可選項: se_privilege_enabled、se_privilege_enabled_by_default、se_privilege_used_for_access。

最後,呼叫adjusttokenprivileges對這個訪問令牌進行修改。adjusttokenprivileges的原型如下:

bool adjusttokenprivileges(

handle tokenhandle, 

bool disableallprivileges, 

ptoken_privileges newstate, 

dword bufferlength, 

ptoken_privileges previousstate, 

pdword returnlength

);第乙個引數是訪問令牌的控制代碼(openprocesstoken()返回的),第二個引數決定是進行許可權修改還是disable所有許可權;第三個引數指明要修改的許可權,是乙個指向 token_privileges結構的指標; 第四個引數是結構newstates的長度,如果newstate為空,該引數應為null;第五個引數也是乙個指向 token_privileges結構的指標,存放修改前的訪問許可權的資訊,可空;最後乙個引數為實際previousstate結構返回的大小。

通過上述的呼叫,就可以提公升openprocess()訪問許可權了。

舉例說明,在openprocess()之前呼叫該函式。

bool enabledebugpriv()

if (!lookupprivilegevalue(null, se_debug_name, &sedebugnamevalue))

tkp.privilegecount = 1;

tkp.privileges[0].luid = sedebugnamevalue;

tkp.privileges[0].attributes = se_privilege_enabled;

if (!adjusttokenprivileges(htoken, false, &tkp, sizeof(tkp), null, null))

return true;

}

關於 RemoteViews 跨程序資源訪問的勘誤

看到 android開發藝術探索 書中 p241 頁提到remoteviews跨程序資源訪問的限制,我在跨程序的實際使用時,證實是沒有限制的,可以跨程序使用,remoteviews原始碼如下 public remoteviews string packagename,int layoutid 複製 ...

DELPHI 中如何提公升程序令牌

delphi 中如何提公升程序令牌 近一段時間在用delphi寫個程式,當我寫到乙個結束其他程序的模組的時候有時不成功,那是因為其他程序,如病毒程序的許可權高,通過常規的結束程序的函式行不通,要首先提高自身程式的許可權,再結束其他程序 在網上也看到了一些提公升程序令牌的函式但都不怎麼好用,最後我還是...

提公升程序令牌 Delphi原始碼

眾所周知,當我們要結束乙個程序時,可以呼叫windows api函式terminateprocess函式。但是,有很多程序依然還是無法結束的,這是因為程序許可權不夠,這時我們可以給程序提公升許可權再k掉k不掉的程序。一般程序獲取了sedebugprivilege許可權後都可以殺掉大部分程序了。提公升...