windows進(jìn)程提權(quán)(C語言實(shí)現(xiàn))

問題

在枚舉/結(jié)束系統(tǒng)進(jìn)程或操作系統(tǒng)服務(wù)時(shí),會(huì)出現(xiàn)權(quán)限不足而失敗的情況,這時(shí)就需要提升自己進(jìn)程到系統(tǒng)權(quán)限

前置知識(shí)

windows的每個(gè)用戶登錄系統(tǒng)后萎津,系統(tǒng)會(huì)產(chǎn)生一個(gè)訪問令牌(access token)兆蕉,其中關(guān)聯(lián)了當(dāng)前用戶的權(quán)限信息,用戶登錄后創(chuàng)建的每一個(gè)進(jìn)程都含有用戶access token的拷貝悼枢,當(dāng)進(jìn)程試圖執(zhí)行某些需要特殊權(quán)限的操作或是訪問受保護(hù)的內(nèi)核對(duì)象時(shí),系統(tǒng)會(huì)檢查其acess token中的權(quán)限信息以決定是否授權(quán)操作。Administrator組成員的access token中會(huì)含有一些可以執(zhí)行系統(tǒng)級(jí)操作的特權(quán)(privileges) 畸冲,如終止任意進(jìn)程、關(guān)閉/重啟系統(tǒng)观腊、加載設(shè)備驅(qū)動(dòng)和更改系統(tǒng)時(shí)間等邑闲,不過這些特權(quán)默認(rèn)是被禁用的,當(dāng)Administrator組成員創(chuàng)建的進(jìn)程中包含一些需要特權(quán)的操作時(shí)梧油,進(jìn)程必須首先打開這些禁用的特權(quán)以提升自己的權(quán)限苫耸,否則系統(tǒng)將拒絕進(jìn)程的操作。注意儡陨,非Administrator組成員創(chuàng)建的進(jìn)程無法提升自身的權(quán)限褪子,因此下面提到的進(jìn)程均指Administrator組成員創(chuàng)建的進(jìn)程。(命令行輸入net user可查看或net user 具體用戶名稱)

Windows以字符串的形式表示系統(tǒng)特權(quán)骗村,如“SeCreatePagefilePrivilege”表示該特權(quán)用于創(chuàng)建頁面文件嫌褪,“SeDebugPrivilege”表示該特權(quán)可用于調(diào)試及更改其它進(jìn)程的內(nèi)存,為了便于在代碼中引用這些字符串胚股,微軟在winnt.h中定義了一組宏笼痛,如 #define SE_DEBUG_NAME TEXT("SeDebugPrivilege")。完整的特權(quán)列表可以查閱msdn的security一章信轿。雖然Windows使用字符串表示特權(quán)晃痴,但查詢或更改特權(quán)的API需要LUID來引用相應(yīng)的特權(quán)残吩,LUID表示local unique identifier,它是一個(gè)64位值倘核,在當(dāng)前系統(tǒng)中是唯一的泣侮。為了提升進(jìn)程權(quán)限到指定的特權(quán),我們必須先找到該特權(quán)對(duì)應(yīng)的LUID紧唱,這時(shí)要調(diào)用LookupPrivilegeValue函數(shù)活尊。

簡介

要對(duì)一個(gè)任意進(jìn)程(包括系統(tǒng)安全進(jìn)程和服務(wù)進(jìn)程)進(jìn)行指定了寫相關(guān)的訪問權(quán)的OpenProcess操作,只要當(dāng)前進(jìn)程具有SeDeDebug權(quán)限就可以了漏益。要是一個(gè)用戶是Administrator或是被給予了相應(yīng)的權(quán)限蛹锰,就可以具有該權(quán)限〈掳蹋可是铜犬,就算我們用Administrator帳號(hào)對(duì)一個(gè)系統(tǒng)安全進(jìn)程執(zhí)OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)還是會(huì)遇到“訪問拒絕”的錯(cuò)誤。什么原因呢轻庆?原來在默認(rèn)的情況下進(jìn)程的一些訪問權(quán)限是沒有被啟用(Enabled)的癣猾,所以我們要做的首先是啟用這些權(quán)限。

流程

1.打開進(jìn)程訪問令牌
2.取得特權(quán)的LUID值
3.調(diào)整訪問令牌特權(quán)值

使用函數(shù)

OpenProcessToken();
LookupPrivilegeValue();
AdjustTokenPrivileges();

函數(shù)介紹及大致流程

首先要獲得進(jìn)程訪問令牌的句柄余爆,這可以通過OpenProcessToken得到纷宇,函數(shù)的原型如下:

BOOL OpenProcessToken(

HANDLE ProcessHandle, //要修改訪問權(quán)限的進(jìn)程句柄

DWORD DesiredAccess, //要對(duì)令牌進(jìn)行何種操作

PHANDLE TokenHandle //返回的訪問令牌指針

);

第一參數(shù)是要修改訪問權(quán)限的進(jìn)程句柄蛾方;第三個(gè)參數(shù)就是返回的訪問令牌指針像捶;第二個(gè)參數(shù)指定你要進(jìn)行的操作類型,如要修改訪問令牌的特權(quán)桩砰,我們要指定第二個(gè)參數(shù)TOKEN_ADJUST_PRIVILEGES拓春。通過這個(gè)函數(shù)我們就可以得到當(dāng)前進(jìn)程的訪問令牌的句柄(指定函數(shù)的第一個(gè)參數(shù)為GetCurrentProcess()就可以了)。接著我們可以調(diào)用AdjustTokenPrivileges對(duì)這個(gè)訪問令牌進(jìn)行修改五芝。
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
);

第一個(gè)參數(shù)是訪問令牌的句柄痘儡;第二個(gè)參數(shù)決定是進(jìn)行權(quán)限修改還是喪失(Disable)所有權(quán)限辕万;第三個(gè)參數(shù)指明要修改的權(quán)限枢步,是一個(gè)指向TOKEN_PRIVILEGES結(jié)構(gòu)的指針,該結(jié)構(gòu)包含一個(gè)數(shù)組渐尿,數(shù)據(jù)組的每個(gè)項(xiàng)指明了權(quán)限的類型和要進(jìn)行的操作; 第四個(gè)參數(shù)是結(jié)構(gòu)PreviousState 指針?biāo)赶虻木彌_區(qū)的大小醉途,如果PreviousState參數(shù)為空,該參數(shù)應(yīng)為NULL砖茸;第五個(gè)參數(shù)也是一個(gè)指向TOKEN_PRIVILEGES結(jié)構(gòu)的指針隘擎,存放修改前的訪問權(quán)限的信息,可空凉夯;最后一個(gè)參數(shù)為實(shí)際PRIVILEGES NewState結(jié)構(gòu)返回的大小货葬。在使用這個(gè)函數(shù)前再看一下TOKEN_PRIVILEGES這個(gè)結(jié)構(gòu)采幌,其聲明如下:

typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges[];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

PrivilegeCount指的數(shù)組元素的個(gè)數(shù),接著是一個(gè)LUID_AND_ATTRIBUTES類型的數(shù)組震桶,再來看一下LUID_AND_ATTRIBUTES這個(gè)結(jié)構(gòu)的內(nèi)容休傍,聲明如下:

typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES

第二個(gè)參數(shù)就指明了我們要進(jìn)行的操作類型,其特權(quán)屬性Attributes可以是如下常量:

SE_PRIVILEGE_ENABLED //使特權(quán)有效
SE_PRIVILEGE_ENABLED_BY_DEFAULT //使特權(quán)默認(rèn)有效
SE_PRIVILEGE_REMOVED //移除該特權(quán)
SE_PRIVILEGE_USED_FOR_ACCESS //取得對(duì)象或服務(wù)的訪問權(quán)

要使用一個(gè)權(quán)限就指定Attributes為SE_PRIVILEGE_ENABLED蹲姐。第一個(gè)參數(shù)就是指權(quán)限的類型磨取,是一個(gè)LUID的值,LUID就是指locally unique identifier(局部唯一標(biāo)識(shí)符)柴墩,我想GUID大家是比較熟悉的忙厌,和GUID的要求保證全局唯一不同,LUID只要保證局部唯一江咳,就是指在系統(tǒng)的每一次運(yùn)行期間保證是唯一的就可以了逢净。另外和GUID相同的一點(diǎn),LUID也是一個(gè)64位的值歼指,相信大家都看過GUID那一大串的值汹胃,我們要怎么樣才能知道一個(gè)權(quán)限對(duì)應(yīng)的LUID值是多少呢?

這就要用到另外一個(gè)API函數(shù)LookupPrivilegevalue东臀,其原形如下:

BOOL LookupPrivilegevalue(
LPCTSTR lpSystemName, // system name
LPCTSTR lpName, // privilege name
PLUID lpLuid // locally unique identifier
);

第一個(gè)參數(shù)是系統(tǒng)的名稱着饥,如果是本地系統(tǒng)只要指明為NULL就可以了,第三個(gè)參數(shù)就是返回LUID的指針惰赋,第二個(gè)參數(shù)就是指明了權(quán)限的名稱宰掉,如“SeDebugPrivilege”。在Winnt.h中還定義了一些權(quán)限名稱的宏赁濒,如:

#define SE_BACKUP_NAME TEXT("SeBackupPrivilege")
#define SE_RESTORE_NAME TEXT("SeRestorePrivilege")
#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")
#define SE_DEBUG_NAME TEXT("SeDebugPrivilege")

這樣通過這三個(gè)函數(shù)的調(diào)用轨奄,我們就可以用OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)來打獲得任意進(jìn)程的句柄,并且指定了所有的訪問權(quán)

代碼實(shí)現(xiàn)

#include <stdio.h>
#include <windows.h>

int main(void)
{
    HANDLE token_handle;
    //打開訪問令牌
    if(!OpenProcessToken(GetCurrentProcess(),       //要修改權(quán)限的進(jìn)程句柄
                         TOKEN_ALL_ACCESS,          //要對(duì)令牌進(jìn)行何種操作
                         &token_handle              //訪問令牌
                         ))
    {
        printf("openProcessToken error");
    }

    LUID luid;
    if(!LookupPrivilegeValue(NULL,                 //查看的系統(tǒng)拒炎,本地為NULL
                             SE_DEBUG_NAME,        //要查看的特權(quán)名稱
                             &luid                 //用來接收標(biāo)識(shí)符
                             ))
    {
        printf("lookupPrivilegevalue error");
    }

    TOKEN_PRIVILEGES tkp;
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = luid;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    //調(diào)整訪問令牌權(quán)限
    if(!AdjustTokenPrivileges(token_handle,    //令牌句柄
                              FALSE,           //是否禁用權(quán)限
                              &tkp,            //新的特權(quán)的權(quán)限信息
                              sizeof(tkp),     //特權(quán)信息大小
                              NULL,            //用來接收特權(quán)信息當(dāng)前狀態(tài)的buffer
                              NULL             //緩沖區(qū)大小
                              ))
    {
        printf("adjust error");
    }

    printf("sucessful");
    return 0;
}

第五篇~~~~~~~~~~~~~~~


“長到這么大挪拟,我說不出來我最愛的一部電影,說不出我來我最愛的一首歌击你,說不出來我最愛的一個(gè)人玉组。時(shí)常覺得人生其實(shí)沒有那么有趣,偶爾也會(huì)質(zhì)疑活著的意義丁侄,所有來自書上和別人口中的意義都不曾說服過我惯雳。但今天突然覺得,大概人生中最大的意義就是用余生去找那些最愛吧鸿摇∈埃” ——德卡先生的信箱


給我點(diǎn)十個(gè)贊我就買杯可樂慶祝下


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子潮孽,更是在濱河造成了極大的恐慌揪荣,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往史,死亡現(xiàn)場離奇詭異变逃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怠堪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門揽乱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粟矿,你說我怎么就攤上這事凰棉。” “怎么了陌粹?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵撒犀,是天一觀的道長。 經(jīng)常有香客問我掏秩,道長或舞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任蒙幻,我火速辦了婚禮映凳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邮破。我一直安慰自己诈豌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布抒和。 她就那樣靜靜地躺著矫渔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摧莽。 梳的紋絲不亂的頭發(fā)上庙洼,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音镊辕,去河邊找鬼油够。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丑蛤,可吹牛的內(nèi)容都是我干的叠聋。 我是一名探鬼主播撕阎,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼受裹,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起棉饶,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤厦章,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后照藻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袜啃,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年幸缕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了群发。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡发乔,死狀恐怖熟妓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栏尚,我是刑警寧澤起愈,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站译仗,受9級(jí)特大地震影響抬虽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纵菌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一阐污、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咱圆,春花似錦疤剑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杠览,卻和暖如春弯菊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背踱阿。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工管钳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人软舌。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓才漆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佛点。 傳聞我的和親對(duì)象是個(gè)殘疾皇子醇滥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容