LuidView就是指locally unique identifier,我想GUID大家是比較熟悉的,和GUID的要求保證全局唯一不同,LUID只要保證局部唯一,就是指在系統(tǒng)的每一次運行期間保證是唯一的就可以了。有時候需要給系統(tǒng)提權(quán)就要用到這款軟件。
提權(quán)原理:
windows的每個用戶登錄系統(tǒng)后,系統(tǒng)會產(chǎn)生一個訪問令牌(access token),其中關(guān)聯(lián)了當前用戶的權(quán)限信息,用戶登錄后創(chuàng)建的每一個進程都含有用戶access token的拷貝,當進程試圖執(zhí)行某些需要特殊權(quán)限的操作或是訪問受保護的內(nèi)核對象時,系統(tǒng)會檢查其acess token中的權(quán)限信息以決定是否授權(quán)操作。Administrator組成員的access token中會含有一些可以執(zhí)行系統(tǒng)級操作的特權(quán)(privileges),如終止任意進程、關(guān)閉/重啟系統(tǒng)、加載設(shè)備驅(qū)動和更改系統(tǒng)時間等(這里的特權(quán)和UAC中的不一樣,UAC主要是讀寫一些敏感的文件等,安裝程序等,這些是管理員權(quán)限,繞過UAC主要是不彈出那個提示框;這里的這些特權(quán)即使是管理員權(quán)限也需要調(diào)用代碼獲取(或者叫開啟),像一些注入里,經(jīng)常會用到這些特權(quán)提升代碼),不過這些特權(quán)默認是被禁用的,當Administrator組成員創(chuàng)建的進程中包含一些需要特權(quán)的操作時,進程必須首先打開這些禁用的特權(quán)以提升自己的權(quán)限,否則系統(tǒng)將拒絕進程的操作。注意,(貌似win7以后)非Administrator組成員創(chuàng)建的進程無法提升自身的權(quán)限,因此下面提到的進程均指Administrator組成員創(chuàng)建的進程。
Windows以字符串的形式表示系統(tǒng)特權(quán),如“SeCreatePagefilePrivilege”表示該特權(quán)用于創(chuàng)建頁面文件,“SeDebugPrivilege”表示該特權(quán)可用于調(diào)試及更改其它進程的內(nèi)存,為了便于在代碼中引用這些字符串,微軟在winnt.h中定義了一組宏,如 #define SE_DEBUG_NAME TEXT("SeDebugPrivilege")。
軟件相關(guān):
LUID就是指locally unique identifier,我想GUID大家是比較熟悉的,和GUID的要求保證全局唯一不同,LUID只要保證局部唯一,就是指在系統(tǒng)的每一次運行期間保證是唯一的就可以了。
另外和GUID相同的一點,LUID也是一個64位的值,相信大家都看過GUID那一大串的值,我們要怎么樣才能知道一個權(quán)限對應的LUID值是多少呢?這就要用到另外一個API函數(shù)LookupPrivilegevalue,其原形如下:
BOOL LookupPrivilegevalue(
LPCTSTR lpSystemName, // system name
LPCTSTR lpName, // privilege name
PLUID lpLuid // locally unique identifier
);
第一個參數(shù)是系統(tǒng)的名稱,如果是本地系統(tǒng)只要指明為NULL就可以了,第三個參數(shù)就是返回LUID的指針,第二個參數(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")