1. 程式人生 > >Windows 調用OpenProcess失敗

Windows 調用OpenProcess失敗

adp led 訪問權限 urn nat eof sum windows ttr

OpenProcess 打開|獲得進程句柄

函數原型:
HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)

參數說明:
1、dwDesiredAccess:想擁有的該進程訪問權限
PROCESS_ALL_ACCESS  //所有能獲得的權限
PROCESS_CREATE_PROCESS  //需要創建一個進程
PROCESS_CREATE_THREAD   //需要創建一個線程
PROCESS_DUP_HANDLE      //重復使用DuplicateHandle句柄
PROCESS_QUERY_INFORMATION   //獲得進程信息的權限,如它的退出代碼、優先級
PROCESS_QUERY_LIMITED_INFORMATION  /*獲得某些信息的權限,如果獲得了PROCESS_QUERY_INFORMATION,也擁有PROCESS_QUERY_LIMITED_INFORMATION權限*/
PROCESS_SET_INFORMATION    //設置某些信息的權限,如進程優先級
PROCESS_SET_QUOTA          //設置內存限制的權限,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME     //暫停或恢復進程的權限
PROCESS_TERMINATE          //終止一個進程的權限,使用TerminateProcess
PROCESS_VM_OPERATION       //操作進程內存空間的權限(可用VirtualProtectEx和WriteProcessMemory) 
PROCESS_VM_READ            //讀取進程內存空間的權限,可使用ReadProcessMemory
PROCESS_VM_WRITE           //讀取進程內存空間的權限,可使用WriteProcessMemory
SYNCHRONIZE                //等待進程終止

2、bInheritHandle:表示所得到的進程句柄是否可以被繼承

3、dwProcessId:被打開進程的PID

返回值:
如果函數調用成功將返回一個進程句柄值,否則將返回NULL

註意:在使用完所獲得的進程句柄後一定要調用CloseHandle(handle)來關閉進程的句柄。

      使用的例子在前面的文章中已經寫出了。在使用此函數時會發現不能成功獲得有些系統進程的句柄,原因是沒有權限。解決辦法是在調用此函數前讓我們的進程得到SeDebugPrivilege權限。

  

服務方式程序時,程序的創建者為SYSTEM用戶;非SYSTEM用戶調用OpenProcess訪問該服務程序時,調用失敗,GetLastError返回5

調用下面的函數提權,即可解決。(若有其他方案,歡迎補充)

void enableDebugPriv()
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        
return; } if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) { CloseHandle(hToken); return; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = sedebugnameValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof
tkp, NULL, NULL)) { CloseHandle(hToken); return; } }

Windows 調用OpenProcess失敗