程序系統許可權的提公升

2021-06-01 03:07:45 字數 4784 閱讀 5078

要對乙個任意程序(包括系統安全程序和服務程序)進行指定了寫相關的訪問權的openprocess操作,只要當前程序具有sededebug許可權就可以了。要是乙個使用者是administrator或是被給予了相應的許可權,就可以具有該許可權。可是,就算我們用administrator帳號對乙個系統安全程序執行openprocess(process_all_access,false, dwprocessid)還是會遇到「訪問拒絕」的錯誤。什麼原因呢?原來在預設的情況下程序的一些訪問許可權是沒有被使能(enabled)的,所以我們要做的首先是使能這些許可權。與此相關的一些api函式有openprocesstoken、lookupprivilegevalue、adjusttokenprivileges。我們要修改乙個程序的訪問令牌,首先要獲得程序訪問令牌的控制代碼,這可以通過openprocesstoken得到,函式的原型如下:

bool openprocesstoken(

__in handle processhandle, //要修改訪問許可權的程序控制代碼

__in dword desiredaccess, //指定你要進行的操作型別

__out 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 token_privileges, *ptoken_privileges;

privilegecount指的陣列元素的個數,接著是乙個luid_and_attributes型別的陣列,再來看一下luid_and_attributes這個結構的內容,宣告如下:

typedef struct _luid_and_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)來打獲得任意程序的控制代碼,並且指定了所有的訪問權

一次關機和重啟動函式initiatesystemshutdown: (便於理解下面的例項:)

sclosed,freboot)

引數:lpszmachinename

指定以mull終止的用來指定要關機的網路名稱的字串。如果lpszmachinename為null,

或指向乙個空串,則該函式關掉本地計算機。

lpszmessage

指向乙個以mull終止的指定要顯示在關機對話方塊中的訊息的字串。如果不需要訊息,

該引數可以為null。

dwtimeout

指定對話方塊應該顯示的時間(按秒計)。在此對話方塊顯示期間,可通過呼叫abortsyste

mshutdown函式將關機停止。

如果dwtimeout不為零,則initiatesystemshutdown在指定的計算機上顯示的乙個對

話框。該對話方塊顯示呼叫此函式的使用者名稱,顯示由lpszmessage引數指定的訊息,並提示

使用者退出系統。當對話方塊被建立時發出嘟嘟聲,並保持位於系統中其它視窗的上面。此

對話方塊可以被移動,但不能被關閉。定時器倒記在強制關機之前剩餘的時間。如果使用者

退出系統,系統立即關閉。否則,當定時器到時間計算機才關機。

如果dwtimeout為零時,計算機關機,但不顯示此對話方塊,並且不能用abortsystem

shutdown函式來停止關機。

指定對變化未做儲存的應用程式是否被強制關閉。如果這個引數為true,則這樣的

應用程式被關閉。如果這個引數為false,則顯示乙個對話方塊以提示使用者關閉這些應用程

序。 freboot

指定計算機關機之後是否立即重啟。如果這個引數為true,則計算機重啟。如果這

個引數為false,則系統將所有快取記憶體重新整理到磁碟上,清除螢幕,並且顯示一條訊息,

指示關掉電源是安全的。

返回值:如果函式成功,則返回值為true;否則,返回值為false。要獲得擴充套件錯誤資訊

,可使用getlasterror函式。

注釋:要關掉本地計算機,呼叫程序必須具有se_shutdown_name特權。要關掉一台遠端

計算機,呼叫程序必須對此遠端計算機具有的se_remote_shutdown_name特權。預設情況

下,使用者具有對他們所有登入計算機的se_shutdown_name特權,管理員具有對遠端計算

機的se_remote_shutdown_name特權。

根據上面的內容,可獲得如下的應用:

bool fresult;

token_privileges tkp;

handle htoken;

if (!openprocesstoken(getcurrentprocess(),token_adjust_privileges | token_query,&htoken))

lookupprivilegevalue(null, se_shutdown_name,&tkp.privileges[0].luid); //獲得本地機唯一的標識

tkp.privilegecount = 1;

tkp.privileges[0].attributes = se_privilege_enabled;

adjusttokenprivileges(htoken, false, &tkp, 0,(ptoken_privileges) null, 0); //調整獲得的許可權

if (getlasterror() != error_success)

fresult =initiatesystemshutdown(

null, // 要關的計算機使用者名

"由於系統不穩定,windows將在上面的時間內關機,請做好儲存工作!", // 顯示訊息

0, // 關機所需的時間

false, // 是否提示使用者

false); //設為true為重起,設為false為關機

文章源於:

C 如何提公升程序許可權

getcurrentprocessid 得到當前程序的id openprocesstoken 得到程序的令牌控制代碼 lookupprivilegevalue 查詢程序的許可權 adjusttokenprivileges 修改 要對乙個任意程序 包括系統安全程序和服務程序 進行指定了寫相關的訪問權的...

對當前程序進行提公升許可權

對於程序提公升許可權主要用到下面三個api openprocesstoken 開啟許可權令牌 lookupprivilegevalue 檢索乙個唯一的本地識別符號 luid adjusttokenprivileges 調整令牌特權 bool openprocesstoken handle proce...

RHCSA 系統許可權,許可權委派,程序管理

程序管理 1.bsd的命令格式 ps aux 瞬間的情況 ps aux more 分頁檢視百分比 user 程序由哪個使用者產生的 pid 程序id號 cpu 程序占用cpu的資源百分比,占用越高 程序越耗費資源 mem 該程序占用物理記憶體的百分比,占用越高,程序越耗費資源 vsz 該程序占用虛擬...