日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

《Undocumented Windows 2000 Secrets》翻譯 --- 3( 五 )


調(diào)整進(jìn)程特權(quán)
回憶一下稍早討論過的有關(guān)EnumProcessModules所需的進(jìn)程句柄 。通常,你首先得到的是進(jìn)程ID---可能是EnumProcesses返回的進(jìn)程ID集中的一個(gè) 。Win32 API OpenProcess()可通過進(jìn)程ID來獲取其句柄 。這個(gè)函數(shù)期望一個(gè)訪問標(biāo)志符作為其第一個(gè)參數(shù) 。假定進(jìn)程ID存放在一個(gè)DWORD類型的變量dId中,你以最大訪問權(quán)限來調(diào)用OpenProcess,如下:
OpenProcess(PROCESS_ALL_ACCESS,F(xiàn)ALSE,dId)
以獲取該進(jìn)程的句柄,此時(shí)你會收到一個(gè)針對幾個(gè)低ID進(jìn)程的錯(cuò)誤代碼 。這并不是bug---這是安全特性!這些進(jìn)程都是保持系統(tǒng)活動(dòng)的系統(tǒng)服務(wù) 。一個(gè)普通用戶進(jìn)程不允許執(zhí)行針對系統(tǒng)服務(wù)的所有操作 。例如,允許所有進(jìn)程都可以殺死系統(tǒng)中其余進(jìn)程并不是個(gè)好主意 。如果一個(gè)程序意外終止了一個(gè)系統(tǒng)服務(wù),那么整個(gè)系統(tǒng)都將崩潰 。因此,一個(gè)進(jìn)程只有擁有確切的訪問權(quán)限才會有適當(dāng)?shù)奶貦?quán) 。
由于多種原因,調(diào)試器必須擁有大量的權(quán)限來完成他的工作 。改變進(jìn)程的特權(quán)可通過以下三個(gè)簡單的基本步驟:
1.首先,必須打開進(jìn)程的訪問令牌(access token),使用advapi32.dll中的函數(shù)OpenProcessToken() 。
2.如果上一步正確完成,接下來就是準(zhǔn)備TOKEN_PRIVILEGES結(jié)構(gòu),該結(jié)構(gòu)包含有關(guān)要請求的特權(quán)的信息 。這個(gè)工作需要advapi32.dll中的另一個(gè)函數(shù)LookupPrivilegeValue()的幫助 。特權(quán)通過名稱來指定 。SDK文檔winnt.h定義了27中特權(quán)名稱和其對應(yīng)的符號名稱 。例如,調(diào)試權(quán)限的符號名稱為:SE_DEBUG_NAME,該名稱和字符串“SeDebugPrivilege”等效 。
3.如果上一步正確完成,就可以使用進(jìn)程的令牌句柄(Token Handle)來調(diào)用AdjustTokenPrivileges()函數(shù)以初始化TOKEN_PRIVILEGES結(jié)構(gòu) 。該函數(shù)也是advapi32.dll導(dǎo)出的 。
如果OpenProcessToken()調(diào)用成功,要記得關(guān)閉其返回的令牌句柄(Token Handle) 。w2k_dbg.dll包含一個(gè)dbgPrivilegeSet()函數(shù),該函數(shù)合并了這幾個(gè)步驟,下面的列表1-8列出了該函數(shù)和w2k_dbg.dll中的另一個(gè)函數(shù):dbgPrivilegeDebug() 。此函數(shù)是dbgPrivilegeSet()的一個(gè)外包函數(shù),為了便于設(shè)定調(diào)試特權(quán) 。順便說一下,Windows NT Server資源工具集中的kill.exe也使用了同樣的技巧 。Kill.exe需要調(diào)試特權(quán)來剔除內(nèi)存中餓死的服務(wù)(starved services) 。這是NT Server管理員不可缺少的一個(gè)工具,這對于重起一個(gè)掛掉的系統(tǒng)服務(wù)十分有用,而且可以避免不必要的系統(tǒng)重啟 。對于使用IIS(Internet Information Server)的人,在他們的緊急工具箱中可能都有這個(gè)工具,以便重起偶爾掛掉的inerinfo.exe 。
BOOL WINAPI dbgPrivilegeSet(PWORD pwName)
{
HANDLEhToken;
TOKEN_PRIVILEGES tp;
BOOL;;fOk = FALSE;
if ( (pwName != NULL) &&
OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES,
&hToken) )
{
if ( LookupPrivilegeValue(NULL,pwName,&tp,Privileges->Luid) )
{
;;;;tp.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
tp.PrivilegeCount = 1;
fOk = AdjustTokenPrivileges(hToken,FALSE,&tp,0,NULL,NULL)
; && (GetLastError() == ERROR_SUCCESS);
}
CloseHandle(hToken);
}
return fOk;
}
//------------------------------------------------------------------------------------
BOOL WINAPI dbgPrivilegeDebug(void)
{
return dbgPrivilegeSet(SE_DEBGU_NAME);
}
列表1-8; Requesting a Privilege for a Process

推薦閱讀