修改程序訪問許可權

2022-03-26 01:01:49 字數 3016 閱讀 7144

openprocesstoken  

要對乙個任意程序(包括系統安全程序和服務程序)進行指定了寫相關的訪問權的open

process操作,只要當前程序具有sededebug許可權就可以了。要是乙個使用者是administrator或

是被給予了相應的許可權,就可以具有該許可權。可是,就算我們用administrator帳號對乙個系

統安全程序執行openprocess(process_all_access,false, dwprocessid)還是會遇到「訪問

拒絕」的錯誤。什麼原因呢?原來在預設的情況下程序的一些訪問許可權是沒有被使能(enab

led)的,所以我們要做的首先是使能這些許可權。與此相關的一些api函式有openprocesstok

en、lookupprivilegevalue、adjusttokenprivileges。我們要修改乙個程序的訪問令牌,首

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

bool openprocesstoken(

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

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

phandle tokenhandle //返回的訪問令牌指標

);第一引數是要修改訪問許可權的程序控制代碼;第三個引數就是返回的訪問令牌指標;第二個

引數指定你要進行的操作型別,如要修改令牌我們要指定第二個引數為token_adjust_privi

leges(其它一些引數可參考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結構的指標,該結構

包含乙個陣列,資料組的每個項指明了許可權的型別和要進行的操作; 第四個引數是結構prev

iousstate的長度,如果previousstate為空,該引數應為null;第五個引數也是乙個指向to

ken_privileges結構的指標,存放修改前的訪問許可權的資訊,可空;最後乙個引數為實際pr

eviousstate結構返回的大小。在使用這個函式前再看一下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函式looku

pprivilegevalue,其原形如下:

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

修改基類訪問許可權

問題 我們經常擴充套件別人寫好乙個類的功能,為了防止別人錯誤地使用我們擴充套件的功能,我們需要遮蔽直接呼叫原基類的功能。例如 class base void add base pbase void remove base pbase 我們擴充套件base 的add,remove功能,在這兩個函式裡需...

修改Mysql遠端訪問許可權

解決辦法 1.首先遠端連線進入伺服器,在cmd中輸入mysql u root p,然後回車,輸入密碼後回車進入mysql命令列。2.輸入use mysql 3.輸入select user,password,host from user 可以看到host中只有localhost主機。我們需要將 也新增...

linux修改訪問許可權命令

三種許可權 讀 read 寫 write 執行 execute 涉及到的主體 檔案所有者 user 檔案所屬組 group 其他人 other chmod命令 chmod是linux unix中修改檔案或者目錄許可權的命令,通過修改許可權可以讓指定的人對檔案可讀 可寫 可執行,極大地保證了資料的安全...