獲得任意程序的控制代碼

2021-05-25 21:34:30 字數 3187 閱讀 9854

要對乙個任意程序(包括系統安全程序和服務程序)進行指定了寫相關的訪問權的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     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)來打獲得任意程序的控制代碼,並且指定了所有的訪問權。

通過程序號ID獲得視窗的控制代碼

2012年 09月 05日 通過程序號的id獲得視窗的控制代碼 最近幾天,工作的需要,打算實現將別人編譯好的exe程式,通過自己的程式去呼叫,然後根據程式中得到的id號,去得到此程序執行建立的視窗控制代碼,在網上搜了一段時間,得到了不少啟示,再結合自己的實際環境,整合出了以下三種方法,以下將針對每一...

通過程序號ID獲得視窗的控制代碼

通過程序號的id獲得視窗的控制代碼 最近幾天,工作的需要,打算實現將別人編譯好的exe程式,通過自己的程式去呼叫,然後根據程式中得到的id號,去得到此程序執行建立的視窗控制代碼,在網上搜了一段時間,得到了不少啟示,再結合自己的實際環境,整合出了以下三種方法,以下將針對每一種方法做出簡單的介紹同時給出...

視窗控制代碼,程序ID,程序控制代碼,視窗與程序之間的關係

在windows或linux等作業系統下視窗控制代碼對應著每個視窗的鑰匙,例如,你要對某乙個視窗進行操作,你必須知道你要操作哪乙個視窗,這裡就拿windows做舉例,windows下幾乎會建立許許多多個視窗,但是我們怎麼知道我們操作的是哪個視窗?答 就是視窗控制代碼,每個視窗在被建立出來之後就會被賦...