如何取得與 SeDebugPrivilege 的任何處理程序的控制代碼

請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。

按一下這裡查看此文章的英文版本:131065
結論
在 Microsoft Windows NT、 Microsoft Windows 2000 中和 Microsoft Windows Server 2003 中,您可以擷取系統 byenabling 中呼叫的處理程序 SeDebugPrivilege 中的任何處理程序的控制代碼。呼叫 processcan,然後呼叫 OpenProcess() Win32 API,以取得控制代碼 withPROCESS_ALL_ACCESS。
其他相關資訊
這項功能被供系統層級偵錯。Fordebugging 非系統處理程序,它並不需要授與或啟用 thisprivilege。

此特殊權限允許呼叫端的處理序,包括呼叫 TerminateProcess(),CreateRemoteThread (),theability 的所有存取及其他潛在危險的 Win32 Api,目標電腦上處理。

SeDebugPrivilege 授與使用者或群組時,則要非常小心。

範例程式碼

下列程式碼說明如何取得 SeDebugPrivilegein 順序],以取得有 PROCESS_ALL_ACCESS 的處理序的控制代碼。Thesample 的程式碼接著會呼叫結果的 processhandle 上的 TerminateProcess。
--*/ #define RTN_OK 0#define RTN_USAGE 1#define RTN_ERROR 13#include <windows.h>#include <stdio.h>BOOL SetPrivilege(    HANDLE hToken,          // token handle    LPCTSTR Privilege,      // Privilege to enable/disable    BOOL bEnablePrivilege   // TRUE to enable.  FALSE to disable    );void DisplayError(LPTSTR szAPI);int main(int argc, char *argv[]){    HANDLE hProcess;    HANDLE hToken;    int dwRetVal=RTN_OK; // assume success from main()    // show correct usage for kill    if (argc != 2)    {        fprintf(stderr,"Usage: %s [ProcessId]\n", argv[0]);        return RTN_USAGE;    }    if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))    {        if (GetLastError() == ERROR_NO_TOKEN)        {            if (!ImpersonateSelf(SecurityImpersonation))            return RTN_ERROR;            if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken)){                DisplayError("OpenThreadToken");            return RTN_ERROR;            }         }        else            return RTN_ERROR;     }    // enable SeDebugPrivilege    if(!SetPrivilege(hToken, SE_DEBUG_NAME, TRUE))    {        DisplayError("SetPrivilege");        // close token handle        CloseHandle(hToken);        // indicate failure        return RTN_ERROR;    }   // open the process    if((hProcess = OpenProcess(            PROCESS_ALL_ACCESS,            FALSE,            atoi(argv[1]) // PID from commandline            )) == NULL)    {        DisplayError("OpenProcess");        return RTN_ERROR;    }    // disable SeDebugPrivilege    SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);    if(!TerminateProcess(hProcess, 0xffffffff))    {        DisplayError("TerminateProcess");        dwRetVal=RTN_ERROR;    }    // close handles    CloseHandle(hToken);    CloseHandle(hProcess);    return dwRetVal;}BOOL SetPrivilege(    HANDLE hToken,          // token handle    LPCTSTR Privilege,      // Privilege to enable/disable    BOOL bEnablePrivilege   // TRUE to enable.  FALSE to disable    ){    TOKEN_PRIVILEGES tp;    LUID luid;    TOKEN_PRIVILEGES tpPrevious;    DWORD cbPrevious=sizeof(TOKEN_PRIVILEGES);    if(!LookupPrivilegeValue( NULL, Privilege, &luid )) return FALSE;    //     // first pass.  get current privilege setting    //     tp.PrivilegeCount           = 1;    tp.Privileges[0].Luid       = luid;    tp.Privileges[0].Attributes = 0;    AdjustTokenPrivileges(            hToken,            FALSE,            &tp,            sizeof(TOKEN_PRIVILEGES),            &tpPrevious,            &cbPrevious            );    if (GetLastError() != ERROR_SUCCESS) return FALSE;    //     // second pass.  set privilege based on previous setting    //     tpPrevious.PrivilegeCount       = 1;    tpPrevious.Privileges[0].Luid   = luid;    if(bEnablePrivilege) {        tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);    }    else {        tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED &            tpPrevious.Privileges[0].Attributes);    }    AdjustTokenPrivileges(            hToken,            FALSE,            &tpPrevious,            cbPrevious,            NULL,            NULL            );    if (GetLastError() != ERROR_SUCCESS) return FALSE;    return TRUE;}BOOL SetPrivilege( 	HANDLE hToken,  // token handle 	LPCTSTR Privilege,  // Privilege to enable/disable 	BOOL bEnablePrivilege  // TRUE to enable. FALSE to disable ) { 	TOKEN_PRIVILEGES tp = { 0 }; 	// Initialize everything to zero 	LUID luid; 	DWORD cb=sizeof(TOKEN_PRIVILEGES); 	if(!LookupPrivilegeValue( NULL, Privilege, &luid ))		return FALSE; 	tp.PrivilegeCount = 1; 	tp.Privileges[0].Luid = luid; 	if(bEnablePrivilege) { 		tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 	} else { 		tp.Privileges[0].Attributes = 0; 	} 	AdjustTokenPrivileges( hToken, FALSE, &tp, cb, NULL, NULL ); 	if (GetLastError() != ERROR_SUCCESS) 		return FALSE; 	return TRUE;}void DisplayError(    LPTSTR szAPI    // pointer to failed API name    ){    LPTSTR MessageBuffer;    DWORD dwBufferLength;    fprintf(stderr,"%s() error!\n", szAPI);    if(dwBufferLength=FormatMessage(                FORMAT_MESSAGE_ALLOCATE_BUFFER |                FORMAT_MESSAGE_FROM_SYSTEM,                NULL,                GetLastError(),                GetSystemDefaultLangID(),                (LPTSTR) &MessageBuffer,                0,                NULL                ))    {        DWORD dwBytesWritten;        //         // Output message string on stderr        //         WriteFile(                GetStdHandle(STD_ERROR_HANDLE),                MessageBuffer,                dwBufferLength,                &dwBytesWritten,                NULL                );        //         // free the buffer allocated by the system        //         LocalFree(MessageBuffer);    }}				
3.10 3.50 OpenProcess TerminateProcess

警告:本文為自動翻譯

內容

文章識別碼:131065 - 最後檢閱時間:09/27/2015 04:43:00 - 修訂: 6.0

Microsoft Win32 Application Programming Interface

  • kbbug kbdebug kbhowto kbkernbase kbsecurity kbmt KB131065 KbMtzh
意見反應